GDB回溯不显示函数名称

5
我使用-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:
  1. 运行我的应用程序(在这种情况下,我的Web服务器启动一个通过jni使用库的Java Web应用程序)。
  2. 通过gdb -p XXX(其中XXX是我从ps获取的pid)将我的gdb附加到该进程。
  3. 然后,我从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报告中)。

有什么想法,为什么没有显示我的函数名称吗?


很可能您没有正确调用GDB。请展示可执行文件的链接方式,以及您如何将GDB附加到它上面。 - Employed Russian
谢谢,我现在已经添加了更多关于我尝试的gdb附加进程的信息。 - Franz See
3个回答

2
问题很可能是GDB不知道如何找到给定PID的完整可执行路径。如果它知道完整路径,您就不需要执行步骤#3 - GDB会自动添加它。
您可以使用 info file 命令验证GDB是否正确推断出可执行文件名。
如果我的猜测正确,请通过以下方式调用GDB以帮助它:
  gdb /path/to/java <PID>

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

2
此外,请确保使用您的库的可执行文件没有被任何地方剥离。

-3

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


2
你的回答毫无帮助:检查命令是为了什么?你为什么认为这与链接有关系? - Employed Russian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接