我正在使用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
可能是什么原因以及如何摆脱它?
答案 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
命令带你到下一行,不要期望能够检查所有变量等。