3

当我在做“Learn C The Hard Way”的例子时,我心想:

我设置 int a = 10; 但实际值 10 在哪里?我可以在程序运行时从外部手动访问它吗?

这是一个用于演示目的的小 C 代码片段:

int main (int argc, char const* argv[]) {                                   

    int a = 10;
    int b = 5;
    int c = a + b;

    return 0;
}   

我打开了GNU 项目调试器(GDB) 并输入:

break main
run
next 2

据我了解0x7fff5bffb04是. 然后我使用hexdump -C /dev/mem系统调用将整个内存转储到终端中。int c

现在的问题是我在哪里可以找到这个巨大的十六进制转储中的变量 c ?我希望给定地址,0x7fff5bffb04我可以找到它的值,即15. 另外,奖金问题, hexdump -C中的每一列代表什么?(我知道最后一列是 ASCII 表示)

数据库

十六进制转储

4

2 回答 2

3

然后我使用 hexdump -C /dev/mem 系统调用将整个内存转储到终端中。

您的 hexdump 转储了物理内存地址。该地址0x7fff5bffb04是您正在调试的进程中变量的虚拟地址。它被映射到某个物理地址,但是如果不检查内核映射表,您将无法找到哪个(正如 Mat 已经在评论中告诉您的那样)。

要检查虚拟地址空间,请使用/proc/<pid>/mem(正如 Barmar 在评论中已经告诉您的那样)。

但是整个练习毫无意义,因为您已经可以检查 GDB 中的虚拟内存,而当您查看 GDB 尚未更方便地显示给您的虚拟内存时,您将看不到任何东西[1]。

[1] 除了你可以看到 GDB 插入的断点,但你不应该理解 :-)

于 2012-09-15T23:36:40.337 回答
1

首先,这些值甚至没有理由存在于 ram 中。不仅仅是 Likly,这个程序的机器代码只是在 cpu 寄存器中有值。您必须拥有更多字节(至少尝试 512)并将它们设置为随机值,然后您可以在内存转储中搜索。

您最好查看由 c 编译器生成的汇编代码。

于 2012-09-15T10:42:36.983 回答