2010-02-16 4 views
8

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

С этим кодом я получаю ошибку сегментации. (Программа с void * по-прежнему работает в фоновом режиме BTW - это «приостановлено»)

#include <stdio.h> 

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

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

Спасибо!

ответ

7

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

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

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

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

  1. Статья Википедии на Virtual Memory.
  2. gdb documentation
+0

Я немного ознакомился с разработкой ОС, поэтому считаю, что я понимаю, о чем вы говорите. Это виртуальная память, расположенная в ОЗУ, только что сопоставленная с другой схемой адресации или чем-то еще? Еще раз спасибо. EDIT: Ответил мой вопрос, прежде чем я даже спросил его! – Tyler

+0

Виртуальная память просто означает, что, насколько вы обеспокоены при написании программы, у вас есть приятное непрерывное пространство памяти. Операционная система обрабатывает всю возможную фрагментацию памяти для вас. –

+0

Спасибо. Я собрал столько же. Меня больше интересовало * как * оно реализовано на уровне ОС. http://en.wikipedia.org/wiki/Virtual_memory#Page_tables похоже, как это делается. Спасибо – Tyler

0

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

Смежные вопросы