GDB回溯不显示函数名称

时间:2010-03-09 10:37:51

标签: function gdb names backtrace

我在SunOS 5.10上使用-g -O0编译了我的库(特别是protbuf-2.3.0)。

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将我的gdb附加到该流程(其中XXX是我从ps获得的pid。)
  3. 然后我使用gdb提示符中的file libprotobuf.so从gdb加载了我的库。
  4. 但我无法从bt看到我的函数名称。我的GDB backtrace命令显示如下:

    (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报告中)。

    任何想法都没有显示我的函数名称?

3 个答案:

答案 0 :(得分:1)

问题很可能是因为GDB不知道如何找出给定PID的完整可执行路径。如果它确实知道完整路径,则不需要执行步骤#3 - GDB会自动添加它。

您可以使用(gdb) info file命令验证GDB是否正确推断出可执行文件名称。

如果我的猜测是正确的,请通过调用它来帮助GDB:

  gdb /path/to/java <PID>

这应该立即解决你所有的问题。

答案 1 :(得分:1)

此外,请确保使用您的库的可执行文件不会被剥离。

答案 2 :(得分:-2)

我认为这是联系问题。你能检查一下在链接时执行的命令吗?希望这会有所帮助。