Отслеживание доступа на запись к экземпляру класса / диапазону памяти в GDB - PullRequest
6 голосов
/ 17 февраля 2009

Я пытаюсь отладить небольшую операционную систему, которую я написал в университетском курсе на C ++. Во время выполнения где-то один из моих объектов поврежден. Похоже, это происходит из-за случайной записи по неправильному адресу памяти. Поскольку я не могу найти место, где это происходит, просто глядя на код, мне нужен другой способ.

Поскольку это операционная система, я не могу подключить к ней такие инструменты, как valgrind, но могу запустить ее в эмуляторах (bochs / qemu) с подключенным gdb.

Есть ли способ в gdb отслеживать доступ на запись к экземпляру класса или, в более общем случае, к определенному диапазону памяти? Я хотел бы прервать работу, как только появится доступ для записи, чтобы я мог проверить, действительно ли это допустимо.

Ответы [ 2 ]

8 голосов
/ 17 февраля 2009

Вы можете поставить точку наблюдения:

watch x

Это сломается при изменении x. x может быть любым типом переменной. Если у вас есть:

class A;
A x;

Тогда GDB будет прерываться всякий раз, когда x изменяется.

На самом деле вы можете поставить точку наблюдения для любого выражения, и gdb прекратит работу при изменении выражения. Однако будьте осторожны с этим, потому что, если выражение не является чем-то, что поддерживает базовое оборудование, GDB должен будет оценивать это после каждой инструкции, что приводит к ужасной производительности. Например, если A выше - это класс с большим количеством членов, то gdb может просмотреть весь экземпляр x, но способ его работы таков:

  • выполнить инструкцию
  • перейти на точку останова отладки
  • проверить, изменилось ли x
  • возврат в программу

Естественно, это очень медленно. Если x является int, тогда GDB может использовать аппаратную точку останова.

Если у вас есть определенный адрес памяти, вы можете посмотреть его тоже:

watch *0x1234

Это прекратится при изменении содержимого [0x1234].

Вы также можете установить точку останова чтения, используя rwatch или awatch, чтобы установить точку останова чтения / записи.

3 голосов
/ 18 февраля 2009

Если вы знаете хотя бы приблизительно, где это происходит, вы также можете просто использовать «дисплей» вместо просмотра и вручную шаг за шагом пока не увидите, когда произойдет изменение. Просмотр адреса с помощью «watch» слишком болезненно медленен.

...