GDB Stack Trace不完整的信息

时间:2015-04-17 13:57:20

标签: gdb

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

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

1 个答案:

答案 0 :(得分:0)

  

我已将它附加到gdb中,并使用命令" info sharedlibrary"将库符号文件加载到适当的地址。和" 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命令带你到下一行,不要期望能够检查所有变量等。