Отладочная версия (без символов) в gdb, но с исходной папкой сборки (.o файлы)? - PullRequest
0 голосов
/ 20 декабря 2018

Есть приложение, которое я собрал из исходных текстов, которое работает по большей части нормально, но для определенной проблемы, с которой я недавно столкнулся, оно требует отключения отладчика.

Однако проблема в том, что сборка занимает час или более, и я уже собрал это приложение в выпуске, что означает gdb говорит "(символы отладки не найдены) ... сделано.".

Я все еще могу установить точки останова функции в gdb с исполняемым файлом как есть, за исключением того, что я не могу пройти по коду («Один шаг до выхода из функции ..., который не имеет информации о номере строки.; Не удается найтиграницы текущей функции ").

Итак, учитывая, что у меня есть исходники и папка сборки исходного кода, заполненная .o файлами, - чтобы не тратить потенциально несколько часов на сборку отладочной версии - мне было интересно, если это такМожно ли как-то поручить gdb использовать эти файлы / каталоги, чтобы затем позволить мне шаг за шагом кода?

1 Ответ

0 голосов
/ 20 декабря 2018

Мне было интересно, можно ли как-то проинструктировать GDB об использовании этих файлов / каталогов, чтобы затем позволить мне пройтись по коду?

Да.

Во-первых, вам нужно подготовить соответствующую копию функций, которые вы хотите пройти, но с отладочной информацией.

Предположим, у вас есть foo() и bar() в foo.o иbar.o соответственно.Вам нужно перестроить их, добавив все оригинальные флаги и добавив -g:

rm -f foo.o bar.o
make foo.o bar.o CFLAGS="$ORIGINAL_FLAGS -g"

Далее вам нужно выяснить, где расположены foo() и bar():

nm -A foo.o bar.o | egrep ' (foo|bar)$'

Наконец, вам нужно использовать GDB add-symbol-file foo.o $ADDR_foo_o и add-symbol-file bar.o $ADDR_bar_o, чтобы наслаждаться отладкой исходного кода.

Вычисление $ADDR_foo_o несколько сложно: вам нужно

  • адрес foo внутри foo.o (a1) (вывод из nm выше),
  • адрес .text в foo.o (a2, используйте readelf -WS foo.o | grep '\.text$'),
  • адрес foo в основном двоичном файле (a3, используйте nm a.out | grep ' foo$').

Я полагаю, вам нужно $ADDR_foo_o = $a3 - $a1 + $a2.

Для позициинезависимый исполняемый файл, вам также нужно добавить a.out перемещение (a4), которое вы можете найти в info file или info proc mappings.

PS Чтобы избежать этой боли, вы должны всегда создавайте свои релизные бинарные файлы с флагом -g (который ортогонален флагам оптимизации) и используйте strip -g a.out -o a.out-for-deployment.Затем оставьте a.out для отладки и разверните удаленную версию для производства / клиентов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...