我正在尝试在使用 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,因为读取返回错误。
任何建议都非常受欢迎。