我是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);
答案 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会打印程序几乎所有内存访问的大小和地址。