-1

我是 gdb 的新手。我想打印在执行 ac 程序期间与实际序列一起使用的内存地址。让我们用一个例子来解释我的问题。假设我们有以下带有两个函数 main() 和 test() 的 c 代码。我知道,在gdb里面,我可以使用“disassemble main”来反汇编main()函数,或者“disassemble test”来分别反汇编test()函数。我的问题是,如何将这两个函数分解为一个代码;这样,我就可以看到执行期间使用的所有内存地址及其访问顺序?具体来说,由于 main() 正在调用 test() 并且 test() 也在多次调用自身,所以我想看到类似示例 2 的内容。我也在徘徊,gdb 反汇编程序中显示的地址,它们是虚拟内存地址还是物理内存地址?任何帮助或指导将不胜感激。

示例 1:

#include "stdio.h"

int test(int q)
{
    if(q<16)
    test(q+5);

    return q;
}

void main()
{
    unsigned int a=5;
    unsigned int b=5;
    unsigned int c=5;

    test(a);
} 

示例 2:

<Memory Address> <assembly instruction> <c instructions>

0x12546a    mov //for unsigned int a=5;
0x12546b    mov //for unsigned int b=5;
0x12546c    mov //for unsigned int c=5;    
0x12546d    jmp //for test(q=a=5);
0x12546e    cmpl //for if(q<16)
0x12546f    jmp //for test(q+5);
0x12546d    jmp //for test(q=10);
0x12546e    cmpl //for if(q<16)
0x12546f    jmp //for test(q+5);
0x12547a    jmp //for test(q=15);
0x12547b    cmpl //for if(q<16)
0x12547c    jmp //for test(q+5);
0x12547d    jmp //for test(q=20);
0x12547e    cmpl //for if(q<16)
0x12547f    jmp //return q);
0x12548a    jmp //return q);
0x12548b    jmp //return q);
0x12548c    jmp //return q);
4

2 回答 2

0

我想你可能对 valgrind 有更多的运气。如果没有现有的工具可以这样做,则可以添加您自己的工具来报告内存访问(不仅如此),或者更改现有的工具。

例如见http://valgrind.org/docs/manual/lk-manual.html

--trace-mem= [默认值:否]

启用后,Lackey 会打印程序进行的几乎每个内存访问的大小和地址。

于 2012-12-07T18:29:37.303 回答
0

真的没有很好的方法来做到这一点。您只需要逐步执行代码:

(gdb) stepi
(gdb) x/i $pc
(gdb) info registers
(gdb) stepi
(gdb) x/i $pc
(gdb) info registers
.....

您可以编写脚本,以便它快速完成并将数据转储到文件中,但仅此而已。

于 2012-12-07T10:56:40.550 回答