Как вы устанавливаете точку останова в ячейке памяти в dbx?

StackOverflow https://stackoverflow.com/questions/351052

Вопрос

У коллеги есть программа на языке Си, которая предсказуемым образом выходит из строя из-за некоторого повреждения памяти.Он хотел бы использовать 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 и аппаратных точек останова

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top