Точка наблюдения GDB на структурных переменных
У меня есть такая структура:
struct A
{
int a;
char b;
};
на эту структуру ссылаются в разных местах большого кода. Указатель на эту структуру передается различным функциям и, соответственно, переменные в этой структуре обновляются. я хочу установить точку наблюдения для переменной а в этой структуре, так как она проходит через многие функции. чтобы увидеть, как меняется. Как мне установить эту точку наблюдения?
2 ответа
Сначала установите точку останова, где вы создаете экземпляр своей структуры, используя break, например
break myfile.c:9
Затем просто используйте часы, чтобы установить точку наблюдения, как
watch myStructInstance.a
для переменной а или
watch *0x7ffff75177f0
для адреса памяти. Адрес памяти можно легко получить с помощью печати, например,
print &myStructInstance.a
Теперь каждый раз, когда переменная a или данный адрес памяти модифицируется, GDB будет прерываться.
Я сталкиваюсь с той же проблемой при отладке симулятора виртуальной памяти. Проблема заключается в том, как внимательно следить за данными внутри структур.
Я попытался использовать печать, чтобы проверить, но это слишком шумно. Потому что я должен распечатать более 15 переменных.
Я также пытался использовать точку наблюдения, но на своем компьютере я могу установить не более 4 аппаратных точек наблюдения. Это даже не близко к моей цели.
Наконец, я нахожу свое решение, используя пользовательскую функцию в файле.gdbinit. например, если я хочу посмотреть массив моей структуры, используя
define lookintoStructs
if mystruct != 0x0
print mystruct[0]
print mystruct[1]
print mystruct[2]
print mystruct[3]
print mystruct[4]
print mystruct[5]
end
end
чтобы сделать его более удобным в использовании, я бы хотел подключить его к моей следующей инструкции в gdb.
define hook-next
lookintoStructs
end
поэтому, когда я вызываю next или n в gdb, lookintoStructs может вызываться автоматически. отлично работает для меня