web-dev-qa-db-fra.com

Trouver l'adresse exacte de la variable Buf

Comme référence, j'utilise le code suivant:

#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 pour me montrer l'adresse de la variable buf?

23
Neefra

(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 dirait address requested for identifier "a" which is in register $xxx.

Sidenote: n'utilisez pas gets, voir ici .

36
Nikolai Fetissov

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

Dans n'importe quel mode de langue, vous pouvez utiliser

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

(La sortie ne correspond pas exactement à votre code.) J'écris cette réponse car cette question est trouvée même par des personnes qui recherchent la réponse pour d'autres langues (y compris moi-même). On peut également toujours passer en mode C par set language c, Mais les noms des symboles peuvent être différents après ce changement.

8
Vladimir F

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)
4
paxdiablo