理解gdb`where`命令的输出
我正在调试以下程序(正确) 我在阶乘函数上设置了一个断点,并继续了两次。检查%rsp的值,我发现它是理解gdb`where`命令的输出,gdb,x86-64,Gdb,X86 64,我正在调试以下程序(正确) 我在阶乘函数上设置了一个断点,并继续了两次。检查%rsp的值,我发现它是 (gdb) print/$rsp $1 = 0x7fffffffd698 检查周围的区域,我发现 (gdb) x /10xg 0x7fffffffd690 0x7fffffffd690: 0x0000000000000000 0x00007fffffffd6b0 0x7fffffffd6a0: 0x0000000000401030 0x0000000000000002 0x7fffffff
(gdb) print/$rsp
$1 = 0x7fffffffd698
检查周围的区域,我发现
(gdb) x /10xg 0x7fffffffd690
0x7fffffffd690: 0x0000000000000000 0x00007fffffffd6b0
0x7fffffffd6a0: 0x0000000000401030 0x0000000000000002
0x7fffffffd6b0: 0x00007fffffffd6c8 0x0000000000401030
0x7fffffffd6c0: 0x0000000000000003 0x0000000000000000
0x7fffffffd6d0: 0x0000000000401007 0x0000000000000004
大致上,这是人们所期望的。但是,的输出如下所示,其中
:
(gdb) where
#0 0x000000000040101b in factorial ()
#1 0x0000000000401030 in else ()
#2 0x0000000000000002 in ?? ()
#3 0x00007fffffffd6c8 in ?? ()
#4 0x0000000000401030 in else ()
#5 0x0000000000000003 in ?? ()
#6 0x0000000000000000 in ?? ()
我似乎无法理解。它似乎在按顺序读取堆栈,但我不知道数字0x40101b来自何处(该数字不在堆栈中),我也不确定它为什么停在那里,因为它没有打印出初始函数调用factorial
的堆栈帧
但是,其中的输出如下所示:
(gdb) where
#0 0x000000000040101b in factorial ()
#1 0x0000000000401030 in else ()
#2 0x0000000000000002 in ?? ()
#3 0x00007fffffffd6c8 in ?? ()
#4 0x0000000000401030 in else ()
#5 0x0000000000000003 in ?? ()
#6 0x0000000000000000 in ?? ()
在x86_64
上,GDB希望程序具有适当的DWARF
展开信息(您的程序完全缺少这些信息)。(关于如何使用.cfi
指令插入此类信息。)
如果没有
DWARF
info,GDB会使用某些启发式进行猜测。在这里,GDB将else
视为一个函数,并试图找到它的调用者,结果是灾难性的。实际上,where
对于没有DWARF
展开信息的程序来说将无法正常工作,除非该程序只使用C
函数标签和帧指针。您的意思是只在实际的C函数上放置外部标签?i、 e.使用.Lif
而不是if
作为GAS根本不会放入目标文件的文件范围标签。(因为避免使用.globl if
不足以阻止气体将其放置在GDB可以看到的地方。)