我使用
制作日志中的一行示例如下:
然后,我使用以下步骤附加了我的gdb:
-g -O0
在SunOS 5.10上编译了我的库(具体来说是protbuf-2.3.0)。制作日志中的一行示例如下:
/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服务器启动一个通过jni使用库的Java Web应用程序)。
- 通过
gdb -p XXX
(其中XXX是我从ps
获取的pid)将我的gdb附加到该进程。 - 然后,我从gdb提示符中使用
file libprotobuf.so
加载我的库。
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报告中)。
有什么想法,为什么没有显示我的函数名称吗?