Мне было интересно, можно ли как-то проинструктировать 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
для отладки и разверните удаленную версию для производства / клиентов.