Русские Блоги
JIT отладки вам нужно знать
Преступность
Соглашение
Принцип исследования
Если вы не смотрите видео, вы можете напрямую обратиться к результатам моих фильтрованных результатов (зарезервированы Result Да Success из Реестр написать Событие, исключить не реестры, связанные с ними события):
Я яркий с желтым и красным. procdump Операционный ключ реестра. Какие выводы вы можете получить с карты?
procdump Напишу одновременно HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug с участием HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug Ключ реестра.
Я считаю, что есть небольшой партнер, который разработал и знает, что 64 Под битной системой некоторые элементы регистрации имеют два набора: набор предназначен для 64 Используется битовый процесс (желтые блики), набор предназначен для 32 Битовый процесс использует (красная выделенная часть, с Wow6432Node )。
Auto с участием Debugger Тип данных REG_SZ Отказ (Хотя мы видим Auto Значение 1 )
Наверное, 32 Когда процесс вылетает, он будет использовать его. Wow6432Node Ключ реестра, 64 Когда процесс вылетает, он будет использоваться без Wow6432Node Ключ реестра. Это действительно? Вы знаете, как проверить? Я верю, что вы можете подумать о проверке.
Некоторое антивирусное программное обеспечение может быть защищено этим ключом реестра. Если настройка не удалась, пожалуйста, проверьте, является ли это антивирусным программным обеспечением.
На данный момент мы знаем procdump Это через настройку AeDebug Ниже Auto с участием Debugger Реализация детей JIT Debugging Отказ Так что же использование этих двух?
Разведка AEDEBUG
Использовать google искать AeDebug ИскалОфициальное описание Microsoft Заинтересованные партнеры должны прочитать и прочитать, есть много ценной информации.
Auto Элемент: Укажите, следует ли отобразить приглашение ошибки пользователю, если значение «0» Подсказка отображается окно. Для «1» Коробка приглашения не отображается, что непосредственно прикладывает зарегистрированный отладчик событий к целевому процессу.


