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
命令带你到下一行,不要指望能够检查所有变量等。
感谢您的回复。 我使用-o0删除了优化。 – RKum