8

我正在尝试调试我编写的程序。根据调试器,一个特定的void *持有值 0x804b008。我希望能够取消引用这个值(将其转换为 anint *并获得它的值)。

我收到此代码的分段错误。(顺便说一句,带有 的程序void *仍在后台运行 - 它已“暂停”)

#include <stdio.h>

int main() {
    int* pVal = (int *)0x804b008;
    printf("%d", *pVal);
}

我明白为什么能够尊重内存中的任何点都可能是危险的,所以也许这就是为什么这不起作用。

谢谢!

4

2 回答 2

7

您的程序(在调试器中运行)和这个程序不会在相同的虚拟内存空间中运行;访问该指针(即使它是有效的)不会给您任何信息。

在您的机器上运行的每个程序都有自己的逻辑地址空间。您的操作系统、编程语言运行时和其他因素可能会影响您看到用作任何给定程序指针的实际文字值。但是一个程序绝对不能看到另一个程序的内存空间,当然软件调试器除外,它们会做一些特殊的技巧来支持这种行为。

无论如何,您的调试器应该让您在程序暂停时查看您想要的任何内存——假设您有一个有效的地址。在 gdbx/x 0x804b008中会得到你想看到的。

了解更多信息:

  1. 维基百科关于虚拟内存的文章。
  2. gdb文件
于 2010-02-16T05:13:19.397 回答
0

这很简单。操作系统知道该地址不属于您的程序,因此您无法在不绕过内存保护的情况下打印它。

于 2010-02-16T05:14:35.510 回答