2015-04-17 233 views
0

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

什麼可能是相同的原因和如何擺脫它?

回答

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