Аннотация:
Встроенный отладчик Visual C++ – это мощный и удобный инструмент, оказывающий неоценимую помощь в процессе поиска и устранения ошибок в программе. Прежде чем изучать конкретные техники отладки, необходимо ознакомиться с его возможностями.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Пытался я под 7-мой студией (а если точнее — и под 7 и под 7.1 — то бишь MSVS.NET 2002 и MSVS.NET 2003, соответственно) использовать эту секцию, но никакого видимого результата не заметил. Хотя под MSVC 6.0 все работает прекрасно...
В современных процессорах Intel существуют отладочные регистры (DR0-DR7), которые позволяют установить до 4 аппаратных точек останова. Visual C++ использует эти регистры, но когда их количества оказывается недостаточно, их функциональность эмулируется посредством int 3.
Интересно, зачем отладчик Visual использует эти регистры? Насколько я понимаю, эти 4 аппаратных точки останова являются брейкпоинтами по доступу к памяти. Насколько я знаю, отладчик Visual не поддерживает такие брейкпоинты, а все, что он умеет — это трассировать и вставлять инструкцию int3. И вообще, он является обычным отладчиком процессов 3-го кольца.
Или я не прав?
Re[2]: Возможности встроенного отладчика Visual C++
Здравствуйте, Polosaty, Вы писали:
P>Цитата из статьи:
P>ПРИМЕЧАНИЕ
P>В современных процессорах Intel существуют отладочные регистры (DR0-DR7), которые позволяют установить до 4 аппаратных точек останова. Visual C++ использует эти регистры, но когда их количества оказывается недостаточно, их функциональность эмулируется посредством int 3.
P>Интересно, зачем отладчик Visual использует эти регистры? Насколько я понимаю, эти 4 аппаратных точки останова являются брейкпоинтами по доступу к памяти. Насколько я знаю, отладчик Visual не поддерживает такие брейкпоинты, а все, что он умеет — это трассировать и вставлять инструкцию int3. И вообще, он является обычным отладчиком процессов 3-го кольца. P>Или я не прав?
Отладчик Visual C++ умеет ставить брейкпоинты на доступ к памяти (о чём подробно рассказано в статье ), и именно для этих целей использует вышеупомянутые регистры. Это позволяет существенно ускорить отладку, так как эмуляция брейкпойнтов на доступ к памяти работает очень медленно (фактически, после выполнения каждой инструкции надо останавливать программу и проверять, не изменилось ли содержимое памяти).
Чтобы проверить этот факт в своё время, я ставил 1, 2, 3, 4 брейкпоинта ан память, и отладка работала очень быстро. Но стоило добавить 5-й, как всё начинало жутко тормозить.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Re[3]: Возможности встроенного отладчика Visual C++
Здравствуйте, Alexander Shargin, Вы писали:
P>>Интересно, зачем отладчик Visual использует эти регистры? Насколько я понимаю, эти 4 аппаратных точки останова являются брейкпоинтами по доступу к памяти. Насколько я знаю, отладчик Visual не поддерживает такие брейкпоинты, а все, что он умеет — это трассировать и вставлять инструкцию int3. И вообще, он является обычным отладчиком процессов 3-го кольца. P>>Или я не прав?
AS>Отладчик Visual C++ умеет ставить брейкпоинты на доступ к памяти (о чём подробно рассказано в статье
Да, действительно, извините. Правда, чтобы этим пользоваться, нужно еще разобраться, как правильно описывать контекст переменных, но это уже совсем другая история...
Здравствуйте, giv, Вы писали:
giv>Пытался я под 7-мой студией (а если точнее — и под 7 и под 7.1 — то бишь MSVS.NET 2002 и MSVS.NET 2003, соответственно) использовать эту секцию, но никакого видимого результата не заметил. Хотя под MSVC 6.0 все работает прекрасно...
Здравствуйте, Polosaty, Вы писали:
P>Насколько я понимаю, эти 4 аппаратных точки останова являются брейкпоинтами по доступу к памяти.
Еще по исполнению инструкции по конкретному адресу и по записи в порт брякаться умеют