Обратная трассировка GDB не показывает имена функций

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

Примерная строка в журнале сборки выглядит следующим образом:

/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).

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


person Franz See    schedule 09.03.2010    source источник
comment
Скорее всего, вы неправильно вызываете GDB. Пожалуйста, покажите, как был связан исполняемый файл и как вы подключили к нему GDB.   -  person Employed Russian    schedule 09.03.2010
comment
Спасибо, теперь я добавил больше информации о процессах прикрепления gdb, которые я пробовал.   -  person Franz See    schedule 10.03.2010


Ответы (3)


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

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

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

  gdb /path/to/java <PID>

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

person Employed Russian    schedule 10.03.2010

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

person wadesworld    schedule 10.03.2010

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

person Mayank Jain    schedule 10.03.2010
comment
Ваш ответ самый бесполезный: проверьте команду для чего? И почему вы думаете, что это имеет какое-то отношение к ссылкам? - person Employed Russian; 10.03.2010