Разыменуйте произвольную ячейку памяти в C

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

Я получаю Ошибку Сегментации с этим кодом. (Программа с void * все еще работает в фоновом режиме btw - это 'приостанавливается'),

#include <stdio.h>

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

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

Спасибо!

8
задан Tyler 16 February 2010 в 05:08
поделиться

2 ответа

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

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

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

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

  1. Статья в Википедии о Виртуальной памяти .
  2. gdb документация
7
ответ дан 5 December 2019 в 21:18
поделиться

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

0
ответ дан 5 December 2019 в 21:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: