使用 GDB 调试段寄存器 FS

Rhy*_*ren 6 assembly gdb

我正在尝试在使用 C 中共享库的应用程序中使用 GDB 调试堆栈问题。这实际上是在 C 中编译为共享库的 GO 代码,但它因“fatal: morestack on g0”错误而失败. 我目前正在故障点调试汇编代码,但我对以下语句的解释方式有疑问:

cmp %rsi,%fs:(%rcx)

,我知道这是将RSI寄存器中的内容与FS和RCX定义的偏移量中的内容进行比较。根据我的调查:

%fs:(%rcx) == 由(FS 中的值 + RCX 中的值)定义的地址处的值

,但我不知道这是否完全正确以及如何使用 GBD 获得实际值。

我正在尝试获取正在比较的值,以查看是否有任何内容可以了解导致失败的原因。

这是我在故障点调试的代码:

  0x00007f1b5cdfb840 <+0>: mov    0x331721(%rip),%rcx        # 
  0x7f1b5d12cf68
  0x00007f1b5cdfb847 <+7>: mov    %fs:(%rcx),%rbx
  0x00007f1b5cdfb84b <+11>:    mov    0x30(%rbx),%rbx
  0x00007f1b5cdfb84f <+15>:    mov    (%rbx),%rsi
  0x00007f1b5cdfb852 <+18>:    cmp    %rsi,%fs:(%rcx)
  0x00007f1b5cdfb856 <+22>:    jne    0x7f1b5cdfb862 <runtime.morestack+34>
=> 0x00007f1b5cdfb858 <+24>:    callq  0x7f1b5cdd5e10 <runtime.badmorestackg0>
  0x00007f1b5cdfb85d <+29>:    callq  0x7f1b5cdfd1d0 <runtime.abort>
  0x00007f1b5cdfb862 <+34>:    mov    0x50(%rbx),%rsi
  0x00007f1b5cdfb866 <+38>:    cmp    %rsi,%fs:(%rcx)
Run Code Online (Sandbox Code Playgroud)

这是当时的寄存器值:

   (gdb) info r
rax            0xc000000600 824633722368
rbx            0xc000064000 824634130432
rcx            0xfffffffffffff5c0   -2624
rdx            0xc000072b88 824634190728
rsi            0xc000000480 824633721984
rdi            0x7f1b5cdf9f80   139755499003776
rbp            0xc000072bb8 0xc000072bb8
rsp            0x7f1b517fdac8   0x7f1b517fdac8
r8             0x0  0
r9             0xc000016570 824633812336
r10            0xc0000166d0 824633812688
r11            0x63451e0    104092128
r12            0x604d7b0    100980656
r13            0x0  0
r14            0x55b6fd0    89878480
r15            0x6059160    101028192
rip            0x7f1b5cdfb858   0x7f1b5cdfb858 <runtime.morestack+24>
eflags         0x246    [ PF ZF IF ]
cs             0x33 51
ss             0x2b 43
ds             0x0  0
es             0x0  0
fs             0x0  0
gs             0x0  0
Run Code Online (Sandbox Code Playgroud)

我不认为我需要读取的内存地址是 0 + 0xfffffffffffff5c0,因为读取返回错误。

任何建议都非常受欢迎。