代码之家  ›  专栏  ›  技术社区  ›  Moshe Siman-Tov

在lldb中将寄存器值设置为NSString

  •  1
  • Moshe Siman-Tov  · 技术社区  · 8 年前

    (lldb) register read
    General Purpose Registers:
           rax = 0x0000000000000000
           rbx = 0x0000000000000000
           rcx = 0x0000000000007d0b
           rdx = 0x00007fffb6e40860  @"Helvetica"
    

    现在,我试图以多种方式更改其值-我试图在“expression”中创建一个NSString对象,并将其设置为$rdx:

    (lldb) expression
    Enter expressions, then terminate with an empty line to evaluate:
      1: NSString *abc=@"Times"; 
      2: $rdx=abc;
    error: assigning to 'unsigned long' from incompatible type 'NSString *'
    

    (lldb) expression
    Enter expressions, then terminate with an empty line to evaluate:
      1: NSString *abc=@"Times"; 
      2: $rdx=(unsigned long)&abc; 
    (unsigned long) $110 = 123145406123008
    

    现在,寄存器读取仅显示指针值,而不是NSString值

    (lldb) register read 
    General Purpose Registers:
           rax = 0x0000000000000000
           rbx = 0x0000000000000000
           rcx = 0x0000000000007d0b
           rdx = 0x000070000e275d00
    

    现在我知道我遗漏了一些东西,因为rdx的初始值指向NSString(0x00007fffb6e40860)-当从内存中读取它时,它指向另一个指针(7fffb3d721b8,它指向垃圾数据…)

    (lldb) memory read 0x00007fffb6e40860
    0x7fffb6e40860: b8 21 d7 b3 ff 7f 00 00 c8 07 00 00 00 00 00 00  ?!׳?...?.......
    

    在将rdx分配给NSString指针后读取值时,它确实会显示字符串值:

    (lldb) memory read 0x000070000f8a3d00
    0x70000f8a3d00: 55 54 69 6d 65 73 00 00 00 00 00 00 00 00 00 00  UTimes..........
    

    如果不够清楚,我的目标是设置rdx,这样它会显示如下内容:

    (lldb) register read
    General Purpose Registers:
           rax = 0x0000000000000000
           rbx = 0x0000000000000000
           rcx = 0x0000000000007d0b
           rdx = 0x00007fffb6e40860  @"Times"
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   Sozin's Comet    8 年前

    您有两种选择:

    创建字符串,获取对它的引用,然后使用 register write

    (lldb) p/x @"hello world"
    (__NSCFString *) $0 = 0x00006000002232a0 @"hello world"
    (lldb) register write rdx 0x00006000002232a0
    (lldb) p/x $rdx
    (unsigned long) $1 = 0x00006000002232a0
    (lldb) po $rdx 
    hello world
    

    或者,也可以使用expression命令:

    (lldb) p/x @"goodbye world"
    (__NSCFString *) $1 = 0x0000604000423000 @"goodbye world"
    (lldb) po $rdx = 0x0000600000223220
    goodbye world
    
    (lldb) po $rdx
    goodbye world