2013-03-05 3 views
1

Для исследования поврежденного кучи кучи я хотел бы использовать точки останова ba (break on access). Могу ли я использовать их в управляемом коде? Если да, то как я могу установить их программно?Установите точку останова ba (break on access) в управляемом коде программно

UPDATE: Было бы хорошо так установить их в WinDbg (-> набор ба для каждого объекта типа XY)

ответ

2

Breakpoints, установленная командой «ба» называется процессором или аппаратные точки останова.

Сначала хорошие новости

Легко установить аппаратную точку останова. Вам нужно будет установить один из регистров отладки процессора (DR0, DR1, DR2 или DR3) с адресом данных и установить регистр DR7 управления отладкой с полями для установки размера памяти и типа доступа. Инструкция (в x64 ассемблере) выглядит следующим образом:

MOV бараков, DR0

Очевидно, вам придется каким-то образом выполнить эту команду ассемблера с вашего языка выбора, или использовать Interop в C++ и встроенный ассемблер, но это проще, чем, например, установить контрольную точку программного обеспечения.

Теперь плохие новости

Прежде всего, на машинах SMP вы должны сделать это для всех процессоров, которые могут коснуться вашего кода. Это, вероятно, разрешимо, если вы настраиваете сродство к процессору для процесса или выполняете отладку на машине с одной обработкой. Во-вторых, в архитектуре Intel всего 4 процессора отладки. Если вы попытаетесь установить контрольные точки процессора с помощью WinDbg, после 4-го он будет жаловаться на Too many data breakpoints for thread N после того, как вы нажмете g.

Я предполагаю, что вся цель, о которой вы спрашиваете об автоматизации, состоит в том, что слишком много объектов для установки контрольных точек вручную. Так как вы все равно ограничены 4 ba точками останова, автоматизировать это не так много.

 Смежные вопросы

  • Нет связанных вопросов^_^