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


Отладка в исходном режиме

Отладка приложения проще, если можно проанализировать источник кода, а не дизассемблированное двоичные файлы.

WinDbg, CDB и KD могут использовать исходный код при отладке, если исходный язык — C, C++ или сборка.

Требования к компиляции

Чтобы использовать отладку исходного кода, необходимо, чтобы компилятор или компоновщик создавали файлы символов (PDB-файлы) при сборке двоичных файлов. Эти файлы символов показывают отладчику, как двоичные инструкции соответствуют исходным строкам.

Кроме того, отладчик должен иметь доступ к фактическим исходным файлам , так как файлы символов не содержат фактический исходный текст.

Если это возможно, компилятор и компоновщик не должны оптимизировать код. Отладка исходного кода и доступ к локальным переменным являются более сложными, а иногда и почти невозможными, если код был оптимизирован. Если вы используете служебную программу Сборка в качестве компилятора и компоновщика, задайте для макроса MSC_OPTIMIZATION значение /Od /Oi , чтобы избежать оптимизации.

Поиск файлов символов и исходных файлов

Для отладки в исходном режиме отладчик должен иметь возможность найти исходные файлы и файлы символов. Дополнительные сведения см. в разделе Исходный путь.

Начало отладки исходного кода

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

Если вы запускаете новое приложение в пользовательском режиме с помощью отладчика, начальный перерыв происходит при загрузке приложения Ntdll.dll. Так как отладчик не имеет доступа к Ntdll.dll исходным файлам, на этом этапе вы не сможете получить доступ к исходным сведениям для приложения.

Чтобы переместить счетчик программы в начало приложения, добавьте точку останова в точке входа в двоичный файл. В окне Команда отладчика введите следующую команду.

bp main
g

Затем приложение загружается и останавливается при вводе функции main. (Конечно, можно использовать любую точку входа, а не только main.)

Если приложение создает исключение, оно врывается в отладчик. На этом этапе доступны исходные сведения. Однако при возникновении прерывания с помощью клавиш CTRL+C, CTRL+BREAK или Отладка | При выполнении команды отладчик создает новый поток, поэтому исходный код не отображается.

После достижения потока, для которых у вас есть исходные файлы, можно использовать окно Команды отладчика для выполнения команд отладки исходного кода. Если вы используете WinDbg, откроется окно Источник . Если вы уже открыли окно Исходный код, щелкнув Open Source File (Файл с открытым исходным кодом ) в меню Файл , WinDbg обычно создает новое окно для источника. Вы можете закрыть предыдущее окно, не влияя на процесс отладки.

Отладка исходного кода в графическом интерфейсе WinDbg

Если вы используете WinDbg, окно Источник появляется сразу после того, как счетчик программы находится в коде, для которого отладчик содержит сведения об источнике.

WinDbg отображает по одному окну источника для каждого исходного файла, который вы или WinDbg открыли. Дополнительные сведения о свойствах текста этого окна см. в разделе Исходные окна.

Затем можно выполнить пошаговое выполнение приложения или до точки останова или до курсора. Дополнительные сведения о командах пошагового выполнения и трассировки см. в разделе Управление целевым объектом.

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

При перемещении по приложению WinDbg выделяет ваше расположение в окне Источник и в окне Дизассемблировать. Также выделяются линии, для которых задаются точки останова. Исходный код окрашен в соответствии с анализом языка. Если выбрано окно Источник, можно навести указатель мыши на символ, чтобы оценить его. Дополнительные сведения об этих функциях и способах управления ими см. в разделе Source Windows.

Чтобы активировать режим источника в WinDbg, используйте команду l+t , выберите режим источника в меню отладки или нажмите кнопку режим источника . Если режим источника активен, индикатор ASM отображается недоступным в строке состояния.

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

Отладка исходного кода в командном окне отладчика

Если вы используете CDB, у вас нет отдельного окна "Источник". Тем не менее, вы по-прежнему можете просматривать ход выполнения при пошаговом выполнении исходного кода.

