GDB Stack Trace 信息不完整

GDB Stack Trace incomplete info

我正在使用 gdb 调试一个使用已安装库(用 C 编写)的 C 应用程序。 该库作为守护进程 运行 接受来自应用程序的请求并处理它。 为了调试库守护进程,我将它附加到 gdb 中,并使用命令 "info sharedlibrary" 和 "add-symbol-file".

将库符号文件加载到正确的地址

我已经使用 dir 命令设置了源代码路径。

但是堆栈跟踪仍然没有显示文件名和行号

(gdb) bt
#0  0xffffe410 in __kernel_vsyscall ()
#1  0xf76b2377 in sem_wait () from /lib/libpthread.so.0
#2  0xf616196d in MySemaphoreWait () from /opt/demo/lib/libdemo.so.0
#3  0xf6130fe5 in ReadFile () from /opt/demo/lib/libdemo.so.0
#4  0xf77870df in ?? () from /opt/demo/lib/libtest.so.0
#5  0xf778016e in ?? () from /opt/demo/lib/libtest.so.0
#6  0xf77584b9 in ServiceRequest () from /opt/novell/lib/libtest.so.0
#7 0xf7744c8a in Demo_Main () from /opt/novell/lib/libtest.so.0

相同的原因可能是什么以及如何摆脱它?

I have attached it in gdb and have loaded the libraries symbol file at proper address using commands "info sharedlibrary" and "add-symbol-file".

在 Linux 上,附加进程应该足以让 GDB 从所有共享库加载符号,而不需要 add-symbol-file

作为一个猜测,你做了这样的事情:

make install COPT=-O2  # build/install optimized version of libtest.so.0
# start daemon using it
make COPT=-g  # build debug version of libtest.so.0
gdb -p <daemon-pid>
(gdb) info shared
(gdb) add-symbol-file /path/to/dbg-version/libtest.so.0 <address>

这行不通,因为优化和调试版本会生成具有完全不同符号值的完全不同的二进制文件。

你想要做的是安装调试版本,重启守护进程,然后调试(在那种情况下你不需要add-symbol-file)。

或者,您可能想这样做:

make COPT='-g -O2'

构建匹配的优化版本,但带有调试信息。然后,您可以使用 add-symbol-file 将 GDB 指向带有调试信息的优化版本。

注意:调试优化代码(相对)困难。不要指望 next 命令会带你到下一行,不要指望能够检查所有变量等