Domanda

Sto eseguendo un'applicazione tramite gdb e desidero impostare un punto di interruzione ogni volta che si accede/modifica una variabile specifica.Esiste un buon metodo per farlo?Sarei anche interessato ad altri modi per monitorare una variabile in C/C++ per vedere se/quando cambia.

È stato utile?

Soluzione

orologio si interrompe solo in scrittura, rwatch lascia che ti fermi a leggere, e un orologio consentirti di interrompere la lettura/scrittura.

È possibile impostare punti di controllo di lettura sulle posizioni di memoria:

gdb$ rwatch *0xfeedface
Hardware read watchpoint 2: *0xfeedface

ma si applica una limitazione ai comandi rwatch e awatch;Non è possibile utilizzare le variabili GDB nelle espressioni:

gdb$ rwatch $ebx+0xec1a04f
Expression cannot be implemented with read/access watchpoint.

Quindi devi espanderli tu stesso:

gdb$ print $ebx 
$13 = 0x135700
gdb$ rwatch *0x135700+0xec1a04f
Hardware read watchpoint 3: *0x135700 + 0xec1a04f
gdb$ c
Hardware read watchpoint 3: *0x135700 + 0xec1a04f

Value = 0xec34daf
0x9527d6e7 in objc_msgSend ()

Modificare: Oh, e comunque.Hai bisogno di entrambi gli hardware o supporto software.Il software è ovviamente molto più lento.Per scoprire se il tuo sistema operativo supporta i watchpoint hardware puoi vedere il file può usare hw-watchpoints impostazione dell'ambiente.

gdb$ show can-use-hw-watchpoints
Debugger's willingness to use watchpoint hardware is 1.

Altri suggerimenti

Supponendo che la prima risposta si riferisca alla sintassi simile a C (char *)(0x135700 +0xec1a04f) quindi la risposta da fare rwatch *0x135700+0xec1a04f non è corretto.La sintassi corretta è rwatch *(0x135700+0xec1a04f).

La mancanza di ()Questo mi ha causato molto dolore cercando di usare io stesso i watchpoint.

Quello che stai cercando si chiama a punto di guardia.

Utilizzo

(gdb) watch foo:guardare il valore di variabile foo

(gdb) watch *(int*)0x12345678:guarda il valore indicato da an indirizzo, cast in qualunque tipo tu voglia

(gdb) watch a*b + c/d:guardare un arbitrariamente espressione complessa, valido nella lingua madre del programma

I watchpoint sono di tre tipi:

  • orologio:gdb si romperà quando a scrivere si verifica
  • rwatch:gdb si romperà a Leggere si verifica
  • un orologio:gdb entrerà entrambi i casi

Puoi scegliere quello più adatto alle tue esigenze.

Per ulteriori informazioni, controlla Questo fuori.

Ho appena provato quanto segue:

 $ cat gdbtest.c
 int abc = 43;

 int main()
 {
   abc = 10;
 }
 $ gcc -g -o gdbtest gdbtest.c
 $ gdb gdbtest
 ...
 (gdb) watch abc
 Hardware watchpoint 1: abc
 (gdb) r
 Starting program: /home/mweerden/gdbtest 
 ...

 Old value = 43
 New value = 10
 main () at gdbtest.c:6
 6       }
 (gdb) quit

Quindi sembra possibile, ma sembra che tu abbia bisogno di supporto hardware.

Utilizzare watch per vedere quando viene scritta una variabile, rwatch quando viene letta e awatch quando viene letta/scritta da/a, come notato sopra.Tuttavia, tieni presente che per utilizzare questo comando, devi interrompere il programma e la variabile deve essere nell'ambito quando hai interrotto il programma:

Usa il comando guarda.L'argomento al comando orologio è un'espressione che viene valutata.Ciò implica che il variabel su cui si desidera impostare un punto di guardia deve essere nell'ambito corrente.Quindi, per impostare un punto di guardia su una variabile non globale, è necessario impostare un punto di interruzione che interromperà il programma quando la variabile è in portata.Si imposta il punto di guardia dopo la rottura del programma.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top