2008-10-19 10 views
137

Я продолжаю задаваться вопросом, как работает отладчик? Particulary - тот, который может быть «прикреплен» к уже запущенному исполняемому файлу. Я понимаю, что компилятор переводит код на машинный язык, но тогда как отладчик «знает», к чему он привязан?Как работает отладчик?

+4

Статья Эли перешла на http://eli.thegreenplace.net/2011/01/23/how-debuggers-work-part-1 – Oktalist 2014-09-04 16:35:00

+0

@Oktalist Эта статья интересна, но говорит только об абстракции уровня API для отладки в Linux. Я думаю, OP хочет узнать больше о том, что под капотом. – smwikipedia 2017-04-28 08:04:13

ответ

74

Сведения о том, как работает отладчик, будут зависеть от того, что вы отлаживаете и что такое ОС. Для собственной отладки в Windows вы можете найти некоторые сведения о MSDN: Win32 Debugging API.

Пользователь указывает отладчик, какой процесс придаю, либо по имени или идентификатору процесса. Если это имя, отладчик будет искать идентификатор процесса и инициировать сеанс отладки через системный вызов; под Windows это будет DebugActiveProcess.

После подключения отладчик войдет в цикл событий так же, как и для любого пользовательского интерфейса, но вместо событий, поступающих из оконной системы, ОС будет генерировать события на основе того, что происходит в процессе отладки - например, , См. WaitForDebugEvent.

отладчик умеет читать и писать виртуальной памяти целевого процесса, и даже корректировать свои значения регистров через API, предоставляемые операционной системой. См. Список debugging functions для Windows.

отладчик может использовать информацию из файлов символов, чтобы перевести из адресов в имена переменных и местоположения в исходном коде. Информация о файле символа представляет собой отдельный набор API и не является основной частью ОС как таковой. В Windows это через Debug Interface Access SDK.

Если вы отлаживаете управляемую среду (.NET, Java и т. Д.), Процесс, как правило, будет похож, но детали разные, поскольку среда виртуальной машины предоставляет API отладки, а не базовую ОС.

+3

Этот вопрос может показаться глупым, но как ОС отслеживает, если достигнут конкретный адрес внутри программы. Например. точка нарушения устанавливается по адресу 0x7710cafe. По мере изменения указателя инструкции ОС (или, возможно, ЦП) придется сравнивать указатель на инструкцию со всеми адресами точки разрыва, или я ошибаюсь? Как это работает ..? – displayname 2014-01-23 17:09:21

+2

@StefanFalk Я написал [ответ] (http://stackoverflow.com/a/21746853/119527), в котором рассматриваются некоторые детали нижнего уровня (на x86). – 2014-02-13 06:31:12

1

Я понимаю, что при компиляции приложения или DLL-файл, какой бы он компилирует для содержат символы, представляющие функции и переменные.

Если у вас есть отладки сборки, эти символы являются гораздо более подробными, чем когда это сборка выпуска, что позволяет отладчик, чтобы дать вам больше информации. Когда вы присоединяете отладчик к процессу, он смотрит, какие функции в настоящее время обращаются и разрешает здесь все доступные отладочные символы (поскольку он знает, как выглядит внутренняя часть скомпилированного файла, он может определить, что может быть в памяти , с содержимым ints, float, strings и т. д.). Как и первый плакат, эта информация и то, как эти символы работают, сильно зависит от среды и языка.

9

Если вы находитесь на ОС Windows, большой ресурс для этого будет "Отладка приложений для Microsoft .NET и Microsoft Windows" Джон Роббинс:

(или даже старшее издание: "Debugging Applications")

В книге есть глава о том, как работает отладчик, который включает в себя код для нескольких простых (но работающих) отладчиков.

Поскольку я не знаком с деталями отладки Unix/Linux, этот материал не может применяться на всех других ОС. Но я предполагаю, что в качестве введения к очень сложному вопросу концепции - если не детали и API - должны «порт» для большинства ОС.

23

В Linux отладка процесса начинается с системного вызова ptrace(2). This article имеет отличный учебник по использованию ptrace для реализации некоторых простых конструкций отладки.

3

Другим ценным источником для понимания отладки является руководство по процессору Intel (архитектуры Intel® 64 и IA-32 Руководство для разработчиков программного обеспечения). В томе 3A, глава 16, он представил аппаратную поддержку отладки, такую ​​как специальные исключения и аппаратные отладочные регистры. Ниже приведена следующая глава:

T (ловушка) флаг, TSS - генерирует исключение отладки (#DB), когда попытка сделана для переключения на задание с флагом T, установленным в его TSS.

Я не уверен, использует ли этот Window или Linux этот флаг или нет, но очень интересно прочитать эту главу.

Надеюсь, это поможет кому-то.

44

Как я понимаю:

Для программных точек останова на x86, отладчик заменяет первые байты команды с CC (int3). Это делается с помощью WriteProcessMemory на Windows. Когда процессор получает эту команду и выполняет команду int3, это заставляет ЦП генерировать исключение отладки. ОС получает это прерывание, понимает, что процесс отлаживается, и уведомляет процесс отладчика о том, что точка останова была удалена.

После того, как точка останова удалена и процесс остановлен, отладчик просматривает список контрольных точек и заменяет CC байт, который был там первоначально. Отладчик устанавливает TF, the Trap Flag в EFLAGS (путем изменения CONTEXT) и продолжает процесс. Флаг Trap заставляет CPU автоматически генерировать одноэтапное исключение (INT 1) в следующей инструкции.

Когда процесс отладки прекращается в следующий раз, отладчик снова заменяет первый байт инструкции точки останова на CC, и процесс продолжается.

Я не уверен, что это точно так, как это реализовано всеми отладчиками, но я написал программу Win32, которая сама отлаживается с помощью этого механизма. Совершенно бесполезный, но образовательный.