小编Rhy*_*ren的帖子

使用 GDB 调试段寄存器 FS

我正在尝试在使用 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)

assembly gdb

6
推荐指数
0
解决办法
1133
查看次数

标签 统计

assembly ×1

gdb ×1