Shot Respuesta: Utilice watch -location itrap_t_beg[1][222]
, o la forma corta watch -l
.
Respuesta larga: Quoting the GDB manual:
Observación de expresiones complejas que hacen referencia a muchas variables también pueden agotar los recursos disponibles para los puntos de observación asistidas por hardware. Eso es porque gdb necesita ver cada variable en la expresión con recursos asignados por separado.
gdb mira literalmente la expresión en sí, no importa la dirección a la que apunta. En este caso, significa que el punto de interrupción se activará si itrap_t_beg
se cambia de manera que itrap_t_beg[1][222]
sí lo hace; no solo hay un punto de observación para itrap_t_beg[1][222]
, sino también uno para itrap_t_beg
. Esto puede ser más de lo que está disponible.
En su caso, itrap_t_beg
es 7 ints, 28 bytes. Un punto de observación x86_64 tiene hasta ocho bytes, por lo que GDB necesita cuatro puntos de observación para toda la estructura, más un quinto para itrap_t_beg
. La familia x86 solo admite cuatro puntos de observación simultáneos.
Un ejemplo más completa sobre cómo puntos de observación de trabajo:
//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;
}
En teoría, esto es una característica útil; Puedes ver una expresión compleja, rompiendo tan pronto como sea falsa, algo así como una afirmación constantemente probada. Por ejemplo, puede watch a==b
en el programa anterior.
En la práctica, es inesperado, a menudo desencadena este problema, y generalmente no es lo que desea.
Para ver solo la dirección de destino, use watch -location itrap_t_beg[1][222]
. (Esto está disponible a partir de GDB 7.3, lanzado en julio de 2011, si todavía está en 7.1, use print &itrap_t_beg[1][222]
y watch *(itrap_t)0x12345678
, o la dirección que imprima)
¿Cuál es el tipo de objetos en la matriz 'itrap_t_beg'? –
Hola, es una estructura con 7 ints. – Gaston
Posible duplicación del punto de mira del hardware de configuración de gdb/cómo configurar el punto de observación del software] (http://stackoverflow.com/questions/3470704/gdb-problem-setting-hardware-watchpoint-how-to-set-software-watchpoint) – Alcaro