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

C 我可以给objdump一个地址并让它反汇编包含函数吗?,c,debugging,disassembly,objdump,C,Debugging,Disassembly,Objdump,我发现,为了获得足够的上下文来了解是什么导致了崩溃,不得不反汇编大量库代码,这真的很烦人。有没有什么方法可以直接给objdump一个地址,让它为我找到包含函数的边界 编辑:更好的是,我能让它为我分解整个堆栈跟踪吗 objdump--start address=也许?可能是这样的吗 $ objdump -S --start-address=0x42 foo.o | awk '{print $0} $3~/retq?/{exit}' 它从0x42开始打印分解列表,直到找到一个ret(q),假设边界

我发现,为了获得足够的上下文来了解是什么导致了崩溃,不得不反汇编大量库代码,这真的很烦人。有没有什么方法可以直接给objdump一个地址,让它为我找到包含函数的边界


编辑:更好的是,我能让它为我分解整个堆栈跟踪吗

objdump--start address=
也许?

可能是这样的吗

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

它从
0x42
开始打印分解列表,直到找到一个
ret(q)
,假设边界标记为
ret(q)
GDB
反汇编

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

a、 c

输出:

Dump of assembler code for function myfunc:
a.c:
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.
输出:与上一次拆卸相同

另见:


在Ubuntu18.04和GDB8.1上测试。

你不能将崩溃内核加载到GDB中并在那里进行探索吗?(或者在不使用内核或gdb的情况下,如何得到崩溃地址?)。这是为了内核调试,而崩溃的库在启动过程的早期就这样做了。
gcc -std=c99 -O0 -g a.c
gdb -batch -ex 'file a.out' -ex "disassemble/rs myfunc"
Dump of assembler code for function myfunc:
a.c:
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.
gdb -batch -ex 'file a.out' -ex 'disassemble/rs 0x0000000000000655'