Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory 在GDB中打印内存访问_Memory_Gcc_Gdb_Trace - Fatal编程技术网

Memory 在GDB中打印内存访问

Memory 在GDB中打印内存访问,memory,gcc,gdb,trace,Memory,Gcc,Gdb,Trace,我是gdb的新手。我想打印在c程序执行期间与实际序列一起使用的内存地址。让我们用一个例子来解释我的问题。假设下面的c代码有两个函数main()和test()。我知道,在gdb内部,我可以使用“反汇编main”来反汇编main()函数,或者使用“反汇编test”来分别反汇编test()函数。我的问题是,如何将这两个函数分解为一个代码;因此,我可以看到执行期间使用的所有内存地址及其访问顺序?具体来说,由于main()正在调用test(),test()也在多次调用自身,所以我希望看到类似于示例2的内容

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

如果(q真的没有很好的方法可以做到这一点。你只需要一步一步地完成代码:

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

您可以编写脚本,使其快速执行并将数据转储到文件中,但仅此而已。

我想您可能会更幸运地使用valgrind。如果没有现有的工具来执行此操作,则可以添加您自己的工具来报告内存访问(不仅如此),或者更改现有的工具

例如,见

--跟踪内存=[默认值:否]

启用时,Lackey打印程序进行的几乎每次内存访问的大小和地址

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