Just in time debugging что это такое

от admin

Just-in-Time debugging

Имеется интересная опция отладки Just-in-Time debugging (назовем ее отладкой здесь-и-теперь). При отладке здесь-и-теперь ваше приложение работает вне интегрированной среды Visual C++, пока не происходит ошибки. При ошибке программы автоматически запускается отладчик Visual C++. Чтобы построить программу с возможностью отладки здесь-и-теперь, нужно сделать следующее:

1. Выберите Options в меню Tools.

2. Выберите закладку Debug.

3. Пометьте флажок Just-in-Time debugging.

5. В меню Build выполните Build <имя проекта>.exe.

Чтобы активировать отладку здесь-и-теперь в Windows NT, программист должен иметь привилегии администратора.

Страница Debug в окне Options

Отладчик очень гибок в отношении форматирования выводимых данных. В то время как многие опции можно менять «на ходу», иногда предпочтителен единообразный формат вывода. Рис.8показывает страницу Debug окна Орtions для установки таких предопределенных форматов. К странице Debug можно обратиться через меню Tools | Options. Имеющиеся на странице установки описываются в следующих параграфах.

Рис.8 Страница Tools | Options | Debug.

В табл.5 даны комментарии к флагам опций отладчика MS VC++6.0.

Таблица 5. Опции Debug.

При установке этого флажка все выводимые значения представляются, а вводимые пользователем воспринимаются как шестнадцатеричные. Когда флажок помечен, обычные десятичные значения можно вводить с префиксом On, например Оn123456789.

При установке флажка вывод вашего исходного кода сопровождается параллельным переводом на язык ассемблера.

При установке с каждой инструкцией ассемблера ассоциируются байты машинного кода.

Опция выводит в окне Disassembly символические имена адресов.

Опция выводит в окне стека вызовов все значения, переданные в параметрах функций.

Опция выводит в окне стека вызовов информацию о типах переданных функции параметров.

Опция отображает в окне Variables значения, возвращаемые функциями.

Load COFF & Exports

Опция позволяет отладчику при отсутствии отладочной информации загру­жать COFF-формат или экспортируемые символы DLL.

Окно Address позволяет указать начальный адрес по умолчанию для окна Memory Dump.

Этот список позволяет выбрать формат по умолчанию для типа данных в окне дампа памяти; доступно 13 форматов, таких как ASCII, Byte, Long, Real и Int64.

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

Show data bytes

Отображаются сырые байту данных.

Указывает формат фиксированной ширины для окна Memory Dump. Работает совместно со списком Format.

Display Unicode strings

Отображает строки формата Unicode. Это полезно, когда отлаживаемое приложение вводит и выводит тексты в многоязыковых форматах.

View floating point registers

Отображает в окне Registers содержимое регистров плавающей арифметики.

Построенная с такой опцией программа может выполняться вне среды Visual Studio, загружая отладчик Visual C++ только при возникновении ошибки.

OLE RFC debugging

Позволяет отлаживать вызовы удаленных процедур.

Debug commands invoke Edit and Continue

Когда этот флажок установлен, многие, хотя и не все изменения исходного кода могут автоматически вноситься в исполняемый модуль программы при исполнении таких команд, как Go, Step Into, Step Over или Run.

Name already in use

visualstudio-docs / docs / debugger / debug-using-the-just-in-time-debugger.md

  • Go to file T
  • Go to line L
  • Copy path
  • Copy permalink

15 contributors

Users who have contributed to this file

  • Open with Desktop
  • View raw
  • Copy raw contents Copy raw contents

Copy raw contents

Copy raw contents

Debug using the Just-In-Time Debugger in Visual Studio

Just-In-Time debugging can launch Visual Studio automatically when an app running outside Visual Studio errors or crashes. With Just-In-Time debugging, you can test apps outside of Visual Studio, and open Visual Studio to begin debugging when a problem occurs.

Just-In-Time debugging works for Windows desktop apps. It does not work for Universal Windows Apps, or for managed code that is hosted in a native application, such as Visualizers.

[!TIP] If you just want to stop the Just-In-Time Debugger dialog box from appearing, but don’t have Visual Studio installed, see Disable the Just-In-Time Debugger. If you once had Visual Studio installed, you may need to disable Just-In-Time debugging from the Windows registry.

Enable or disable Just-In-Time debugging in Visual Studio

[!NOTE] To enable or disable Just-In-Time debugging, you must be running Visual Studio as an administrator. Enabling or disabling Just-In-Time debugging sets a registry key, and administrator privileges may be required to change that key. To open Visual Studio as an administrator, right-click the Visual Studio app and choose Run as administrator.

You can configure Just-In-Time debugging from the Visual Studio Tools > Options (or Debug > Options) dialog box.

To enable or disable Just-In-Time debugging:

On the Tools or Debug menu, select Options > Debugging > Just-In-Time.

Enable or disable JIT debugging

[!NOTE] If the Just-In-Time menu option is not shown, make sure the Just-In-Time debugger is installed using the Visual Studio Installer.

In the Enable Just-In-Time debugging for these types of code box, select the types of code you want Just-In-Time debugging to debug: Managed, Native, and/or Script.

Select OK.

If you enable the Just-In-Time debugger, but it doesn’t open when an app crashes or errors, see Troubleshoot Just-In-Time debugging.

Disable Just-In-Time debugging from the Windows registry

Just-In-Time debugging may still be enabled even if Visual Studio is no longer installed on your computer. If Visual Studio is no longer installed, you can disable Just-In-Time debugging by editing the Windows registry.

To disable Just-In-Time debugging by editing the registry:

From the Windows Start menu, run the Registry Editor (regedit.exe).

In the Registry Editor window, locate and delete the following registry entries if they exist:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\DbgManagedDebugger

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger

. image type=»content» source=»../debugger/media/dbg-jit-registry.png» alt-text=»JIT registry key» border=»true».

Also delete the following registry entries if they exist:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\DbgManagedDebugger

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger

Make sure not to delete or change any other registry keys.

Close the Registry Editor window.

Enable Just-In-Time debugging of a Windows Form

By default, Windows Form apps have a top-level exception handler that lets the app keep running if it can recover. If a Windows Forms app throws an unhandled exception, it shows the following dialog:

Windows Form unhandled exception

To enable Just-In-Time debugging instead of standard Windows Form error handling, add these settings:

In the system.windows.forms section of the machine.config or <app name>.exe.config file, set the jitDebugging value to true :

In a C++ Windows Form application, also set DebuggableAttribute to true in a .config file or in your code. If you compile with /Zi and without /Og, the compiler sets this attribute for you. If you want to debug a non-optimized release build, however, you must set DebuggableAttribute by adding the following line in your app’s AssemblyInfo.cpp file:

For more information, see xref:System.Diagnostics.DebuggableAttribute.

Use Just-In-Time debugging

This example walks you through Just-In-Time debugging when an app throws an error.

You must have Visual Studio installed to follow these steps. If you don’t have Visual Studio, you can download the free Visual Studio Community Edition.

Make sure Just-In-Time debugging is enabled in Tools > Options > Debugging > Just-In-Time.

For this example, you’ll make a C# console app in Visual Studio that throws a NullReferenceException.

In Visual Studio, create a C# console app (File > New > Project > Visual C# > Console Application) named ThrowsNullException. For more information about creating projects in Visual Studio, see Walkthrough: Create a simple application.

When the project opens in Visual Studio, open the Program.cs file. Replace the Main() method with the following code, which prints a line to the console and then throws a NullReferenceException:

To build the solution, choose either the Debug (default) or Release configuration, and then select Build > Rebuild Solution.

  • Choose Debug configuration for the full debugging experience.
  • If you select Release configuration, you must turn off Just My Code for this procedure to work. Under Tools > Options > Debugging, deselect Enable Just My Code.

For more information about build configurations, see Understanding build configurations.

Open the built app ThrowsNullException.exe in your C# project folder (. \ThrowsNullException\ThrowsNullException\bin\Debug or . \ThrowsNullException\ThrowsNullException\bin\Release).

You should see the following command window:

