colpo risposta: Usare watch -location itrap_t_beg[1][222]
, o la forma breve watch -l
.
Risposta lunga: Quoting the GDB manual:
Guardando le espressioni complesse che fanno riferimento a molte variabili possono anche esaurire le risorse disponibili per watchpoints hardware-assisted. Questo perché gdb ha bisogno di guardare ogni variabile nell'espressione con risorse allocate separatamente.
gdb osserva letteralmente l'espressione stessa, non l'indirizzo a cui punta. In questo caso, significa che il punto di interruzione verrà colpito se lo stesso itrap_t_beg
viene modificato in modo tale da fare itrap_t_beg[1][222]
; non c'è solo un punto di riferimento per itrap_t_beg[1][222]
, ma anche uno per lo stesso itrap_t_beg
. Questo potrebbe essere più di ciò che è disponibile.
Nel tuo caso, itrap_t_beg
è 7 pollici, 28 byte. Un watchpoint x86_64 ha fino a otto byte, quindi GDB ha bisogno di quattro watchpoint per l'intera struttura, più un quinto per lo stesso itrap_t_beg
. La famiglia x86 supporta solo quattro watchpoint simultanei.
Un esempio più completa su come watchpoints lavoro:
//set a watchpoint on '*p' before running
#include <stdio.h>
int a = 0;
int b = 0;
int c = 0;
int* p = &a;
int main()
{
puts("Hi"); // Dummy lines to make the results clearer, watchpoints stop at the line after the change
*p = 1; // Breaks: *p was changed from 0 to 1
puts("Hi");
a = 2; // Breaks: a is *p, which changed from 1 to 2
puts("Hi");
p = &b; // Breaks: p is now b, changing *p from 2 to 0
puts("Hi");
p = &c; // Doesn't break: while p changed, *p is still 0
puts("Hi");
p = NULL; // Breaks: *p is now unreadable
puts("Hi");
return 0;
}
In teoria, questa è una caratteristica utile; puoi guardare un'espressione complessa, che si rompe non appena è falsa, un po 'come un'affermazione costantemente testata. Ad esempio, è possibile eseguire watch a==b
nel programma precedente.
In pratica, è inaspettato, spesso causa questo problema e di solito non è quello che desideri.
Per visualizzare solo l'indirizzo di destinazione, utilizzare watch -location itrap_t_beg[1][222]
. (Disponibile a partire da GDB 7.3, rilasciato a luglio 2011, se si è ancora su 7.1, utilizzare print &itrap_t_beg[1][222]
e watch *(itrap_t)0x12345678
o qualsiasi indirizzo stampato.)
Qual è il tipo di oggetti nell'array 'itrap_t_beg'? –
Ciao, è una struttura con 7 pollici. – Gaston
Possibile duplicato di [gdb problem setting watchpoint hardware/come impostare il software watchpoint] (http://stackoverflow.com/questions/3470704/gdb-problem-setting-hardware-watchpoint-how-to-set-software-watchpoint) – Alcaro