我在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使用以下步驟:
- 運行我的應用程序(在這種情況下,我的Web服務器它啓動一個java web應用程序,它在啓動過程中通過jni使用庫)。
- 我通過
gdb -p XXX
(其中XXX是我從ps
獲得的pid)將我的gdb附加到該進程。 - 然後我從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報告中)。
任何想法來它沒有顯示我的函數名?
很可能你沒有正確調用GDB。請顯示可執行文件如何鏈接,以及如何將GDB附加到它。 –
謝謝,我已經添加了更多關於我嘗試過的gdb附件進程的信息。 –