Screenshot of the console for ThrowsNullException.exe, which throws an unhandled null reference exception (System.NullReferenceException).

The Choose Just-In-Time Debugger dialog opens.

Screenshot of the Choose Just-In-Time Debugger dialog box, which appears after the exception appears in the ThrowsNullException.exe console window.

Under Available Debuggers, select New instance of <your preferred Visual Studio version/edition>, if not already selected.

Select OK.

The ThrowsNullException project opens in a new instance of Visual Studio, with execution stopped at the line that threw the exception:

Screenshot of the ThrowsNullException project in Visual Studio, with highlighting of the line of source code that threw the exception.

You can start debugging at this point. If you were debugging a real app, you would need to find out why the code is throwing the exception.

[!CAUTION] If your app contains untrusted code, a security warning dialog box appears, enabling you to decide whether to proceed with debugging. Before you continue debugging, decide whether you trust the code. Did you write the code yourself? If the application is running on a remote machine, do you recognize the name of the process? If the app is running locally, consider the possibility of malicious code running on your computer. If you decide the code is trustworthy, select OK. Otherwise, select Cancel.

Troubleshoot Just-In-Time debugging

If Just-In-Time debugging doesn’t start when an app crashes, even though it is enabled in Visual Studio:

Windows Error Reporting could be taking over the error handling on your computer.

To fix this issue, use Registry Editor to add a DWORD Value of Disabled, with Value data of 1, to the following registry keys:

HKEY_LOCAL_MACHINE\Software\WOW6432Node\Microsoft\Windows\Windows Error Reporting

(For 32-bit machines) HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Windows Error Reporting

For more information, see .WER settings.

A known Windows issue may be causing the Just-In-Time debugger to fail.

The fix is to add a DWORD Value of Auto, with Value data of 1, to the following registry keys:

HKEY_LOCAL_MACHINE\Software\WOW6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug

(For 32-bit machines) HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug

You might see the following error messages during Just-In-Time debugging:

Unable to attach to the crashing process. The specified program is not a Windows or MS-DOS program.

The debugger tried to attach to a process running under another user.

To work around this problem, in Visual Studio, open Debug > Attach to Process (or press Ctrl + Alt + P), and find the process you want to debug in the Available Processes list. If you do not know the name of the process, find the Process ID in the Visual Studio Just-In-Time Debugger dialog. Select the process in the Available Processes list, and select Attach. Select No to dismiss the Just-In-Time debugger dialog.

Debugger could not be started because no user is logged on.

There is no user logged onto the console, so there is no user session to display the Just-In-Time debugging dialog.

To fix this problem, log onto the machine.

Class not registered.

The debugger tried to create a COM class that is not registered, probably due to an installation problem.

To fix this problem, use the Visual Studio Installer to reinstall or repair your Visual Studio installation.

Just in time debugging что это такое

Имеется интересная опция отладки Just-in-Time debugging (назовем ее отладкой здесь-и-теперь). При отладке здесь-и-теперь ваше приложение работает вне интегрированной среды Visual C++, пока не происходит ошибки. При ошибке программы автоматически запускается отладчик Visual C++. Чтобы построить программу с возможностью отладки здесь-и-теперь, нужно сделать следующее:

1. Выберите Options в меню Tools.

2. Выберите закладку Debug.

3. Пометьте флажок Just-in-Time debugging.

5. В меню Build выполните Build <имя проекта>.exe.

Чтобы активировать отладку здесь-и-теперь в Windows NT, программист должен иметь привилегии администратора.

Страница Debug в окне Options

Отладчик очень гибок в отношении форматирования выводимых данных. В то время как многие опции можно менять «на ходу», иногда предпочтителен единообразный формат вывода. Рис.8показывает страницу Debug окна Орtions для установки таких предопределенных форматов. К странице Debug можно обратиться через меню Tools | Options. Имеющиеся на странице установки описываются в следующих параграфах.

Рис.8 Страница Tools | Options | Debug.

В табл.5 даны комментарии к флагам опций отладчика MS VC++6.0.

Таблица 5. Опции Debug.

При установке этого флажка все выводимые значения представляются, а вводимые пользователем воспринимаются как шестнадцатеричные. Когда флажок помечен, обычные десятичные значения можно вводить с префиксом On, например Оn123456789.

При установке флажка вывод вашего исходного кода сопровождается параллельным переводом на язык ассемблера.

При установке с каждой инструкцией ассемблера ассоциируются байты машинного кода.

Опция выводит в окне Disassembly символические имена адресов.

Опция выводит в окне стека вызовов все значения, переданные в параметрах функций.

Опция выводит в окне стека вызовов информацию о типах переданных функции параметров.

Опция отображает в окне Variables значения, возвращаемые функциями.

Load COFF & Exports

Опция позволяет отладчику при отсутствии отладочной информации загру­жать COFF-формат или экспортируемые символы DLL.

Окно Address позволяет указать начальный адрес по умолчанию для окна Memory Dump.

Этот список позволяет выбрать формат по умолчанию для типа данных в окне дампа памяти; доступно 13 форматов, таких как ASCII, Byte, Long, Real и Int64.

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

Show data bytes

Отображаются сырые байту данных.

Указывает формат фиксированной ширины для окна Memory Dump. Работает совместно со списком Format.

Display Unicode strings

Отображает строки формата Unicode. Это полезно, когда отлаживаемое приложение вводит и выводит тексты в многоязыковых форматах.

View floating point registers

Отображает в окне Registers содержимое регистров плавающей арифметики.

Построенная с такой опцией программа может выполняться вне среды Visual Studio, загружая отладчик Visual C++ только при возникновении ошибки.

OLE RFC debugging

Позволяет отлаживать вызовы удаленных процедур.

Debug commands invoke Edit and Continue

Когда этот флажок установлен, многие, хотя и не все изменения исходного кода могут автоматически вноситься в исполняемый модуль программы при исполнении таких команд, как Go, Step Into, Step Over или Run.

Возможности встроенного отладчика Visual C++

Встроенный отладчик Visual C++ – это мощный и удобный инструмент, оказывающий неоценимую помощь в процессе поиска и устранения ошибок в программе. Прежде чем изучать конкретные техники отладки, необходимо ознакомиться с его возможностями.

Как работает отладчик

В отладке принимают участие два процесса – отладчик (debugger) и отлаживаемый (debuggee). Отладчик имеет полный контроль над отлаживаемым процессом. Он может приостанавливать и возобновлять его потоки, читать или изменять память и регистры процессора и т. д. Кроме того, отладчик получает уведомления обо всех важных событиях, которые происходят в отлаживаемом процессе. К таким событиям относятся запуск или завершение новых процессов и потоков, загрузка и выгрузка DLL, исключения, а также вывод отладочной информации посредством функции OutputDebugString . В случае возникновения одного из этих событий отлаживаемый процесс приостанавливается и ждёт, пока отладчик не выполнит необходимые действия и возобновит его работу. Завершение отладчика приводит к завершению отлаживаемого процесса.

Точки останова

Точки останова (breakpoints) играют важную роль в отладке приложений. На самом деле, точка останова – это некоторое условие (например, достижение определённой команды в программе), при выполнении которого возбуждается исключение EXCEPTION_BREAKPOINT (0x80000003). Как мы уже знаем, исключение приводит к тому, что отлаживаемый процесс приостанавливается, а отладчик получает управление. В частности, он может считать текущие значения регистров процессора и ячеек памяти и выдать их на экран для анализа. После этого он может возобновить выполнение отлаживаемого процесса по команде программиста.

Для реализации точек останова в Visual C++ используется специальная инструкция процессора ( int 3 на процессорах Intel ). Выполнение этой инструкции приводит к исключению EXCEPTION_BREAKPOINT . Установить точку останова можно в любом месте программы. Для этого отладчик записывает по соответствующему адресу инструкцию int 3 (1 байт с кодом 0xCC). Очевидно, что это можно сделать и вручную, вставив в программу инструкцию __asm int 3 . Можно также использовать функцию DebugBreak из Win32 API. Ниже мы увидим, для чего применяется этот приём.

