Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Отладка приложения проще, если вы можете проанализировать источник кода, а не разобранные двоичные файлы.
WinDbg, CDB и KD могут использовать исходный код в отладке, если исходный язык — C, C++или сборка.
Требования к компиляции
Чтобы использовать отладку исходного кода, необходимо обеспечить создание файлов символов (.pdb-файлы) при построении двоичных файлов. Эти файлы символов показывают отладчику, как двоичные инструкции соответствуют исходным строкам.
Кроме того, отладчик должен иметь доступ к фактическим исходным файлам, так как файлы символов не содержат фактический исходный текст.
Если это возможно, компилятор и компоновщик не должны ваш код оптимизировать. Отладка и доступ к локальным переменным сложнее, а иногда и почти невозможно, если код оптимизирован. Если вы используете утилиту сборки в качестве компилятора и компоновщика, задайте для макроса MSC_OPTIMIZATION значение /Od /Oi, чтобы избежать оптимизации.
Определение местоположения файлов символов и исходных файлов
Для отладки в исходном режиме отладчик должен находить исходные файлы и файлы символов. Дополнительные сведения см. в пути источника .
начало отладки источника
Отладчик может отображать исходные сведения всякий раз, когда у него есть правильные символы и исходные файлы для отлаживаемого потока.
Если вы запускаете новое приложение в пользовательском режиме с помощью отладчика, начальная остановка происходит, когда Ntdll.dll загружает приложение. Так как отладчик не имеет доступа к Ntdll.dll исходным файлам, вы не сможете получить доступ к исходной информации для приложения на данный момент.
Чтобы переместить счетчик программы в начало приложения, добавьте точку останова в точку входа в бинарный файл. В командном окне отладчика введите следующую команду.
bp main
g
Затем приложение загружается и останавливается при входе в основную функцию . (Конечно, можно использовать любую точку входа, а не только основной.)
Если приложение создает исключение, оно переходит в режим отладки. Исходные сведения доступны на этом этапе. Однако, если вы вызываете перерыв с помощью CTRL+C, CTRL+BREAKили команды Отладка | Останова, отладчик создает новый поток, поэтому вы не видите свой исходный код.
После того как вы достигнете потока, для которого есть исходные файлы, можно использовать окно команд отладчика для выполнения команды отладки исходного кода. Если вы используете WinDbg, появится окно источника . Если вы уже открыли окно источника, щелкнув Открыть файл с исходным кодом в меню Файл, WinDbg обычно создаёт новое окно для исходного кода. Вы можете закрыть предыдущее окно, не влияя на процесс отладки.
Отладка исходного кода в графическом интерфейсе WinDbg
Если вы используете WinDbg, окно источника появится, как только счетчик программы находится в коде, для которому отладчик имеет исходные сведения.
WinDbg отображает одно окно исходного кода для каждого исходного файла, открытого вами или WinDbg. Дополнительные сведения о свойствах текста этого окна см. в исходной версии Windows.
Затем можно пошагово выполнить приложение или выполнить его до точки останова или курсора. Дополнительные сведения о командах пошаговой проверки и трассировки см. в разделе Управление целью.
Если вы находитесь в исходном режиме, соответствующее окно "Источник" перемещается на передний план по мере перехода к приложению. Поскольку во время выполнения приложения выполняются также подпрограммы Microsoft Windows, отладчик может вывести окно дизассемблера на передний план при возникновении таких вызовов (так как отладчик не имеет доступа к исходному коду этих функций). Когда счетчик программы возвращается в известные исходные файлы, соответствующее окно источника становится активным.
Во время работы с приложением WinDbg подсвечивает ваше местоположение в окне «Источник» и окне «Дизассембли». Строки, на которых установлены точки останова, также подсвечены. Исходный код цветен в соответствии с анализом языка. Если выбрано окно источника, вы можете навести указатель мыши на символ, чтобы оценить его. Дополнительные сведения об этих функциях и о том, как ими управлять, см. в разделе Source Windows.
Чтобы активировать режим источника в WinDbg, используйте команду l+t, щелкните режим источника в меню отладки или нажмите режим источника на кнопке. Если режим источника активен , индикатор ASM отображается недоступным в строке состояния.
Вы можете просматривать или изменять значения любых локальных переменных при пошаговом переходе через функцию в исходном режиме. Для получения дополнительной информации см. Чтение и запись памяти.
отладка исходного кода в командном окне отладчика
Если вы используете CDB, у вас нет отдельного окна источника. Тем не менее, вы по-прежнему можете просматривать ход выполнения по мере прохождения исходного кода.
Прежде чем выполнять отладку исходного кода в CDB, необходимо загрузить символы строк исходного кода, выполнив команду .lines (Toggle Source Line Support) или запустить отладчик с параметром командной строки -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* (Память дисплея) и e* (Ввод значений).
Если необходимо просмотреть каждую инструкцию сборки для определения смещения или сведений о памяти, используйте l-t, чтобы выполнить инструкции по сборке вместо исходных строк. Сведения об исходной строке по-прежнему можно отобразить. Каждая исходная строка соответствует одной или нескольким инструкциям сборки.
Все эти команды доступны в WinDbg и в CDB. Команды можно использовать для просмотра сведений об исходной строке из командного окна отладчика WinDbg, а не из окна исходного кода.
исходные строки и смещения
Вы также можете выполнить отладку источника с помощью вычислителя выражений, чтобы определить смещение, соответствующее определенной исходной строке.
Следующая команда отображает смещение памяти.
? `[[module!]filename][:linenumber]`
Если вы не укажете имя файла, отладчик будет искать исходный файл, соответствующий текущему адресу команды.
Отладчик считывает номер строки как десятичное число, если вы не добавите 0x перед ним, независимо от текущей системы счисления. Если вы пропустите номер строки , выражение вычисляется до начального адреса исполняемого файла, соответствующего исходному файлу.
Синтаксис понимается в 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).