Могу ли я предоставить objdump адрес и разобрать его содержащую функцию?

Мне очень неприятно разбирать большие fragmentы кода библиотеки, чтобы получить достаточно контекста, чтобы увидеть, что вызывает крушение. Есть ли способ, которым я могу просто передать objdump адрес, и найти ли он границы содержащей функции для меня?

EDIT: Еще лучше, могу ли я его разобрать целую трассировку стека для меня?

Что-то вроде этого возможно?

$ objdump -S --start-address=0x42 foo.o | awk '{print $0} $3~/retq?/{exit}' 

Он печатает список 0x42 начинающийся с 0x42 до 0x42 пор, пока не найдет ret(q) , если граница будет отмечена ret(q)

objdump --start-address= возможно?

gdb disassemble

 gdb -batch -ex "file $EXECUTABLE" -ex "disassemble/rs $ADDRESS" 

Например:

переменный ток:

 #include  int myfunc(int i) { i = i + 2; i = i * 2; return i; } int main(void) { assert(myfunc(1) == 6); assert(myfunc(2) == 8); return 0; } 

Скомпилируйте и myfunc чтобы найти адрес:

 gcc -std=c99 -O0 -g ac gdb -batch -ex 'file a.out' -ex "disassemble/rs myfunc" 

Выход:

 Dump of assembler code for function myfunc: ac: 3 int myfunc(int i) { 0x000000000000064a <+0>: 55 push %rbp 0x000000000000064b <+1>: 48 89 e5 mov %rsp,%rbp 0x000000000000064e <+4>: 89 7d fc mov %edi,-0x4(%rbp) 4 i = i + 2; 0x0000000000000651 <+7>: 83 45 fc 02 addl $0x2,-0x4(%rbp) 5 i = i * 2; 0x0000000000000655 <+11>: d1 65 fc shll -0x4(%rbp) 6 return i; 0x0000000000000658 <+14>: 8b 45 fc mov -0x4(%rbp),%eax 7 } 0x000000000000065b <+17>: 5d pop %rbp 0x000000000000065c <+18>: c3 retq End of assembler dump. 

ОК, поэтому 0x0000000000000655 находится в myfunc , давайте подтвердим, что он работает:

 gdb -batch -ex 'file a.out' -ex 'disassemble/rs 0x0000000000000655' 

Выход: тот же, что и при предыдущей parsingке.

Протестировано на Ubuntu 18.04, GDB 8.1.

См. Также: Как разобрать одну единственную функцию с помощью objdump?