Обратный след GDB не показывает имена функций - PullRequest
4 голосов
/ 09 марта 2010

Я скомпилировал свою библиотеку (в частности, protbuf-2.3.0 ), используя -g -O0 на SunOS 5.10.

Пример строки в журнале 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. Запустите мое приложение (в данном случае мой веб-сервер, который запускает веб-приложение java, которое использует библиотеку через jni во время запуска).
  2. Я подключил свой gdb к этому процессу через gdb -p XXX (где XXX - это pid, полученный от ps).
  3. И затем я загрузил свою библиотеку из 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 hs_err_pid после каждого сбоя jvm).

Есть идеи, что мне не показывают имена моих функций?

Ответы [ 3 ]

1 голос
/ 10 марта 2010

Скорее всего, проблема в том, что GDB не знает, как определить полный путь к исполняемому файлу для данного PID. Если бы он знал полный путь, вам не нужно было бы делать шаг # 3 - GDB добавил бы его автоматически.

Вы можете проверить, правильно ли выведено имя исполняемого файла GDB с помощью команды (gdb) info file.

Если мое предположение верно, помогите GDB, вызвав его так:

  gdb /path/to/java <PID>

Это должно немедленно решить все ваши проблемы.

1 голос
/ 10 марта 2010

Кроме того, убедитесь, что исполняемый файл, который использует вашу библиотеку, нигде не удаляется.

0 голосов
/ 10 марта 2010

Я думаю, что это проблема связывания. Можете ли вы проверить свою команду, которая выполняется во время ссылки. Надеюсь, это поможет.

...