Отладчик имеет смысл, когда вы говорите о интерпретируемой программе, потому что инструкции всегда проходят через интерпретатор для проверки перед выполнением. Но как работает отладчик для скомпилированного приложения? Если инструкции уже выложены в памяти и запущены, как я могу получить уведомление о достижении «точки останова» или о том, что произошло «исключение»?Как отладчики/исключения работают над скомпилированной программой?
ответ
С помощью оборудования и/или операционной системы.
Большинство современных ЦП имеют несколько регистров отладки, которые могут быть настроены на запуск исключения ЦП при достижении определенного адреса. Они часто также поддерживают точки наблюдения адреса, которые вызывают исключения, когда приложение читает или записывает в указанный адрес или диапазон адресов, и одношаговый, что заставляет процесс выполнять одну команду и выдавать исключение. Эти исключения могут быть захвачены отладчиком, подключенным к программе (см. Ниже).
В качестве альтернативы, некоторые отладчики создают точки останова, временно заменяя инструкцию в точке останова инструкцией прерывания или прерывания (тем самым также заставляя программу повысить исключение ЦП). Как только точка останова ударяется, отладчик заменяет ее исходной инструкцией и выполняет однократную обработку CPU за этой инструкцией, чтобы программа работала нормально.
Что касается исключений, это зависит от системы, над которой вы работаете. В системах UNIX отладчики обычно используют системный вызов ptrace()
для присоединения к процессу и получают первый снимок при обработке своих сигналов.
TL; DR - магия низкого уровня.
Это потрясающе. Не знал, что это функция процессора. – sircodesalot
- 1. Кнопки, не работающие над Программой
- 2. Отображение наложения над другой программой
- 3. Хотя истинная разница между браузером и скомпилированной программой на ОС
- 4. Два программиста, работающие над программой Visual C#
- 5. Как индексы работают над представлениями?
- 6. Новое в OpenGL, работающее над программой «paint»
- 7. PyInstaller не работает над простой программой HelloWorld
- 8. Предпочтение TestFlight над Программой разработчика Apple Enterprise
- 9. Как узнать расположение функции, скомпилированной компилятором
- 10. как использовать скрипт оболочки для контроля над программой?
- 11. Как передать контроль над программой вызывающей функции в цикле while
- 12. Как получить контроль над программой после обработки исключения?
- 13. Как белые работают над уже запущенным приложением?
- 14. Условные границы работают над символами?
- 15. Работают над уровнем двух факторов
- 16. Ссылки не работают над подстраницами
- 17. Преимущества скомпилированной модели ASP.Net?
- 18. Выполнение скомпилированной программы Lisp
- 19. связывает статическую библиотеку C++, созданную gcc, с программой, скомпилированной с помощью xlC?
- 20. Является ли CGI еще медленным при использовании с скомпилированной программой, которая не требует виртуальной машины?
- 21. Выполнение скомпилированной программы C
- 22. Может кто-нибудь объяснить поток контроля над этой программой?
- 23. Атрибуты доступа скомпилированной директивы
- 24. Работа над классом, совместно используемым между основной программой и функцией
- 25. Исправление скомпилированной версии
- 26. C++ Скомпилированной Заголовок Disabled
- 27. Microsoft.SqlServer.Management.Smo и его братья работают над SQL2000?
- 28. Кнопки UIToolBar не работают над UITableView
- 29. Resque Рабочие не работают над правом DB
- 30. Некоторые HTML-коды не работают над IE8
При настройке точки останова вы фактически записываете специальный код операции 'int3' в заданную позицию в коде, который будет останавливать выполнение. – Cyclonecode