Come si inserisce un punto di interruzione in una posizione di memoria in dbx?
-
20-08-2019 - |
Domanda
Un collega ha un programma C che fallisce in modo prevedibile a causa della memoria danneggiata. Vorrebbe utilizzare dbx
per monitorare la posizione della memoria una volta allocata per individuare il codice che causa la corruzione.
È possibile? In tal caso, qual è la sintassi per produrre un breakpoint al momento della corruzione?
In caso contrario, quale sarebbe un buon approccio per risolvere questo tipo di problema?
(La mia solita tattica è guardare il controllo del codice sorgente per vedere cosa sono cambiato di recente, dato che di solito è la causa. Ma il codice in questione sembra funzionare solo per fortuna, quindi non lo farà Inoltre, mi sono già eliminato come colpevole non avendo mai lavorato con il codice. ;-)
Soluzione
Dando uno sguardo più approfondito, sembra che la soluzione nelle ultime versioni di dbx
sia qualcosa del tipo:
stop access w <address>, <size>
Dato che <address>
e <size>
possono essere espressioni, puoi scrivere comandi come:
stop access w &p, sizeof(int)
Ciò presuppone che p
sia un puntatore e vogliamo monitorare la prima parola a cui punta.
Ho anche incontrato un ottimo tutorial sul tracciamento e stomping bug di memoria. Utilizza gdb
anziché <=>, ma i principi dovrebbero essere gli stessi.
Altri suggerimenti
Su AIX, vuoi usare stophwp:
(dbx) help stophwp
stophwp <address> <size>
Stop execution when the contents of the specified
memory region change. This is a accomplished in
hardware and may not be available on all models.
Non sono uno sviluppatore di Solaris, ma puoi farlo con gdb e breakpoint hardware