В современных процессорах Intel существуют отладочные регистры (DR0-DR7), которые позволяют установить до 4 аппаратных точек останова. Visual C++ использует эти регистры, но когда их количества оказывается недостаточно, их функциональность эмулируется посредством int 3 .

С помощью точек останова в отладчике Visual C++ реализовано множество полезных возможностей, например, пошаговая отладка (режим, в котором пользователь может выполнять по одной инструкции отлаживаемой программы за раз).

Отладочные символы

Конечно, возможность читать данные из памяти отлаживаемого процесса полезна. Но для программиста на C++ гораздо удобнее просматривать значения переменных, а не безликих ячеек памяти. Пошаговую отладку также гораздо удобнее выполнять по исходному тексту программы, а не по ассемблерному листингу. Чтобы это стало возможным, применяются отладочные символы (debugging symbols). Эти символы генерируются в процессе построения программы. Существуют различные форматы записи символов. По умолчанию Visual C++ записывает их в отдельный файл с расширением PDB, включая в приложение или DLL абсолютный путь к этому файлу.

PDB-файл содержит информацию, которая позволяет определить адрес любой переменной, функции или строки кода. Возможно и обратное преобразование. Кроме того, в PDB-файл включается информация о типах. Благодаря этому отладчик может не только считать из памяти значение переменной, но и выдать это значение на экран в определённом виде (в зависимости от типа переменной). Пошаговая отладка по исходному тексту также становится возможна (при условии, что у вас есть этот исходный текст, так как он не включается в PDB-файл).

Обратите внимание, что отладочные символы хранятся отдельно для каждого модуля (EXE или DLL). Вполне возможна ситуация, когда отладочные символы доступны для DLL, которую загружает приложение, но не для самого приложения. В этом случае код DLL можно будет отлаживать на уровне исходных текстов, а код приложения – на уровне ассемблера.

Настройка отладки

Для настройки отладки используется закладка Debug в окне Project->Settings . На этой закладке можно выбрать две категории: General и Additional DLLs . Первая категория используется для задания общих параметров отладки (рис. 1).

Рисунок 1. Настройка отладки, категория General

Здесь вы можете задать следующие параметры.

В категории Additional DLLs задаются модули, для которых необходимо принудительно загрузить отладочные символы (рис. 2).

Рисунок 2. Настройка отладки, категория Additional DLLs

Зачем это может понадобиться, спросите вы. Дело в том, что сразу после запуска отлаживаемого процесса отладчик пытается установить в нём заданные вами точки останова. Для этого ему требуются отладочные символы модулей, в которых эти точки устанавливаются Символы exe-файла приложения и подключаемых к нему при запуске DLL отладчик загружает сразу. Но символы DLL, которые будут загружены в программу позже (это касается явно загружаемых DLL, внутрипроцессных COM-серверов и т.п.), по умолчанию не загружаются. Это приведёт к сообщению “One or more breakpoints cannot be set and have been disabled”, когда отладчик попытается установить точки останова в этих DLL, а сами точки будут отключены. Для решения этой проблемы и используется категория Additional DLLs . К этому вопросу мы ещё вернёмся, когда будем обсуждать отладку DLL.

Запуск и прекращение отладки

Чтобы вы могли контролировать выполнение программы и наблюдать её состояние, нужно запустить её под управлением отладчика Visual C++. Для этой цели используются команды из меню Build->Start Debug . Первые три из них ( Go , Step Into и Run to Cursor ) запускают тот процесс, который указан в настройках отладки.

Подключение к уже запущенному процессу

Команда Attach to Process из меню Debug открывает одноименный диалог, позволяющий подключить отладчик к любому уже запущенному процессу (рис. 3). Например, если написанная вами программа вдруг «зависла», можно тут же подключиться к ней и выяснить причину ошибки. Вы можете даже подключиться к оболочке Windows ( explorer.exe ), чтобы изучить её работу с помощью отладчика. Правда, в этом случае вам придётся работать с ассемблером, так как Микрософт не поставляет исходные тексты своей оболочки.

Рисунок 3. Окно Attach To Process

Выбрать нужный процесс можно по заголовку его главного окна (колонка Title) или имени его exe-файла (колонка Process), а если этого недостаточно – по уникальному идентификатору процесса (колонка Process Id). Можно отсортировать процессы по любому из этих признаков, щёлкнув по заголовку соответствующего столбца. Обратите внимание на галочку Show System Processes . Если её установить, в список процессов будут включены системные процессы, такие, как сервисы Windows NT.

Just-in-time debugging

В Visual C++ начиная с версии 4.2 появилась возможность отладки «на лету» (Just-in-time debugging). Благодаря этой возможности отладчик можно подключить к программе именно в тот момент, когда она «упала» (например, из-за ошибки доступа). Вот как выглядит окно Application Error в Windows 2000 (рис. 4).

Рисунок 4. Окно Application Error

Если нажать кнопку Cancel, операционная система запустит отладчик, подключит его к сбойному процессу и предоставит вам возможность найти ошибку в момент её возникновения. Кроме этого, в Windows NT/2000 существует ещё один способ подключить отладчик к существующему процессу. Откройте Task Manager , найдите нужный процесс на закладке Processes , подсветите его в списке и выберите из контекстного меню команду Debug .

Just-in-time debugging работает следующим образом. Путь к отладчику запоминается операционной системой в параметре Debugger . В Windows NT/2000 этот параметр хранится в реестре под ключом HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug , а в Windows 9x – в файле win.ini в секции [AeDebug]. Одновременно на машине может быть только один отладчик, зарегистрированный для Just-in-time debugging. Чтобы прописать туда отладчик Visual C++, откройте окно Tools->Options , перейдите на закладку Debug и установите галочку Just-in-Time Debugging .

Завершение отладки

Сеанс отладки автоматически заканчивается, когда завершается отлаживаемая программа. Кроме этого, отладку можно прекратить в любой момент, вызвав команду Stop Debugging из меню Debug или нажав Shift+F5.

ПРИМЕЧАНИЕ

Здесь и далее для команд отладчика приводятся клавиатурные сокращения, выбранные в Visual C++ по умолчанию. При желании их можно изменить на любые другие.

Точки останова

Как я уже говорил, точки останова играют важную роль в процессе отладки приложения. Visual C++ поддерживает множество разновидностей точек останова. Условием для прерывания программы может быть достижение некоторой команды, изменение глобальной переменной, приход заданного сообщения Windows и т. п. Приостановленную программу можно выполнять в пошаговом режиме, анализировать текущие значения переменных и даже вносить в программу изменения прямо «на лету», не прерывая сеанса отладки.

ПРИМЕЧАНИЕ

Самый простой способ приостановить программу – вызвать команду Break из меню Debug (ей соответствует команда Break Execution на панели инструментов). Иногда это бывает удобно. Если, к примеру, ваша программа вошла в бесконечный цикл, можно прервать её и посмотреть, почему это произошло. Однако в большинстве случаев такой способ недостаточно точен, и вместо него используются точки останова.

Позиционные точки останова

В простейшем случае точка останова жёстко привязывается к строке в программе (такие точки называются позиционными). Позиционную точку останова можно установить прямо в редакторе кода. Для этого нужно поместить курсор на нужной строчке и вызвать команду Debug->Insert/Remove Breakpoint (или нажать F9). Для удаления точки останова используется та же команда.

Установка точки останова на конкретную функцию (метод)

Чтобы поставить точку останова на некоторую функцию (метод), нужно ввести её имя в поле ввода Find на стандартной панели инструментов, а затем нажать F9 ( способ настолько неочевидный, что поначалу был даже принят за ошибку. – прим. ред. ). Кроме того, можно выбрать нужную функцию или метод в окне ClassView , а затем также нажать F9.

Установка точки останова на ассемблерную инструкцию

Такие точки останова устанавливаются в окне Disassembly (о нём мы поговорим немного ниже). Переместитесь к нужному адресу и нажмите F9.

СОВЕТ

Проще всего переместиться к нужному адресу, используя команду Edit->Go To .

