18

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

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

4

3 回答 3

18

大概是这样的?

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

假设0x42边界标记为_ret(q)ret(q)

于 2011-06-22T18:10:52.903 回答
4

广发银行disassemble

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

例如:

交流

#include <assert.h>

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 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.

好的,所以 0x0000000000000655 在 中myfunc,让我们确认它是否有效:

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

输出:和之前的反汇编一样。

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

在 Ubuntu 18.04、GDB 8.1 上测试。

于 2018-08-22T16:36:22.470 回答
2

objdump --start-address=也许 ?

于 2011-06-22T14:47:27.740 回答