2016-03-27 1 views
0

Je débogue une application et j'ai besoin de voir la zone de mémoire pointée par une valeur stockée dans rcx. Normalement, pour le code, cela serait fait en sélectionnant la variable (pointeur) et l'ajout d'une montre rapide ainsi que le nombre d'éléments à regarder à partir du pointeur:Pointeurs de déréférencement stockés dans des registres (visual studio)

quickwatch

Je veux obtenir le pointeur vers la chaîne déplacé dans rcx dans le code ci-dessous:

#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 

Comment puis-je obtenir la valeur pointée par rcx? Dans l'assemblage, la syntaxe serait:

[rcx+index] 

mais comment puis-je regarder la valeur dans Visual Studio?

J'ai essayé d'ajouter:

[rcx] 
[rcx],10 
rcx,10 

dans Espion, mais pour les deux premières entrées que je reçois:

nom du type n'est pas autorisé

et pour le dernier, je ne peux pas déréférencer rcx , il est montré comme avant.

Edit:

Coulée la valeur dans le rcx au type désiré, fonctionne. Dans le cas ci-dessus une montre rapide serait ajoutée sur (char*)rcx montre la chaîne entière dans la fenêtre de débogage. Pour d'autres types (c'est-à-dire des entiers), il est également nécessaire que le nombre d'éléments soit également spécifié dans la montre, sinon seule la première valeur est affichée. Par exemple, (int*)rcx, 10 montre 10 entiers de quatre octets à partir de la valeur d'adresse stockée dans rcx. Le type doit être ajusté pour chaque donnée stockée dans le registre.

+2

Je n'ai pas fait cela avec des registres avant, mais simplement la coulée de la valeur du type que vous voulez inspecter comme devrait faire l'affaire - par exemple '(char *) rcx' – melak47

+0

Cela a fonctionné, mais il doit être modifié chaque fois que le type de données déréférencées change. – Sebi

Répondre

0

Copiez la valeur du registre sur un pointeur c/C++ en utilisant _asm {....} puis regardez-le comme d'habitude. ici vous pouvez trouver comment accéder à la variable c de l'assemblage en ligne: https://msdn.microsoft.com/en-us/library/fabdxz08.aspx

+0

Je ne dois pas changer le code. La directive _asm {} de haut niveau ne peut pas être utilisée. – Sebi

+1

c'est la réponse je pense http://stackoverflow.com/questions/23020232/how-to-view-address-of-register-in-visual-studio-debugger –