2010-03-09 64 views
4

我在SunOS 5.10上使用-g -O0編譯我的庫(特別是protbuf-2.3.0)。GDB回溯不顯示函數名稱

在make日誌的樣本行是這樣的:

/bin/bash ../libtool --tag=CXX --mode=compile g++ -DHAVE_CONFIG_H -I. -I.. -D_REENTRANT -pthreads -Wall -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare -g -O0 -MT text_format.lo -MD -MP -MF .deps/text_format.Tpo -c -o text_format.lo `test -f 'google/protobuf/text_format.cc' || echo './'`google/protobuf/text_format.cc 
libtool: compile: g++ -DHAVE_CONFIG_H -I. -I.. -D_REENTRANT -pthreads -Wall -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare -g -O0 -MT text_format.lo -MD -MP -MF .deps/text_format.Tpo -c google/protobuf/text_format.cc -fPIC -DPIC -o .libs/text_format.o 

然後,我附上我的gdb使用以下步驟:

  1. 運行我的應用程序(在這種情況下,我的Web服務器它啓動一個java web應用程序,它在啓動過程中通過jni使用庫)。
  2. 我通過gdb -p XXX(其中XXX是我從ps獲得的pid)將我的gdb附加到該進程。
  3. 然後我從gdb使用file libprotobuf.so從gdb提示裝入我的庫。

但我從bt看不到我的函數名。我GDB回溯命令顯示了這樣的事情:

(gdb) bt 
#0 0xf8f98914 in ??() 
#1 0xf8f98830 in ??() 
Backtrace stopped: previous frame identical to this frame (corrupt stack?) 

我也試圖做#1 &#2只,#1 &#3只,和#1 & gdb libprotobuf.so -p XXX

除了這些之外,我還嘗試在調試模式下運行我的jvm,並在System.loadLibrary(..)命令中添加了一個斷點,然後在執行該命令後,我再次執行gdb附件過程....但仍然沒有任何結果。

但是,我可以通過list給出功能名稱給出斷點並列出函數的內容。但是再次,我可以放置斷點,但是它們不會停留在這些函數名稱上(我知道它會轉到該函數,因爲它在每個jvm崩潰後都位於jvm hs_err_pid報告中)。

任何想法來它沒有顯示我的函數名?

+0

很可能你沒有正確調用GDB。請顯示可執行文件如何鏈接,以及如何將GDB附加到它。 –

+0

謝謝,我已經添加了更多關於我嘗試過的gdb附件進程的信息。 –

回答

-2

我認爲這是連接問題。你能檢查你的鏈接時執行的命令嗎?希望這會有所幫助。

+2

你的回答是最無用的:檢查命令是什麼?你爲什麼認爲這與鏈接有關? –

1

問題很可能在於GDB不知道如何找出給定PID的完整可執行路徑。如果它知道完整路徑,則不需要執行第3步 - GDB會自動添加它。

您可以使用(gdb) info file命令驗證GDB是否正確推導出可執行文件的名稱。

如果我的猜測是正確的,有利於GDB通過調用它像這樣:

gdb /path/to/java <PID> 

這應該立即解決所有你的問題。

1

此外,請確保使用您的庫的可執行文件沒有被剝離的地方。