Перед отладкой исходного кода в CDB необходимо загрузить символы исходной строки, выполнив команду .lines (переключить поддержку исходной строки) или запустив отладчик с параметром командной строки -lines.

При выполнении команды l+t все шаги программы выполняются по одной исходной строке за раз. Используйте l-t , чтобы выполнить по одной инструкции сборки за раз. Если вы используете WinDbg, эта команда действует так же, как выбор или очистка режима источника в меню Отладка или использование кнопок панели инструментов.

Команда l+s отображает текущую исходную строку и номер строки в командной строке. Если вы хотите увидеть только номер строки, используйте вместо нее l+l .

Если вы используете l+o и l+s, во время пошагового выполнения программы отображается только исходная строка. Счетчик программы, код дизассембла и сведения о регистре скрыты. Такой вид отображения позволяет быстро выполнить пошаговое выполнение кода и просмотреть только исходный код.

С помощью команды lsp (Задать количество исходных строк) можно указать точное количество исходных строк, отображаемых при пошаговом выполнении или выполнении приложения.

Следующая последовательность команд является эффективным способом пошагового выполнения исходного файла.

.lines        enable source line information
bp main       set initial breakpoint
l+t           stepping will be done by source line
l+s           source lines will be displayed at prompt
g             run program until "main" is entered
pr            execute one source line, and toggle register display off
p             execute one source line 

Так как ВВОД повторяет последнюю команду, теперь можно выполнить пошаговое выполнение приложения с помощью клавиши ВВОД. Каждый шаг приводит к отображению исходной строки, смещения памяти и кода сборки.

Дополнительные сведения о том, как интерпретировать дизассемблированное отображение, см. в разделе Отладка в режиме сборки.

При отображении кода сборки любое расположение памяти, к которому осуществляется доступ, отображается в правом конце строки. Для просмотра или изменения значений в этих расположениях можно использовать команды d* (display Memory) и e* (ввод значений ).

Если вам нужно просмотреть каждую инструкцию сборки для определения смещения или сведений о памяти, используйте l-t для пошаговые инструкции по сборке вместо исходных строк. Сведения об исходной строке по-прежнему могут отображаться. Каждая исходная строка соответствует одной или нескольким инструкциям сборки.

Все эти команды доступны в WinDbg и CDB. Команды можно использовать для просмотра сведений об исходной строке из командного окна отладчика WinDbg, а не из окна Источник.

Исходные строки и смещения

Вы также можете выполнить отладку источника с помощью средства оценки выражений, чтобы определить смещение, соответствующее определенной строке источника.

Следующая команда отображает смещение памяти.

? `[[module!]filename][:linenumber]` 

Если опустить имя файла, отладчик ищет исходный файл, соответствующий текущему счетчику программы.

Отладчик считывает текст в виде десятичного числа, если перед ним не будет добавлено значение 0x , независимо от текущего радикса по умолчанию. Если вы опустите параметр linenumber, выражение вычисляется как начальный адрес исполняемого файла, соответствующего исходному файлу.

Этот синтаксис понимается в CDB, только если команда .lines или параметр командной строки -lines загрузили символы исходной строки.

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

bp `source.c:31` 

Дополнительные сведения см. в разделах Синтаксис исходной строки и Использование точек останова.

Пошаговое выполнение и трассировка в исходном режиме

При отладке в исходном режиме в одной исходной строке может быть несколько вызовов функций. Для разделения этих вызовов функций нельзя использовать команды p и t .

Например, в следующей команде команда t выполняет шаги в GetTickCount и printf, а команда p выполняет шаги по обоим вызовам функций.

printf( "%x\n", GetTickCount() );

Если вы хотите перешаговить определенные вызовы при трассировке на другие вызовы, используйте .step_filter (Задать фильтр шагов), чтобы указать, какие вызовы следует выполнить.

Вы можете использовать _step_filter для фильтрации функций платформы (например, вызовы Microsoft Foundation Classes (MFC) или БИБЛИОТЕКи активных шаблонов (ATL).