Окно Edit->Breakpoints

Окно Breakpoints из меню Edit предоставляет дополнительные возможности для работы с точками останова. В нижней части этого окна находится список уже поставленных точек останова (любую из них можно активизировать, отключить или удалить), а вверху расположены три закладки, предназначенные для установки точек останова различных типов.

Закладка Location

Рисунок 5. Закладка Location

На закладке Location (рис. 5) настраиваются позиционные точки останова. Все рассмотренные выше разновидности точек можно установить и с этой закладки. Местонахождение точки останова указывается в поле Break at в формате:

Здесь «адрес» – это номер строки в программе (ему должен предшествовать символ «@»), адрес ассемблерной инструкции или имя функции (метода). Выражение в фигурных скобках называется контекстом . Можно опускать как отдельные параметры контекста, так и весь контекст целиком. Главное, чтобы при этом не возникало неоднозначности. Если, к примеру, точка останова ставится на строку в программе, необходимо указать файл, в котором эта строка расположена. Иначе возникает неоднозначность.

Для задания местонахождения точки останова можно воспользоваться окном Advanced breakpoint . Чтобы вызвать это окно, щелкните на стрелке справа от поля ввода и выберите пункт Advanced .

В окне Condition можно дополнительно указать условие срабатывания точки останова. Условием может быть любое выражение. Если выражение имеет тип bool , точка останова срабатывает, когда оно истинно; в противном случае она срабатывает при изменении значения выражения.

Бывают случаи, когда точку останова нужно пропустить несколько раз, прежде чем прерывать на ней программу. Специально для этого в окне Condition предусмотрено ещё одно поле, Skip count (в самом низу). С помощью этого поля можно, к примеру, пропустить 10 итераций цикла и прервать программу только на одиннадцатой.

Закладка Data

Рисунок 6. Закладка Data

На закладке Data (рис. 6) устанавливаются точки останова по данным. Их отличие состоит в том, что они могут сработать в любом месте программы, как только изменится (или станет истинным) введённое вами выражение.

Если выражение имеет смысл только в определённом контексте (например, в нём используются локальные переменные какой-либо функции), этот контекст необходимо указать в том же формате, что и для позиционной точки останова. Но здесь уже нужно указать имя функции, а не файла.

Visual C++ позволяет вам контролировать изменение не только отдельных переменных, но и массивов. Рассмотрим следующий фрагмент программы.

Если теперь задать на закладке Data точку останова в виде ‘ array’ , то программа будет прерываться каждый раз, когда хоть один элемент массива array меняет своё значение (в нашем примере – на каждой итерации цикла).

Можно также контролировать не целый массив, а только некоторую его часть. Для этого на закладке Data имеется поле ввода Enter the number of elements to watch in an array or structure . В этом поле задаётся количество элементов массива, которое нужно контролировать. Отсчёт ведётся от элемента массива, к которому вы обращаетесь в выражении (по индексу или указателю).

Вернёмся к нашему примеру. Чтобы отслеживать изменения в первых трёх элементах массива array , нужно задать для точки останова выражение ‘ array[0]’ или ‘ *array’ . Чтобы реагировать на изменения в элементах с третьего по пятый, нужно задать ‘ array[2]’ или ‘ *(array+2)’ . И в том, и в другом случае нужно задать количество контролируемых элементов — три.

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

Точки останова по данным являются мощнейшим отладочным средством. К сожалению, они не всегда работают надёжно. Так, Visual C++ не может отследить изменение переменной-члена класса, если объект этого класса адресуется указателем. Рассмотрим небольшой пример.

Допустим, нам требуется перехватить изменение переменной pa->m_i в 10 строке программы. Можно предположить, что для этого достаточно установить точку останова по данным на выражение pa->m_i . Но, как показывает практика, эта точка никогда не сработает. Чтобы решить подобную проблему, можно прибегнуть к следующему трюку. Сначала нужно поместить переменную в окно Watch (например, перетащив ее мышью) в момент, когда программа прервана внутри функции, где данная переменная доступна. Далее нужно поставить перед именем переменной (в окне Watch ) амперсанд, чтобы получить её адрес. Теперь нужно добавить точку останова по данным, указав полученный адрес вместо имени переменной на закладке Data . Чтобы определить необходимый размер контролируемой области памяти, нужно заставить Visual C++ интерпретировать этот адрес как указатель на определенный тип. Следует учесть, что установленная таким образом точка прерывания будет действовать корректно только в течение текущего сеанса отладки. В следующем сеансе отладки такую точку останова придется переустанавливать. Несмотря на сложность и неудобство данного способа, не стоит сбрасывать его со счетов, так как он позволяет находить очень сложные ошибки, например, проходы по памяти.

Закладка Messages

Рисунок 7. Закладка Messages

На закладке Messages (рис. 7) устанавливаются точки останова на сообщения. В верхнем поле указывается имя функции окна, а в нижнем – сообщение, которое должно прийти в эту функцию для срабатывания точки останова. Обратите внимание, что функция окна должна иметь стандартный прототип:

Обычно точки останова на сообщения используются в программах, написанных с использованием «чистого» Win32 API. В программах, использующих MFC, удобнее ставить точки останова в соответствующие обработчики сообщений. Для этого можно использовать методику установки точек останова на функции, описанную выше.

Пошаговая отладка

Когда программа прервана, её можно выполнять в пошаговом режиме. Для этого в Visual C++ предусмотрено несколько команд из меню Debug (таблица 1).

Команда Описание
Go (F5)Продолжить выполнение программы до следующей точки останова.
Step Into (F11)Выполнить одну инструкцию. Если это вызов функции, точка выполнения перемещается на первую инструкции этой функции (то есть происходит «заход» в функцию).
Step Over (F10)Выполнить одну инструкцию. Если это вызов функции, то она выполняется целиком (то есть «захода» в функцию не происходит).
Step Out (Shift+F11)Выполнять программу до возврата из текущей функции.
Run to Cursor (Ctrl+F10)Выполнять программу до инструкции, на которой находится курсор ввода. Эта команда эквивалентна установке временной точки останова с последующим вызовом команды Go.
Step Into Specific FunctionЭта команда аналогична Step Into , но позволяет явно указать, в какую функцию зайти (для этого надо установить на неё курсор ввода). Полезна, если на одной строке выполняется несколько вызовов функции, например: f1(f2(),f3(0)); .
Таблица 1. Команды пошагового режима отладки

Иногда в процессе отладки возникает необходимость перенести точку выполнения. Например, вы заметили ошибку и хотите «перескочить» через неё или, наоборот, хотите вернуться немного назад и выполнить фрагмент программы ещё раз. Чтобы это сделать, установите курсор в нужном месте и выберите команду Set Next Statement из контекстного меню (или нажмите Ctrl+Shift+F10).

Окна отладчика

В процессе пошаговой отладки программист может использовать целый ряд окон отладчика для наблюдения за состоянием программы. Каждому окну соответствует кнопка на панели инструментов Debug , с помощью которой можно показывать и прятать соответствующее окно. Можно также показывать и скрывать отладочные окна, используя команды из меню View->Debug Windows . Назначение отладочных окон описано в следующих разделах.

Окно Variables

В окне Variables (Alt+4) автоматически отображаются значения локальных переменных (закладка Locals ) и переменных-членов класса, адресуемого указателем this (закладка This ). В нём же отображаются значения всех переменных, которые используются в предыдущей и текущей инструкциях программы (закладка Auto ). На закладке Auto также показываются возвращаемые значения функций.

ПРИМЕЧАНИЕ

Чтобы отладчик показывал возвращаемые значения функций, необходимо открыть окно Tools->Options и установить галочку Return value на закладке Debug .

Чтобы изменить значение переменной, показанной в окне Variables , нужно просто сделать двойной щелчок на старом значении и ввести новое. Чтобы узнать тип переменной, нужно щёлкнуть по ней правой кнопкой и выбрать Properties из всплывающего меню.

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

Если в вашей программе используются строки в формате UNICODE, но их содержимое не отображается в окне Variables , откройте окно Tools->Options и установите флажок Display unicode strings на закладке Debug .

