2010-02-16 18 views
8

Ich versuche, ein Programm zu debuggen, das ich geschrieben habe. Entsprechend dem Debugger hält ein bestimmter void * den Wert 0x804b008. Ich möchte in der Lage sein, diesen Wert zu dereferenzieren (umwandeln Sie ihn in einen int * und erhalten Sie seinen Wert).Dereferenzierung beliebiger Speicherplatz in C

Ich bekomme einen Segmentierungsfehler mit diesem Code. (Das Programm mit den void * läuft noch im Hintergrund btw - es ist ‚pausiert‘)

#include <stdio.h> 

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

Ich kann sehen, warum jeden Punkt im Speicher zu Ehrerbietung in der Lage, gefährlich werden könnte, so vielleicht ist das, warum dies nicht funktioniert .

Vielen Dank!

Antwort

7

Ihr Programm (im Debugger ausgeführt) und dieses Programm wird nicht im selben virtuellen Speicherbereich ausgeführt. Der Zugriff auf diesen Zeiger (selbst wenn es ein gültiger war) gibt Ihnen keine Informationen.

Jedes Programm, das auf Ihrem Computer ausgeführt wird, hat seinen eigenen logischen Adressraum. Ihr Betriebssystem, die Laufzeit der Programmiersprache und andere Faktoren können sich auf die tatsächlichen Literalwerte auswirken, die Sie als Zeiger für ein bestimmtes Programm verwenden. Aber ein Programm definitiv kann nicht in den Speicherplatz eines anderen Programms sehen, abgesehen natürlich Software-Debugger, die einige spezielle Tricks tun, um dieses Verhalten zu unterstützen.

In jedem Fall sollte Ihr Debugger Ihnen anzeigen lassen, welchen Speicher Sie wollen, während Ihr Programm pausiert ist - vorausgesetzt, Sie haben eine gültige Adresse. In gdb x/x 0x804b008 würde Sie bekommen, was Sie sehen möchten.

Für weitere Informationen:

  1. Wikipedia-Artikel über Virtual Memory.
  2. gdb documentation
+0

Ich habe ein bisschen über OS-Entwicklung gelesen, also glaube ich, dass ich irgendwie verstehe, worüber Sie sprechen. Ist dieser virtuelle Speicher im RAM - nur auf ein anderes Adressierungsschema oder etwas anderes zugeordnet? Danke nochmal. EDIT: beantwortete meine Frage, bevor ich es sogar fragte! – Tyler

+0

Virtueller Speicher bedeutet nur, dass Sie, wenn Sie ein Programm schreiben, einen schönen zusammenhängenden Speicherplatz haben. Das Betriebssystem übernimmt die gesamte potenzielle Speicherfragmentierung für Sie. –

+0

Danke. Ich habe so viel gesammelt. Ich war mehr daran interessiert, wie * es * auf Betriebssystemebene implementiert wird. http://en.wikipedia.org/wiki/Virtual_memory#Page_tables scheint zu sein, wie es gemacht wird. Danke – Tyler

0

Es ist ganz einfach. Das Betriebssystem weiß, dass die Adresse nicht zu Ihrem Programm gehört, daher können Sie es nicht ausdrucken, ohne den Speicherschutz zu umgehen.

Verwandte Themen