Исключить процесс
Если мы действительно не хотим делать некоторые проблемы, он прерывается, когда нет никакой аномалии. 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 Какова аббревиатура, все знают, что значение этого ключа реестра достаточно, и не стоит слишком запутаться. В противном случае это действительно дыра.
подводить итоги
При нормальных обстоятельствах, измените HKLM Привилегии подразделения нуждаются в администраторах.
регистр JIT Отладчик требует привилегий администратора, потому что HKLM Следующий подраздел.
AeDebug Ключ реестра JIT Ключ для отладки, регистрационный элемент 64 Битовая система 32 Процесс позиции и 64 Битовый процесс имеет соответствующий ключ реестра соответственно. Среди них, с Wow6432Node Ключ реестра дан 32 Используется битный целевой процесс.
64 Под битовой системой, в дополнение к AeDebug Есть два набора, есть еще много других элементов реестра.
Если вы действительно не хотите свой собственный процесс, вы будете прерываться, когда вы не обрабатывали аномалии. JIT В отладчике вы можете установить реестр для исключения ( Vista И после того, как операционная система поддерживается).
PHP 8: Как включить JIT
пробуем вместе настроить JIT в PHP
PHP 8 добавляет к ядру PHP JIT-компилятор, который может значительно повысить производительность
JIT-компиляторы очень сложны, потому что для того, чтобы добиться от них хорошей производительности, обычно нужно выбирать, какие именно части промежуточного языка должны компилироваться в машинный код, а какие нет. Преобразование в машинный код не всегда происходит быстрее, в зависимости от конкретных деталей кода и рассматриваемого языка. Кроме того, процесс преобразования упрощенного кода в машинный код может занять больше времени, чем просто однократный запуск упрощенного кода и мгновенного завершение его работы.
По этой причине большинство JIT-компиляторов анализируют код во время его выполнения, чтобы определить, какие части дают наилучшую отдачу, а затем компилируют только эти биты. Т еоретически, о тличный результат состоит в том, что программа буквально становится быстрее по мере ее выполнения, а JIT-компилятор в виртуальной машине узнает, какие части кода нужно оптимизировать.
Java была первым широко распространенным языком, включившим JIT в свою виртуальную машину. Большинство основных движков Javascript теперь тоже. И, начиная с PHP 8.0, к этому списку присоединился и PHP.
PHP JIT
JIT в PHP появилась давно. На самом деле он находился в разработке в течение нескольких лет и почти был выпущен в PHP 7.4. Работа по созданию JIT в PHP была тем импульсом, который привел к серьезному переписыванию движка, что дало версии 7.0 значительный прирост производительности.
PHP JIT построен как расширение кеша опкодов. Это означает, что его можно включать и отключать либо при сборке самого PHP, либо во время выполнения через php.ini.
Кратко для системных администраторов
В PHP 8.0 JIT как бы включен по умолчанию, но и выключен. Требуется только минимальная конфигурация php.ini, подобная этой:
Как настроить JIT в PHP 8
Прежде всего, JIT будет работать, только если включен opcache, хоть по умолчанию в PHP он и включен, вы все равно должны убедиться, что в вашем php.ini файле установлено значение opcache.enable = 1. Включение самого JIT осуществляется путем установки в php.ini параметра opcache.jit_buffer_size в ненулевое значение. Это контролирует, сколько места в памяти JIT может заполнить оптимизированным машинным кодом. Однако больше не всегда лучше, поскольку JIT также может тратить время на компиляцию кода, который на самом деле не выигрывает от компиляции.
Если эта директива отсутствует, то значение по умолчанию будет равно 0, и JIT не будет работать.
Так же, если вы тестируете JIT в сценарии CLI, вы должны использовать opcache.enable_cli для включения opcache:
Разница между opcache.enable и opcache.enable_cli заключается в том, что первый вариант следует использовать тогда, когда вы, например, используете встроенный PHP-сервер. Если вы на самом деле запускаете сценарий CLI, вам понадобится opcache.enable_cli.
Прежде чем продолжить, давайте убедимся, что JIT действительно работает, создадим PHP-скрипт, доступный через браузер или CLI (в зависимости от того, где вы тестируете JIT), и посмотрим на вывод opcache_get_status():
Результат будет примерно таким:
Если enabled и on стоят в true, то все работает как надо!
Далее есть несколько способов настроить JIT (и здесь мы попадем в круговорот беспорядка конфигурации). Вы можете настроить, когда должен работать JIT, с какой степенью он должен пытаться оптимизировать и т.д. Все эти параметры настраиваются с помощью всего одной записи конфигурации(!): opcache.jit. Выглядит это так:
В RFC можно почитать что означает каждое из чисел. Имейте в виду: это не битовая маска, каждое число просто представляет собой различный вариант конфигурации. Итак, RFC дает нам следующие варианты:
| 0 | не JIT |
| 1 | минимальный JIT (вызов стандартных обработчиков ВМ) |
| 2 | выборочное встраивание обработчика ВМ |
| 3 | оптимизированный JIT на основе статического вывода типов отдельной функции |
| 4 | оптимизированный JIT на основе статического вывода типов и дерева вызовов |
| 5 | оптимизированная JIT на основе статического вывода типов и анализа внутренних процедур |
| 0 | JIT все функции при первой загрузке скрипта |
| 1 | Функция JIT при первом выполнении |
| 2 | Профилировать по первому запросу и компилировать горячие функции по второму запросу |
| 3 | Профилировать на лету и компилировать горячие функции |
| 4 | |
| 5 | Трассировка JIT |
| 0 | не выполнять распределение регистров |
| 1 | использовать локальный распределитель регистров liner-scan |
| 2 | использовать глобальный распределитель регистров liner-scan |
Имейте в виду, что необязательно настраивать opcache.jit. JIT будет использовать значение по умолчанию, если это свойство не указано. А какой по умолчанию, спросите вы? А вот какое opcache.jit=tracing.
Что еще за трассировка, спросите вы, это совсем не та странная структура, похожая на битовую маску, которую мы видели ранее. И вы будете правы: после того, как был принят исходный RFC, контрибьюторы ядра PHP осознали, что параметры-шифры, подобные битовой маске, не очень удобны для пользователя, поэтому они добавили два человечески понятные псевдонима, которые транслируются в ту самую битовую маску под капотом. Есть opcache.jit=tracing и opcache.jit=function.
Разница между ними заключается в том, что при параметре функции JIT пытается оптимизировать код только в рамках одной функции, в то время как JIT трассировка может просматривать всю трассировку стека, чтобы идентифицировать и оптимизировать горячий код. PHP Internals рекомендует использовать JIT-трассировку, потому что она почти всегда дает наилучшие результаты.
Отладка JIT (opcache.jit_debug)
PHP JIT обеспечивает способ выдачи отладочной информации JIT путем установки конфигурации INI. Когда установлен определенный флаг, он выводит код сборки для дальнейшей проверки.
Директива opcache.jit_debug принимает значение битовой маски для включения определенных функций. В настоящее время он принимает значение в диапазоне от 1 (0b1) до 20 двоичных разрядов. Значение 1048576 представляет максимальный уровень вывода отладки.
JIT поддерживает несколько других параметров конфигурации, чтобы настроить, сколько вызовов функций делает ее «горячей» функцией, которая затем компилируется JIT, и порог для определения того, какие функции следует «JIT’ировать», на основе процента общих вызовов функций.
Улучшит ли JIT производительность?
Короче, «это зависит от обстоятельств». Для веб-приложений может и не очень, но вот для PHP как экосистемы даже может чрезмерно.
PHP, по замыслу, обычно работает в конфигурации без совместного использования ресурсов. После обработки каждого запроса приложение полностью закрывается. Это дает JIT очень мало времени на анализ и оптимизацию кода, тем более, что большая часть кода в типичном веб-запросе выполняется только один раз, поскольку запрос обрабатывается линейно. Кроме того, большей частью этих приложений часто является ввод-вывод (в основном, общение с базой данных), и JIT вообще не может с этим помочь. Результаты тестов, которые были опубликованы на данный момент, показывают, что JIT предлагает лишь незначительное повышение производительности в типичных приложениях PHP, запускаемых через PHP-FPM.
JIT потенциально может быть действительно полезен в тех случаях, где PHP сегодня совсем не рассматривается. Реальные преимущества будут видны в работе постоянных демонов, парсерах, машинном обучении и других длительных процессах, интенсивно использующих CPU.
Может быть для вас будет шоком узнать, что для PHP доступны библиотеки машинного обучения, такие как Rubix ML или PHP-ML. Они не так широко используются, как их собраты на Python, отчасти потому, что при интерпретации они, как правило, медленнее, чем библиотеки C с красивыми оболочками Python. Однако с JIT эти задачи с интенсивным использованием CPU могут оказаться такими же быстрыми или, возможно, даже более быстрыми, чем те, которые доступны на других языках.
PHP больше не является «просто самым быстрым из основных языков веб-сценариев». Теперь это жизнеспособный высокопроизводительный язык общей обработки данных, с передачей постоянных воркеров, машинного обучения и других высокопроизводительных задач, в руки миллионов PHP-разработчиков по всему миру.
Веб-разработчик со стажем программирования более 9 лет, всегда в процессе учебы и созидания.
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.
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
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.
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:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\DbgManagedDebugger
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger
If your computer is running a 64-bit operating system, also delete the following registry entries:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\DbgManagedDebugger
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\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:
To enable Just-In-Time debugging instead of standard Windows Form error handling, add these settings:
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:
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.
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:
The Choose Just-In-Time Debugger dialog opens.
Select OK.
The ThrowsNullException project opens in a new instance of Visual Studio, with execution stopped at the line 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.
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\Microsoft\Windows\Windows Error Reporting
(For 64-bit machines): HKEY_LOCAL_MACHINE\Software\WOW6432Node\Microsoft\Windows\Windows Error Reporting
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\Microsoft\Windows NT\CurrentVersion\AeDebug
(For 64-bit machines): HKEY_LOCAL_MACHINE\Software\WOW6432Node\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.