Окно Watch

Окно Watch (Alt+3) позволяет просматривать значения любых переменных и выражений. Их можно размещать на любой из четырёх закладок ( Watch 1 , Watch 2 , Watch 3 или Watch 4 ). Добавить переменную или выражение в окно Watch можно одним из следующих способов:

Чтобы изменить значение переменной, так же, как и в окне Variables, достаточно сделать двойной щелчок на старом значении и ввести новое. Значение выражений изменять нельзя. Чтобы узнать тип переменной или выражения, нужно щёлкнуть по ним правой кнопкой и выбрать Properties из всплывающего меню.

Регистры и псевдорегистры

В окне Watch можно наблюдать любые регистры процессора и изменять их значения. Можно также использовать регистры в выражениях. Кроме стандартного набора регистров процессора Intel отладчик может отображать несколько псевдорегистров . Полный список регистров и псевдорегистров, которые можно использовать в окне Watch , приведён в таблице 2.

РегистрыОписание
ERRКод последней ошибки, который возвращает функция GetLastError .
TIBИнформационный блок текущего потока.
CLKРегистр часов (недокументированный). Может использоваться для измерения времени выполнения инструкций в программе.
EAX, EBX, ECX, EDX, ESI, EDI, EIP, ESP, EBP, EFLРегистры процессора Intel .
CS, DS, ES, SS, FS, GSСегментные регистры процессора Intel .
ST0, ST1, ST2, ST3, ST4, ST5, ST6, ST7Регистры чисел с плавающей точкой процессора Intel .
MM0, MM1, MM2, MM3, MM4, MM5, MM6, MM7Регистры из набора MMX.
Таблица 2. Регистры и псевдорегистры

Символы форматирования

Можно указать отладчику, в каком формате выводить значение переменной/выражения, используя символы форматирования. Эти символы добавляются к переменной или выражению через запятую. Большинство из них совпадает с символами форматирования функции printf : d – целое число со знаком, u – беззнаковое целое, f – число с плавающей точкой, c – символ, s – строка и т. д. Полный список символов форматирования приведён в таблице 3.

СимволОписание
d, iцелое со знаком
Uбеззнаковое целое
Oбеззнаковое восьмеричное целое
x, Xбеззнаковое шестнадцатеричное целое
l, h«длинное» или «короткое» целое (префиксы, используемые совместно с символами d, i, u, o, x, X)
Fвещественное число со знаком
Eвещественное число со знаком в научной нотации
Gвещественное число со знаком (нотация выбирается автоматически)
Ccимвол
Sстрока в кодировке ANSI
Suстрока в кодировке Unicode
Stстрока в кодировке ANSI или Unicode
HrHRESULT или код ошибки Win32
Wcфлаг класса окна
Wmкод сообщения
<число>количество элементов массива
Таблица 3. Символы форматирования

Назначение большинства символов вопросов не вызывает, но последние четыре следует рассмотреть подробнее.

Символы wm превращают код сообщения в его название, например:

Символы wc позволяют «расшифровать» стиль окна, например:

Символы hr переводят коды ошибок Win32 и значения HRESULT, возвращаемые функциями COM, в удобочитаемый вид, например:

Символы hr могут оказаться полезными во многих случаях. Например, можно применить их к псевдорегистру ERR, чтобы всегда иметь перед глазами описание последней ошибки при вызове функций Windows API. Можно также добавить в окно Watch строчку «EAX,hr». Поскольку COM-функции возвращают свой HRESULT через регистр EAX, вы сможете постоянно видеть описания ошибок COM, возникающих в отлаживаемой программе.

Рисунок 8. Использование символов форматирования wm, wc и hr

Наконец, число, задаваемое через запятую после указателя (рис. 9), позволяет просмотреть заданное количество элементов массива, адресуемого этим указателем (по умолчанию показывается всего один элемент). Допустим, мы выделили динамический массив из 10 целых чисел:

Чтобы просмотреть его содержимое в окне Watch, нужно ввести:

Рисунок 9. Просмотр массива в окне Watch

Окно Registers

Окно Registers (Alt+5) позволяет просматривать и изменять значения регистров процессора. В нём также отображаются все флаги процессора и содержимое стека. Любое значение в окне можно изменить. Для этого нужно переместить курсор ввода в нужное место и просто ввести новое значение поверх старого.

Команда Floating Point Registers из контекстного меню позволяет включить или выключить отображение регистров с плавающей точкой.

Окно Memory

Окно Memory (Alt+6) позволяет просматривать и изменять содержимое ячеек памяти. Содержимое памяти может отображаться в самых различных форматах. Из контекстного меню можно выбрать Byte Format (отдельные байты), Short Hex Format (слова в шестнадцатеричном виде) и Long Hex Format (двойные слова в шестнадцатеричном виде). Полный список форматов для окна Memory доступен в окне Tools->Options на закладке Debug (выпадающий список Format ).

Значение любой ячейки памяти можно изменить. Для этого следует переместить курсор ввода в нужное место и просто ввести новое значение поверх старого. Кроме того, вы можете перетащить в окно Memory любую переменную, и в нём отобразится участок памяти, в котором хранится значение этой переменной.

Окно Call Stack

Окно Call Stack (Alt+7) показывает последовательность вызванных функций (стек вызовов). Используя контекстное меню, можно отобразить также типы (команда Parameter Types ) и значения (команда Parameter Values ) параметров этих функций. К тексту любой функции можно переместиться, сделав двойной щелчок на её имени. Кроме того, точки останова можно ставить прямо в этом окне.

Окно Disassembly

В окне Disassembly (Alt+8) отображается текст отлаживаемой программы на языке ассемблера. Иногда без помощи этого окна ошибку в программе найти не удаётся. Точки останова можно ставить прямо в этом окне. При этом обеспечивается позиционирование с точностью до команды процессора (в окне редактора кода такой точности достичь не удаётся).

Если вы захотите посмотреть, как работают функции Windows API, вам также не обойтись без окна Assembly . В нём вы сможете заходить в любую функцию Win32 и выполнять её по шагам.

ПРИМЕЧАНИЕ

При использовании Windows 9x попытка зайти в функцию WIn32 API приведет к появлению сообщения «Can not trace into system DLLs». В этой операционной системе заходить в функции API можно, только используя отладчик уровня ядра (например, WinDBG или SoftIce).

Если вы не видите названий переменных и функций в окне дизассемблера, следует установить отладочные символы для библиотек вашей операционной системы. Чтобы установить отладочные символы для Windows NT4, можно использовать программу Windows NT Symbols Setup , которая входит в Visual Studio. Символы для Windows 2000 можно установить с диска Customer Support Diagnostics или скачать с сайта Microsoft по адресу http://www.microsoft.com/ddk/debugging/symbols.asp.

СОВЕТ

Если отладочные символы для системных DLL вам недоступны, установите галочку Load COFF & Exports на закладке Debug окна Tools->Options . Это позволит увидеть в отладчике, по крайней мере, имена функций, экспортируемых из системных DLL. По умолчанию эта галочка отключена из соображений повышения производительности.

Диалоги отладчика

Диалоги отладчика предоставляют ряд дополнительных возможностей. Все они вызываются из меню Debug .

Quick Watch

Этот диалог имеет возможности, аналогичные возможностям окна Watch , с той разницей, что в нём можно просматривать только одну переменную за раз. Используется, когда вам не хочется добавлять переменную в окно Watch . Его можно вызвать, используя комбинацию Shift+F9.

Exceptions

Этот диалог позволяет настроить реакцию отладчика на возникновение системных и пользовательских исключений. Для каждого исключения можно выбрать действие Stop always (останавливаться всегда) или Stop if not handled (останавливаться, если исключение не обработано).

Threads

Этот диалог показывает список потоков, созданных вашей программой. Позволяет приостановить (suspend) или продолжить (resume) любой поток, а также установить на него фокус (то есть сделать его текущим). Этот диалог – практически единственное средство для отладки многопоточных приложений, которое предоставляет Visual C++.

Modules

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

Edit and Continue

