Как вы устанавливаете точку останова в ячейке памяти в dbx?
-
20-08-2019 - |
Вопрос
У коллеги есть программа на языке Си, которая предсказуемым образом выходит из строя из-за некоторого повреждения памяти.Он хотел бы использовать dbx
отслеживать ячейку памяти после ее выделения, чтобы точно определить код, вызывающий повреждение.
Возможно ли это?Если да, то каков синтаксис для создания точки останова в момент повреждения?
Если нет, то каков был бы хороший подход к устранению такого рода проблем?
(Моя обычная тактика - посмотреть на систему управления версиями, чтобы увидеть, что я изменил в последнее время, поскольку обычно это является причиной.Но код, о котором идет речь, звучит так, как будто он когда-либо работал только по счастливой случайности, так что это не сработает.Кроме того, я уже устранил себя как виновника, так как никогда не работал с кодом.;-)
Решение
Посмотрев более глубоко, оказывается, решение на последних версиях dbx
это что-то вроде:
stop access w <address>, <size>
С тех пор как <address>
и <size>
могут быть выражениями, вы можете писать команды типа:
stop access w &p, sizeof(int)
Это предполагает p
это указатель, и мы хотим отслеживать первое слово, на которое он указывает.
Я также наткнулся на штраф Учебник об отслеживании и устранении ошибок в памяти.Он использует gdb
вместо того , чтобы dbx
, но принципы должны быть теми же самыми.
Другие советы
В AIX вы хотите использовать stophwp:
(dbx) help stophwp
stophwp <address> <size>
Stop execution when the contents of the specified
memory region change. This is a accomplished in
hardware and may not be available on all models.
Я не разработчик Solaris, но вы можете сделать это с помощью gdb и аппаратных точек останова