Выстрел ответа: используйте watch -location itrap_t_beg[1][222]
, или краткую форму watch -l
.
Длинный ответ: Цитирование руководства GDB :
Наблюдение за комплексомвыражения, которые ссылаются на многие переменные, также могут исчерпать ресурсы, доступные для аппаратных точек наблюдения.Это связано с тем, что gdb необходимо отслеживать каждую переменную в выражении с отдельно выделенными ресурсами.
gdb буквально следит за самим выражением, а не по тому адресу, на который оно указывает.В этом случае это означает, что точка останова сработает, если само itrap_t_beg
будет изменено так, что itrap_t_beg[1][222]
сделает это;есть не только точка наблюдения для itrap_t_beg[1][222]
, но и точка для itrap_t_beg
.Это может быть больше, чем доступно.
В вашем случае itrap_t_beg
- это 7 дюймов, 28 байтов.Точка наблюдения x86_64 имеет длину до восьми байт, поэтому GDB требуется четыре точки наблюдения для всей структуры - плюс пятая для самой itrap_t_beg
.Семейство x86 поддерживает только четыре одновременные точки наблюдения.
Более подробный пример того, как работают точки наблюдения:
//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;
}
Теоретически это полезная функция;Вы можете наблюдать сложное выражение, ломающееся, как только оно ложное, что-то вроде постоянно проверяемого утверждения.Например, вы можете watch a==b
в вышеуказанной программе.
На практике это неожиданно, часто вызывает эту проблему, и обычно это не то, что вам нужно.
Чтобы смотреть только цельадрес, используйте watch -location itrap_t_beg[1][222]
.(Это доступно для GDB 7.3, выпущенной в июле 2011 года; если вы все еще используете 7.1, используйте print &itrap_t_beg[1][222]
и watch *(itrap_t)0x12345678
или любой другой адрес, который он печатает.)