Функция Edit and Continue впервые появилась в Visual C++ 6.0. С её помощью вы можете вносить изменения в код программы и перестраивать её, не прерывая сеанса отладки.

Для этого достаточно вызвать команду Apply code changes из меню Debug (или нажать Alt+F10), после того как вы подправили исходные тексты. Более того, Visual C++ может вызывать для вас эту команду автоматически. Это будет происходить, если в окне Tools->Options на закладке Debug установить флаг Debug commands invoke Edit and Continue .

Файл autoexp.dat

Файл autoexp.dat находится в каталоге %Visual Studio Folder%\Common\MSDev98\Bin (%Visual Studio Folder% — каталог, в которой установлен пакет Visual Studio). С помощью этого файла можно выполнять некоторые тонкие настройки отладчика. Изменения вступают в силу после перезапуска среды Visual C++.

ПРЕДУПРЕЖДЕНИЕ

Большая часть информации, относящейся к файлу autoexp.dat , не документирована. Используйте её на свой страх и риск.

По формату autoexp.dat – это обычный ini-файл с несколькими секциями. Рассмотрим их более подробно.

Секция [AutoExpand]

Вы, вероятно, заметили, что отладчик «умеет» распознавать стандартные структуры данных ( CString , RECT и т. п.) и показывать их содержимое в окнах Variables и Watch , а также во всплывающих подсказках. Оказывается, можно не только изменить представление этих структур отладчиком, но и определить представление для собственных структур. Именно для этого и используется секция [AutoExpand]. Каждая строка в ней описывает одну структуру (или класс). Описание имеет следующий формат:

Имя_типа – это имя класса или структуры. Оно может быть шаблоном. Параметры шаблона можно указать явно или использовать символ «*» для обозначения всех возможных параметров. Текст может быть произвольным. Чтобы вставить в него значение поля структуры, имя этого поля записывается в угловых скобках (возможно, с символом форматирования). Список возможных символов совпадает со списком символов для окна Watch (таблица 3) за одним исключением: задание числа элементов массива действовать не будет.

Вот как может выглядеть описание для структуры tagMSG , содержащей сообщение Windows.

Кроме задания переменных-членов класса, можно вызывать и его методы. Благодаря этому можно написать для своих классов специальный метод форматирования, доступный только в отладочной версии приложения, и использовать его для представления данных в классе. Практика показывает, что этот метод нельзя реализовывать внутри класса. Это сбивает с толку вычислитель выражений Visual C++ (expression evaluator), и вместо вашей строки выводятся вопросительные знаки. Вот пример форматирующего метода.

Соответственно, в файле autoexp.dat следует написать:

Другой пример применения этой возможности – отображение строк STL.

ПРЕДУПРЕЖДЕНИЕ

Включение в программу методов, вызываемых отладчиком, может привести к непредсказуемым побочным эффектам. Категорически не рекомендуется писать что-либо в память или вызывать функции Win32 API из таких методов.

Директивы $BUILTIN и $ADDIN

Если ограничения, накладываемые на форматирующие методы, показались вам слишком жёсткими, спешу вас обрадовать: в вашем распоряжении есть полноценная альтернатива. Использовать её сложнее, но гораздо безопаснее. Дело в том, что вычислитель выражений позволяет использовать для отображения структур встроенные или внешние процедуры. Встроенные процедуры подключаются при помощи директивы $BUILTIN, а внешние — с помощью директивы $ADDIN.

Директива $BUILTIN вряд ли вам когда-нибудь пригодится. Встроенные функции вычислителя существуют для таких типов, как GUID и VARIANT , но они и так подключены к соответствующим структурам в файле autoexp.dat :

Зато директива $ADDIN может оказаться весьма полезной. Она принимает два параметра: имя DLL и имя функции, реализующей форматирование. DLL должна находиться в том же каталоге, что и файл autoexp.dat . Форматирующая функция имеет следующий прототип.

Параметры функции имеют следующий смысл.

Чтобы получить данные объекта, для которого вызывается add-in, нужно воспользоваться функциями из структуры DEBUGHELPER :

Из этих функций в Visual C++ 6.0 можно использовать только первую – ReadDebuggeeMemory . Остальные доступны в Visual C++ 7.0. Описание всех функций приведено в таблице 4. Назначение параметров должно быть понятно из их названий.

ФункцияОписание
ReadDebuggeeMemory Читает данные из памяти отлаживаемого процесса.
ReadDebuggeeMemoryEx Читает данные из памяти отлаживаемого процесса. В отличие от ReadDebuggeeMemory , работает с 8-байтными адресами.
GetRealAddress Возвращает реальный 8-байтный адрес объекта, для которого вызван add-in, для последующей передачи в функцию ReadDebuggeeMemoryEx .
GetProcessorType Возвращает тип процессора.
Таблица 4. Функции, которые может использовать add-in

Этой информации вполне достаточно, чтобы написать add-in. Для примера реализуем в нём ту же функциональность, которую выполняла функция MyRect::Format . Код DLL выглядит так.

Чтобы избавиться от искажения имён, используется DEF-файл:

Наконец, полученную DLL необходимо скопировать в каталог с файлом autoexp.dat и добавить в него строчку:

Секция [ExecutionControl]

В начале статьи мы рассмотрели команду Step In , которая позволяет «заходить» в функции. Но в некоторых случаях «заход» в функции нежелателен. В этом случае можно отключить его для определённых функций или классов с помощью опции NoStepInto . Её следует применять в секции [ExecutionControl] файла autoexp.dat . Если эта секция отсутствует, ее всегда можно добавить вручную.

В общем виде использование NoStepInto выглядит так:

В качестве имени функции можно использовать символ «*» для обозначения всех функций в данном пространстве имён или классе. Зачем всё это нужно, спросите вы. Рассмотрим следующий пример.

Если вызвать команду Step Into на строчке wnd.Create(. ); , то мы попадём сначала в конструктор CRect::CRect , затем два раза в оператор приведения CString::operator LPCTSTR и только потом в CWnd::Create . Поскольку ни конструктор, ни оператор приведения не делают ничего интересного, можно отключить «заход» в эти функции, чтобы они не мешали нам отлаживать программу. Для этого следует добавить в файл autoexp.dat строчки:

Единственная неприятность состоит в том, что эта методика не работает с шаблонами. Возможно, именно из-за этого опция NoStepInto не была документирована.

Русские Блоги

Я здесь N видов свалок, которые вы должны знать В этой статье мы представили несколько инструментов, которые могут захватить файл дампа и его простое использование. Я не знаю, если вы все еще помните,Привилегия администратораЗапустить procdump -i Вы можете зарегистрироваться procdump Передовые отладки. Вы понимаете принцип его реализации? Сегодня давайте раскроем их тайну.

Соглашение

JIT Debugger , Just In Time Debugger , Джит отладчик , Postmortem Debugger , Отладчик после события , Ссылаясь на ту же концепцию —Отладчик после событияОтказ Если Debugger Заменять Debugging Иметь в видуПослеОтказ Иногда я говорю Джит отладчик Иногда я скажу Отладчик после события Я надеюсь, что у всех не должно быть головокружение моей путаницей.

Принцип исследования

Запустить process monitor Открытый мониторинг. Затем выполните привилегии администратора procdump.exe -i После успеха прекратите мониторинг. Чтобы облегчить все, я сознательно записал весь процесс, и я заинтересован в маленьком партнере, но я предлагаю вам лично сражаться, ведь Окончательные чувства на бумаге, воспринимали этот вопрос 。

Если вы не смотрите видео, вы можете напрямую обратиться к результатам моих фильтрованных результатов (зарезервированы Result Да Success из Реестр написать Событие, исключить не реестры, связанные с ними события):
procdump-install-filter-event

Я яркий с желтым и красным. procdump Операционный ключ реестра. Какие выводы вы можете получить с карты?

procdump Напишу одновременно HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug с участием HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug Ключ реестра.

Я считаю, что есть небольшой партнер, который разработал и знает, что 64 Под битной системой некоторые элементы регистрации имеют два набора: набор предназначен для 64 Используется битовый процесс (желтые блики), набор предназначен для 32 Битовый процесс использует (красная выделенная часть, с Wow6432Node )。

