2010-12-16 1 views
19

Comme référence, je suis en utilisant le code suivant:Trouvez l'adresse exacte de la variable Buf

#include <stdio.h> 
#include <string.h> 

int main (void) { 
    char buf[100]; // ------> How do I find the address in gdb? 

    printf ("Buffer is at memory location: %08x\n", &buf); 
    strcpy (buf, "some random text"); 
    printf ("Text is [%s]\n", buf); 

    return 0; 
} 

Comment puis-je obtenir gdb me montrer l'adresse de la variable buf?

Répondre

26

(gdb) p &a si vous avez besoin de l'adresse de la variable a. Une variable peut cependant être mise en cache dans un registre, auquel cas GDB vous dira address requested for identifier "a" which is in register $xxx.

Sidenote: n'utilisez pas gets, voir here.

+3

Je ne pense pas que 'buf' sera mis en cache dans un registre. Eh bien, pas à moins que ce soit un registre sanglant _big_ :-) – paxdiablo

+5

Vous voulez dire que votre processeur n'a pas de registres de 100 octets? Mec, quel matériel utilisez-vous? –

+0

Free BSD Inter Pentium 4 ...... – Neefra

4

Si vous entrez ce qui suit dans gdb, vous obtiendrez l'adresse:

start 
p &buf 

comme dans la transcription suivante:

pax$ gdb ./qq.exe 
GNU gdb 6.8.0.20080328-cvs (cygwin-special) 
Copyright (C) 2008 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
and "show warranty" for details. 
This GDB was configured as "i686-pc-cygwin"... 
(gdb) start 
Breakpoint 1 at 0x401144: file qq.c, line 2. 
Starting program: /home/pax/qq.exe 
[New thread 2912.0xf9c] 
[New thread 2912.0x518] 
main() at qq.c:2 
2  int main (int argc, char **argv) { 
(gdb) p &buf 
$1 = (char (*)[100]) 0x22ccd0 
(gdb) 
+0

Pourquoi deux threads? –

+4

C'est CygWin. Seulement $ DEITY sait ce qui se passe sous les couvertures pour émuler UNIX :-) – paxdiablo

+0

Merci pour votre réponse explicite! – strpeter

4

L'opérateur & fonctionnera lorsque gdb est réglé sur C mode langue (et Objective-C).

En tout mode de langue que vous pouvez utiliser

(gdb) info address buf 
Symbol "buf" is static storage at address 0x903278. 

(La sortie ne correspond pas exactement à votre code.) Je vous écris cette réponse parce que cette question se trouve même par des gens qui cherchent la réponse à d'autres langues (moi y compris). On peut aussi toujours passer en mode C par set language c, mais les noms des symboles peuvent être différents après ce changement.

Questions connexes