理解gdb`where`命令的输出

理解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

我正在调试以下程序(正确)

我在阶乘函数上设置了一个断点,并继续了两次。检查%rsp的值,我发现它是

(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可以看到的地方。)