LINUX.ORG.RU

создание watchpoint для локальной переменной в gdb


0

0

Суть проблемы: есть локальная переменная принадлежащая функции постоянно вызываемой из main. При n-ом вызове функции возникает segmentation fault. Необходимо установить watchpoint для этой переменной.
Была попытка создать в функции обычную точку останова и к ней привязать команды создающие watchpoint и возобновляющие выполнение программы.
break 'codeline'
comands
>silent
>watch 'variable name'
>continue
>end
Но при выходе из области видимости переменной gdb, автоматически удаляет watchpoint, и при этом останавливает программу. Создание команды-ловушки
define hook-stop
>continue
>end
тоже не дало нужного результата.
Нет ли в gdb опций позволяющих отключить останов при удалении watchpooit или других механизмов позволяющих отслеживать код изменяющий значение локальных переменных?

anonymous

Ответ на: комментарий от Die-Hard

Дело в том что здесь необходимо отследить код который изменяет значение локальной переменной, причем код этот изменяет это значение не законно, то бишь вследствие ошибки в программе. Где конкретно этот код находится, я не знаю, где то, в вызываемых функциях в которые передается в качестве параметра эта переменная. В этом случае conditional breakpoint не подходит поскольку она привязывается к конкретному месту в коде, и позволяет определить изменение значения переменной только после того как произошло это изменение, в то время как watchpoint останавливает выполнение как только код пытается изменить значение, т. е. точно в том месте в котором нужно. Получается что я должен выставлять conditional break point после места изменения значения постепенно сужая круг поиска, хлопотно это.
К тому же поскольку функция вызывается многократно, и значение локальной переменной заранее не известно, то для того что бы поймать с помощью conditional breakpoint изменение необходимо завести в программе глобальную переменную в которой после инициализации локальной переменной будет сохранятся ее значение и затем уже сравниваться в conditional breakpoint. А изменять код программы нельзя поскольку при этом ошибка пропадает.

anonymous
()
Ответ на: комментарий от anonymous

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

watch *<aдрес>

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.