в случае AeDebug Ниже Auto Ребенок и Debugger Должность, procdump Сначала вернется в первую очередь, затем измените. (выполненный procdump -u В то время оригинальные настройки восстановлены)

Auto с участием Debugger Тип данных REG_SZ Отказ (Хотя мы видим Auto Значение 1 )

Наверное, 32 Когда процесс вылетает, он будет использовать его. Wow6432Node Ключ реестра, 64 Когда процесс вылетает, он будет использоваться без Wow6432Node Ключ реестра. Это действительно? Вы знаете, как проверить? Я верю, что вы можете подумать о проверке.

На самом деле вышеуказанная вывод procdump -i Подсказка была приведена в результате вывода (за исключением операции резервного копирования). Обратите внимание на желтые и красные основные моменты на рисунке ниже.

procdump-i

Советы:

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

На данный момент мы знаем procdump Это через настройку AeDebug Ниже Auto с участием Debugger Реализация детей JIT Debugging Отказ Так что же использование этих двух?

Разведка AEDEBUG

Использовать google искать AeDebug ИскалОфициальное описание Microsoft Заинтересованные партнеры должны прочитать и прочитать, есть много ценной информации.

Auto Элемент: Укажите, следует ли отобразить приглашение ошибки пользователю, если значение "0" Подсказка отображается окно. Для "1" Коробка приглашения не отображается, что непосредственно прикладывает зарегистрированный отладчик событий к целевому процессу.

Debugger Элемент: Укажите путь отладчика после события и пропустите параметры отладчика. Мы обнаруживаем procdump -i Параметры настройки -accepteula -j "E:\dumps" %ld %ld %p Отказ среди них:

  • -accepteula Указывает, что принимает пользовательский протокол.
  • -j Указывает на то, что в параметре есть указатель JIT_DEBUG_INFO Указатель (родительский процесс) %p Соответствующий контент).
  • "E:\dumps" Указывает путь, сохраненный файлом дампа (если запустить procdump -i Когда вы не укажите путь сохранения файла дампа, текущий путь будет принят по умолчанию).
  • Первый %ld Представляет процесс целевого процесса ID 。
  • второй %ld Указывает на обработку события. Эта обработка событий WER Скопируйте его в отладчик. Если отладчик активирован после события (пройти SetEvent() )Задний, WER Исполнение целевого процесса будет продолжаться, не дожидаясь преследования заслуженности. Если отладчик прекращается без активации события, WER Информация о целевом процессе будет продолжать собираться.
  • %p Указать на целевое пространство процесса JIT_DEBUG_INFO Структурный указатель. Содержит ненормальный источник и информацию о контексте, связанную с ненормально.

Если файл дампа сохраняется JIT_DEBUG_INFO , Использовать windbg При отладке вы можете пройти .jdinfo address Чтобы просмотреть информацию, когда происходит исключение. Например, используйте windbg включать procdump При сохранении файлов дампа вы должны увидеть следующую подсказку.

procdump

Мы можем войти в соответствии с подсказками .jdinfo 0x1afd59e0000 Для просмотра аномальных источников и контекстной информации.

jdinfo

Описание:

Запустить procdump -i Когда вы не укажете опцию DUAP, вы будете использовать его по умолчанию. -mm Параметры. Эта опция содержит только Process, Thread, Module, Handle and Address Space info. Информация, № %p Соответствующие данные памяти. Если мы в отладке -mm Выполните, когда опция сохранена файл дампа .jdinfo address Получите следующую ошибку:
Unable to process JIT_DEBUG_INFO, Win32 error 0n30

Мы можем просто передать обозначенным -ma Или же -mp Для генерации файла дампа, содержащего данные памяти, поэтому мы выполняем в отладчике .jdinfo address Я не сообщу об ошибке.

По мнению я наблюдаю, для procdump Убежденный -j с участием %p Варианты должны быть переданы одновременно, и это невозможно.

Исключить процесс

Если мы действительно не хотим делать некоторые проблемы, он прерывается, когда нет никакой аномалии. JIT Есть ли путь к отладчику? Из vista Начните, мы можем показать исключить определенные процессы, не позволяйте этим процессам прерываться, когда нет ненормальности JIT В отладчике. Соответствующая регистрационная форма заключается в следующем:

Ниже приведена значение ключа реестра на моей машине:

Выше demo.exe Я принимаю ручное дополнение, но DWM.exe Это добавлена ​​система. windows Почему это по умолчанию DWM.exe Добавить в эксклюзивный список? Я не очень понятен, но яExcluding an Application from Automatic Debugging Смотрите такое предложение:

By default, the Desktop Window Manager (Dwm.exe) is excluded from automatic debugging because otherwise a system deadlock can occur if Dwm.exe stops responding (the user cannot see the interface displayed by the debugger because Dwm.exe isn’t responding, and Dwm.exe cannot terminate because it is held by the debugger).

Я думаю, что это DWM.exe Причины будут исключены.

Если вы хотите достичь с помощью формы кода, в дополнение к прямой работе реестра вы можете пройти WerAddExcludedApplication() Для достижения, соответствия, может пройти WerRemoveExcludedApplication() Удалить. Прототип этих двух функций выглядит следующим образом:

Первый параметр pwzExeName Представляет программу исключить, не приносит путь, пройдите только имя программы. такой как, demo.exe 。

