我正在尝试在使用 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 …Run Code Online (Sandbox Code Playgroud)