4

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

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 是我从中获得的 pid )将我的 gdb 附加到该进程ps
  3. 然后我使用file libprotobuf.sogdb 提示符从 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 报告中)。

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

4

3 回答 3

2

问题很可能在于 GDB 不知道如何计算给定 PID 的完整可执行路径。如果它确实知道完整路径,则不需要执行第 3 步——GDB 会自动添加它。

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

如果我的猜测是正确的,请像这样调用 GDB 来帮助它:

  gdb /path/to/java <PID>

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

于 2010-03-10T07:35:34.083 回答
2

此外,请确保使用您的库的可执行文件没有在某处被剥离。

于 2010-03-10T07:43:26.670 回答
-3

我认为这是链接问题。您能否检查在链接时执行的命令。希望这会有所帮助。

于 2010-03-10T04:34:38.473 回答