GDB堆栈跟踪不完整信息

问题描述:

我正在使用gdb调试使用已安装库的C应用程序(用C语言编写)。 库作为守护进程运行并接受来自应用程序的请求并处理它。 为了调试库守护进程,我将它附加到gdb中,并使用命令“info sharedlibrary”和“add-symbol-file”将正确的地址加载到库符号文件中。GDB堆栈跟踪不完整信息

我已经使用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 

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

我已将它附加到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命令带你到下一行,不要指望能够检查所有变量等。

+0

感谢您的回复。 我使用-o0删除了优化。 – RKum