在GDB中打印内存访问

时间:2012-12-07 09:50:35

标签: memory gcc gdb trace

我是gdb的新手。我想在执行c程序期间打印与实际序列一起使用的内存地址。让我们用一个例子来解释我的问题。假设我们有以下c代码,其中包含两个函数main()和test()。我知道,在gdb中,我可以使用“disassemble main”来反汇编main()函数,或者“反汇编测试”来分别反汇编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);

2 个答案:

答案 0 :(得分:0)

真的没有办法做到这一点。你只需要逐步完成代码:

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

您可以编写脚本以便快速执行并将数据转储到文件中,但这就是全部。

答案 1 :(得分:0)

我想你可能会有更多运气与valgrind。如果没有现成的工具,可以添加自己的工具来报告存储器访问(而不仅仅是),或者改变现有工具。

E.g。见http://valgrind.org/docs/manual/lk-manual.html

- trace-mem = [默认:否]

启用后,Lackey会打印程序几乎所有内存访问的大小和地址。