Разыменование произвольной ячейки памяти в C - PullRequest
8 голосов
/ 16 февраля 2010

Я пытаюсь отладить программу, которую написал. Согласно отладчику конкретный void * содержит значение 0x804b008. Я хотел бы иметь возможность разыменовать это значение (приведите его к int * и получите его значение).

Я получаю ошибку сегментации с этим кодом. (Кстати, программа с void * все еще работает в фоновом режиме - она ​​«приостановлена»)

#include <stdio.h>

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

Я понимаю, почему возможность отсылки к любой точке памяти может быть опасной, поэтому, возможно, именно поэтому это не работает.

Спасибо!

Ответы [ 2 ]

7 голосов
/ 16 февраля 2010

Ваша программа (запущенная в отладчике) и эта не будут работать в одном и том же пространстве виртуальной памяти; доступ к этому указателю (даже если он действительный) не даст вам никакой информации.

Каждая программа, работающая на вашем компьютере, имеет свое собственное логическое адресное пространство. Ваша операционная система, время выполнения языка программирования и другие факторы могут влиять на фактические литеральные значения, которые вы видите в качестве указателей для любой конкретной программы. Но одна программа определенно не может заглянуть в область памяти другой программы, за исключением, конечно, программных отладчиков, которые выполняют специальные приемы для поддержки этого поведения.

В любом случае ваш отладчик должен позволять вам видеть любую память, которую вы хотите, пока ваша программа приостановлена ​​- при условии, что у вас есть действительный адрес. В gdb x/x 0x804b008 даст вам то, что вы хотите увидеть.

Для получения дополнительной информации:

  1. Статья в Википедии о Виртуальная память .
  2. gdb документация
0 голосов
/ 16 февраля 2010

Это довольно просто. ОС знает, что адрес не принадлежит вашей программе, поэтому вы не можете распечатать его, не обходя защиту памяти.

...