Отличная статья, спасибо.
Но стоило бы затронуть также темы установки/перехвата харварных точек останова под Windows (SetHardwareBreakpoint) и Linux (register_user_hw_breakpoint/register_kernel_hw_breakpoint).
www.computer-museum.ru/histussr/istr4816.htm
Наш родной «Счетмаш» выпускал… Вот там — отладчик. Хардварный. Это чудо бы в современном железе исполнить — для дебага сему детищу цены не было бы…
а можете рассказать, что там было такого особенного? из интервью я не понял =)
// я сам считаю, что к отладчику нужно прибегать только в совершенно безвыходных ситуациях. крэшдамп там изучить, повреждение памяти за хвост схватить… как Фейнман чинил радиоприемники «думаньем», так и я предпочитаю чинить программы думаньем (ну и протыкиванием assertов во все щели) =)
Отдельные термины нужны, когда обычными словами сложно отобразить нюансы. В данном случае «точка остановки» достаточно полно раскрывает суть. По сути, «точка останова» — чистейшей воды выпендрёж, создание термина ради создания термина.
В общем, термин устоявшийся, но, на мой взгляд, совершенно бесполезный.
Я думаю в советские годы термин «точка останова» произошел от названия инженерного приспособления «останова». Ведь многие связанные с ЭВМ в те годы имели именно инженерное образование.
Потому что термин останов был введен еще в 70е годы и присутствует во всей русскоязычной литературе. И подозреваю что введен он был не просто так. Остановка может быть по разным причинам. А «останов» определен однозначно. Не хватало еще каждый раз переспрашивать, что имелось в виду
на ассемблере кратко и понятно, но в user space не работает (как я написал, и даже пример ассемблера привел) — mov инструкции работающие с отладочными регистрами требуют нулевого уровня привилегий =)
Предположим мы пишем JIT компилятор и хотим выставлять точки останова внутри генерируемого им кода. Оказывается для этого достаточно вставить в поток кода всего лишь одну инструкцию int 3 в тех местах, в которых мы хотели бы остановить исполнение программы.
Как мы видим ничего сложного в ручной расстановке instruction breakpoints нет. Можно даже реализовывать их интерактивное включение-выключение: достаточно запоминать их позиции и заменять ненужные на пустую инструкцию nop (0x90).
Гораздо интереснее дело обстоит с другим типом точек останова — точками останова на доступ к памяти.
…
Допустим мы отлаживаем повреждение памяти в среде исполнения с копирующим сборщиком мусора, который постоянно компактифицирует кучу и всякими другими способами тасует объекты в памяти. Мы смогли выяснить приблизительно какое поле в каком объекте повреждается, но просто загрузить программу в отладчик и поставить им точку останова на доступ к этому полю не получается, потому что GC постоянно путается под ногами своими перемещениями. Поэтому у нас возникает разумное желание, чтобы сам добряк Сборщик Мусора и выставлял/обновлял этот бряк.
Точки останова на ручной тяге (для архитектуры x86)