我可以给objdump一个地址并让它反汇编包含的函数吗?

我发现为了获得足够的上下文以查看导致崩溃的原因,必须反汇编大量的库代码真的很烦人。 有什么方法可以直接objdump一个地址,让它为我找到包含函数的边界?

编辑:更好的是,我可以让它拆卸整个堆栈跟踪吗?

也许这样的事情?

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

它打印从0x42开始直到找到ret(q) 0x42列表,假设边界ret(q)标记

objdump --start-address=也许?

gdb disassemble

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

例如:

AC:

 #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' 

输出:与先前的反汇编相同。

在Ubuntu 18.04,GDB 8.1上测试。

另请参见: 如何使用objdump反汇编单个函数?