Второй параметр bAllUsers в случае FALSE Если это означает, что активен только текущий пользователь, другие пользователи не затрагиваются, изменены HKCU ( HKEY_CURRENT_USER Соответствующий ключ реестра. Если TRUE Если вы вступили в силу на всех пользователях, вы можете изменить его. HKLM ( HKEY_LOCAL_MACHINE Соответствующий ключ реестра, TRUE Когда вам нужен привилегии администратора.

Примечание:

Если вы вручную вызовите код, чтобы управлять реестром, будьте осторожны 64 Вопросы по перенаправлению таблицы регистрации под битовой системой. Я считаю, что должен быть маленький партнер, чтобы наступить на эту яму, как я.

Операционный механизм отладки JIT

Весь механизм работы, в Чжан Юнгуи, «Программная комиссия» (первое издание), глава 12: непредвиденные исключения и отладки JITОчень подробноВступление. Я не буду добывать, а маленькие друзья, которые заинтересованы, должны прочитать больше.

Что такое AE в Aeddebug?

AeDebug середина Debug Очень хорошо понимать, что это значит отлаживать. потом Ae В чем смысл? кто-то сказал AeDebug Да Auto Exception Debug Аббревиатура, это очень разумно. случайная возможность, google Прибыли Ramond Chen Статья написана -What does the “Ae” stand for in AeDebug?Отказ Согласно его заявлению, Ae Указывать Application Error значение. Я взял оригинальный текст следующим образом, чтобы все читали.

Raymond-Chen-explain-AE

Независимо от того AeDebug Какова аббревиатура, все знают, что значение этого ключа реестра достаточно, и не стоит слишком запутаться. В противном случае это действительно дыра.

подводить итоги

При нормальных обстоятельствах, измените HKLM Привилегии подразделения нуждаются в администраторах.

регистр JIT Отладчик требует привилегий администратора, потому что HKLM Следующий подраздел.

procdump в состоянии пройти -i Опция зарегистрирована как инцидент отладчик, кроме того, windbg Может пройти -I Опция зарегистрирована как отладчик событий.

AeDebug Ключ реестра JIT Ключ для отладки, регистрационный элемент 64 Битовая система 32 Процесс позиции и 64 Битовый процесс имеет соответствующий ключ реестра соответственно. Среди них, с Wow6432Node Ключ реестра дан 32 Используется битный целевой процесс.

64 Под битовой системой, в дополнение к AeDebug Есть два набора, есть еще много других элементов реестра.

Если вы действительно не хотите свой собственный процесс, вы будете прерываться, когда вы не обрабатывали аномалии. JIT В отладчике вы можете установить реестр для исключения ( Vista И после того, как операционная система поддерживается).

Name already in use

visualstudio-docs / docs / debugger / debug-using-the-just-in-time-debugger.md

  • Go to file T
  • Go to line L
  • Copy path
  • Copy permalink

Copy raw contents

Copy raw contents

Debug using the Just-In-Time Debugger in Visual Studio

Just-In-Time debugging can launch Visual Studio automatically when an app running outside Visual Studio errors or crashes. With Just-In-Time debugging, you can test apps outside of Visual Studio, and open Visual Studio to begin debugging when a problem occurs.

Just-In-Time debugging works for Windows desktop apps. It does not work for Universal Windows Apps, or for managed code that is hosted in a native application, such as Visualizers.

[!TIP] If you just want to stop the Just-In-Time Debugger dialog box from appearing, but don’t have Visual Studio installed, see Disable the Just-In-Time Debugger. If you once had Visual Studio installed, you may need to disable Just-In-Time debugging from the Windows registry.

Enable or disable Just-In-Time debugging in Visual Studio

[!NOTE] To enable or disable Just-In-Time debugging, you must be running Visual Studio as an administrator. Enabling or disabling Just-In-Time debugging sets a registry key, and administrator privileges may be required to change that key. To open Visual Studio as an administrator, right-click the Visual Studio app and choose Run as administrator.

You can configure Just-In-Time debugging from the Visual Studio Tools > Options (or Debug > Options) dialog box.

To enable or disable Just-In-Time debugging:

On the Tools or Debug menu, select Options > Debugging > Just-In-Time.

Enable or disable JIT debugging

In the Enable Just-In-Time debugging for these types of code box, select the types of code you want Just-In-Time debugging to debug: Managed, Native, and/or Script.

Select OK.

If you enable the Just-In-Time debugger, but it doesn’t open when an app crashes or errors, see Troubleshoot Just-In-Time debugging.

Disable Just-In-Time debugging from the Windows registry

Just-In-Time debugging may still be enabled even if Visual Studio is no longer installed on your computer. If Visual Studio is no longer installed, you can disable Just-In-Time debugging by editing the Windows registry.

To disable Just-In-Time debugging by editing the registry:

From the Windows Start menu, run the Registry Editor (regedit.exe).

In the Registry Editor window, locate and delete the following registry entries if they exist:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\DbgManagedDebugger

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger

. image type=»content» source=»../debugger/media/dbg-jit-registry.png» alt-text=»JIT registry key» border=»true».

Also delete the following registry entries if they exist:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\DbgManagedDebugger

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger

Make sure not to delete or change any other registry keys.

Close the Registry Editor window.

Enable Just-In-Time debugging of a Windows Form

By default, Windows Form apps have a top-level exception handler that lets the app keep running if it can recover. If a Windows Forms app throws an unhandled exception, it shows the following dialog:

Windows Form unhandled exception

To enable Just-In-Time debugging instead of standard Windows Form error handling, add these settings:

In the system.windows.forms section of the machine.config or <app name>.exe.config file, set the jitDebugging value to true :

In a C++ Windows Form application, also set DebuggableAttribute to true in a .config file or in your code. If you compile with /Zi and without /Og, the compiler sets this attribute for you. If you want to debug a non-optimized release build, however, you must set DebuggableAttribute by adding the following line in your app’s AssemblyInfo.cpp file:

For more information, see xref:System.Diagnostics.DebuggableAttribute.

Use Just-In-Time debugging

This example walks you through Just-In-Time debugging when an app throws an error.

You must have Visual Studio installed to follow these steps. If you don’t have Visual Studio, you can download the free Visual Studio Community Edition.

Make sure Just-In-Time debugging is enabled in Tools > Options > Debugging > Just-In-Time.

For this example, you’ll make a C# console app in Visual Studio that throws a NullReferenceException.

In Visual Studio, create a C# console app (File > New > Project > Visual C# > Console Application) named ThrowsNullException. For more information about creating projects in Visual Studio, see Walkthrough: Create a simple application.

When the project opens in Visual Studio, open the Program.cs file. Replace the Main() method with the following code, which prints a line to the console and then throws a NullReferenceException:

To build the solution, choose either the Debug (default) or Release configuration, and then select Build > Rebuild Solution.

  • Choose Debug configuration for the full debugging experience.
  • If you select Release configuration, you must turn off Just My Code for this procedure to work. Under Tools > Options > Debugging, deselect Enable Just My Code.

For more information about build configurations, see Understanding build configurations.

Open the built app ThrowsNullException.exe in your C# project folder (. \ThrowsNullException\ThrowsNullException\bin\Debug or . \ThrowsNullException\ThrowsNullException\bin\Release).

You should see the following command window:

Screenshot of the console for ThrowsNullException.exe, which throws an unhandled null reference exception (System.NullReferenceException).

The Choose Just-In-Time Debugger dialog opens.

Screenshot of the Choose Just-In-Time Debugger dialog box, which appears after the exception appears in the ThrowsNullException.exe console window.

Under Available Debuggers, select New instance of <your preferred Visual Studio version/edition>, if not already selected.

Select OK.

The ThrowsNullException project opens in a new instance of Visual Studio, with execution stopped at the line that threw the exception:

Screenshot of the ThrowsNullException project in Visual Studio, with highlighting of the line of source code that threw the exception.

You can start debugging at this point. If you were debugging a real app, you would need to find out why the code is throwing the exception.

[!CAUTION] If your app contains untrusted code, a security warning dialog box appears, enabling you to decide whether to proceed with debugging. Before you continue debugging, decide whether you trust the code. Did you write the code yourself? If the application is running on a remote machine, do you recognize the name of the process? If the app is running locally, consider the possibility of malicious code running on your computer. If you decide the code is trustworthy, select OK. Otherwise, select Cancel.

Troubleshoot Just-In-Time debugging

If Just-In-Time debugging doesn’t start when an app crashes, even though it is enabled in Visual Studio:

Windows Error Reporting could be taking over the error handling on your computer.

To fix this issue, use Registry Editor to add a DWORD Value of Disabled, with Value data of 1, to the following registry keys:

HKEY_LOCAL_MACHINE\Software\WOW6432Node\Microsoft\Windows\Windows Error Reporting

(For 32-bit machines) HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Windows Error Reporting

For more information, see .WER settings.

A known Windows issue may be causing the Just-In-Time debugger to fail.

The fix is to add a DWORD Value of Auto, with Value data of 1, to the following registry keys:

HKEY_LOCAL_MACHINE\Software\WOW6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug

(For 32-bit machines) HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug

You might see the following error messages during Just-In-Time debugging:

Unable to attach to the crashing process. The specified program is not a Windows or MS-DOS program.

The debugger tried to attach to a process running under another user.

To work around this problem, in Visual Studio, open Debug > Attach to Process (or press Ctrl + Alt + P), and find the process you want to debug in the Available Processes list. If you do not know the name of the process, find the Process ID in the Visual Studio Just-In-Time Debugger dialog. Select the process in the Available Processes list, and select Attach. Select No to dismiss the Just-In-Time debugger dialog.

Debugger could not be started because no user is logged on.

There is no user logged onto the console, so there is no user session to display the Just-In-Time debugging dialog.

To fix this problem, log onto the machine.

Class not registered.

The debugger tried to create a COM class that is not registered, probably due to an installation problem.

To fix this problem, use the Visual Studio Installer to reinstall or repair your Visual Studio installation.

Just in time debugging что это такое

Completing the CAPTCHA proves you are a human and gives you temporary access to the web property.

What can I do to prevent this in the future?

If you are on a personal connection, like at home, you can run an anti-virus scan on your device to make sure it is not infected with malware.

If you are at an office or shared network, you can ask the network administrator to run a scan across the network looking for misconfigured or infected devices.

Another way to prevent getting this page in the future is to use Privacy Pass. You may need to download version 2.0 now from the Chrome Web Store.

Cloudflare Ray ID: 71a91e920b599b58 • Your IP : 82.102.23.104 • Performance & security by Cloudflare

Читать:
Как узнать кем занят порт windows 10

Похожие статьи