2016-03-27 7 views
0

Ich debugge eine App und muss die Speicherregion sehen, auf die durch einen in rcx gespeicherten Wert verwiesen wird.Dereferenzierung von Zeigern in Registern gespeichert (Visual Studio)

quickwatch

Ich mag den Zeiger bekommen: Normalerweise für Code, würde dies durch die Auswahl der Variable (Zeiger) und das Hinzufügen einer schnelle Uhr zusammen mit der Anzahl von Elementen aus dem Zeiger beginnen zu sehen getan werden die Zeichenfolge in rcx im Code unten bewegt:

#include <stdio.h> 

int main() { 
000000013F1217C0 push  rbp 
000000013F1217C2 push  rdi 
000000013F1217C3 sub   rsp,0E8h 
000000013F1217CA lea   rbp,[rsp+20h] 
000000013F1217CF mov   rdi,rsp 
000000013F1217D2 mov   ecx,3Ah 
000000013F1217D7 mov   eax,0CCCCCCCCh 
000000013F1217DC rep stos dword ptr [rdi] 
    goto mylabel; 
000000013F1217DE jmp   $mylabel (013F1217EEh) 
000000013F1217E0 jmp   $mylabel (013F1217EEh) 
    printf("Skipped\n"); 
000000013F1217E2 lea   rcx,[string "Skipped\n" (013F129C28h)] 
000000013F1217E9 call  printf (013F1211CCh) 
mylabel: 
    printf("goto ftw!\n"); 
000000013F1217EE lea   rcx,[string "goto ftw!\n" (013F129C38h)] 
000000013F1217F5 call  printf (013F1211CCh) 
    return 0xf00d; 
000000013F1217FA mov   eax,0F00Dh 
} 
000000013F1217FF lea   rsp,[rbp+0C8h] 
000000013F121806 pop   rdi 
000000013F121807 pop   rbp 
000000013F121808 ret 

Wie kann ich den Wert, auf den RCX bekommen? In Assembly wäre die Syntax:

[rcx+index] 

aber wie kann ich den Wert im Visual Studio beobachten?

Ich habe das Hinzufügen versucht:

[rcx] 
[rcx],10 
rcx,10 

in Schnellüberwachung, aber für die ersten beiden Einträge erhalte ich:

Typname ist nicht

und für die letzte erlaubte ich kann nicht dereferenzieren rcx Es ist wie zuvor gezeigt.

Edit:

den Wert in der rcx auf die gewünschte Art Casting arbeitet. In dem obigen Fall würde eine schnelle Uhr hinzugefügt werden (char*)rcx zeigt die gesamte Zeichenfolge im Debugging-Fenster. Für andere Typen (d. H. Ganzzahlen) ist es ebenfalls erforderlich, dass die Anzahl von Elementen auch in der Uhr angegeben wird, andernfalls wird nur der erste Wert gezeigt. Zum Beispiel zeigt (int*)rcx, 10 10 Vier-Byte-Ganzzahlen, beginnend mit dem in rcx gespeicherten Adressenwert. Der Typ muss für jeden im Register gespeicherten Daten angepasst werden.

+2

Ich habe dies nicht zuvor mit Registern getan, aber einfach den Wert auf den Typ, den Sie es überprüfen möchten, wie der Trick - z. '(char *) rcx' – melak47

+0

Das hat funktioniert, aber es muss jedes Mal geändert werden, wenn sich der Typ der dereferenzierten Daten ändert. – Sebi

Antwort

0

Kopieren Sie den Wert des Registers in einen c/C++ - Zeiger mit _asm {....} und beobachten Sie es dann wie gewohnt. Hier finden Sie, wie c-Variable von Inline-Assembly zugreifen: https://msdn.microsoft.com/en-us/library/fabdxz08.aspx

+0

Ich darf den Code nicht ändern. Die Direktive _asm {} kann nicht verwendet werden. – Sebi

+1

das ist die Antwort, die ich denke, http://StackOverflow.com/Questions/23020232/How-to-view-address-of-register-in-visual-studio-debugger –