Поделиться через


Риски, связанные с установкой точек останова

При задании точек останова путем указания адреса памяти или символа плюс смещения эту точку останова не следует помещать в середину инструкции.

Например, рассмотрим следующий дизассемблированное код.

770000f1 5e               pop     esi
770000f2 5b               pop     ebx
770000f3 c9               leave
770000f4 c21000           ret     0x10
770000f7 837ddc00         cmp     dword ptr [ebp-0x24],0x0

Первые три инструкции имеют длину только в один байт. Однако четвертая инструкция имеет длину в три байта. (Он включает байты 0x770000F4, 0x770000F5 и 0x770000F6.) Если вы хотите поставить точку останова в этой инструкции с помощью команды bp, bu или ba , необходимо указать адрес 0x770000F4.

Если вы поместите точку останова в адрес 0x770000F5 с помощью команды ba , обработчик поставит точку останова в этом расположении. Но эта точка останова никогда не будет активирована, так как обработчик считает 0x770000F4 фактическим адресом инструкции.

Если вы поместите точку останова в адрес 0x770000F5 с помощью команд bp или bu , отладчик записывает точку останова в этом расположении. Однако эта точка останова может повредить целевой объект из-за того, как отладчик создает точки останова:

  1. Отладчик сохраняет содержимое 0x770000F5 и перезаписывает эту память инструкцией точки останова.

  2. Если вы попытаетесь отобразить эту память в отладчике, отладчик не отобразит записанную им инструкцию точки останова. Вместо этого отладчик отображает память, которая должна находиться там. То есть отладчик отображает исходную память или любые изменения в ней, внесенные с момента вставки точки останова.

  3. Если для удаления точки останова используется команда BC , отладчик восстанавливает исходную память в нужное расположение.

При установке точки останова в 0x770000F5 отладчик сохраняет этот байт и здесь записывается инструкция прерывания. Однако при запуске приложение достигает 0x770000F4 адреса и распознает этот адрес как первый байт многобайтовой инструкции. Затем процессор пытается объединить 0x770000F4, 0x770000F5 и, возможно, более поздние байты в одну инструкцию. Такое сочетание может создать различные варианты поведения, ни одно из которых не является желательным.

Поэтому при установке точек останова с помощью команды bp, bu или ba убедитесь, что точки останова всегда помещаются по правильному адресу. Если вы используете графический интерфейс WinDbg для добавления точек останова, вам не нужно беспокоиться об этой ситуации, так как правильный адрес выбирается автоматически.

Неоднозначное разрешение точек останова

В отладчике версии 10.0.25310.1001 и более поздних версиях поддерживается неоднозначное разрешение точек останова. Неоднозначные точки останова позволяют отладчику задавать точки останова в определенных сценариях, где выражение точки останова разрешается в несколько расположений. Дополнительные сведения см. в разделе Неоднозначное разрешение точек останова.

См. также

Использование точек останова

Синтаксис точки останова

bp, bu, bm (установка точки останова)

Неоднозначное разрешение точек останова

Неразрешенные точки останова (bu Точки останова)