Я пытаюсь отладить простое консольное приложение .NET Core с WinDbg в реальном времени (с помощью «Запуска исполняемого файла» в WinDbg), но было выдано исключение «Нарушение доступа».
Информация об окружающей среде:
Код:
namespace Simplicity01
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
TestDebugging01();
}
static void TestDebugging01()
{
T01 t01 = new T01();
t01.Print();
}
}
internal class T01
{
public void Print()
{
int i = 3;
string str = "abc";
Console.WriteLine(i);
Console.WriteLine(str);
}
}
}
Введенные шаги команды для отладки следующие:
Откройте WinDbg и нажмите «Запустить исполняемый файл», чтобы загрузить файл Simplicity01.exe.
sxe ld:Simplicity01 г !bpmd Simplicity01 Simplicity01.Program.TestDebugging01 г г
Вот подробности шагов в WinDbg:
************* Preparing the environment for Debugger Extensions Gallery repositories **************
ExtensionRepository : Implicit
UseExperimentalFeatureForNugetShare : false
AllowNugetExeUpdate : false
AllowNugetMSCredentialProviderInstall : false
AllowParallelInitializationOfLocalRepositories : true
-- Configuring repositories
----> Repository : LocalInstalled, Enabled: true
----> Repository : UserExtensions, Enabled: true
>>>>>>>>>>>>> Preparing the environment for Debugger Extensions Gallery repositories completed, duration 0.000 seconds
************* Waiting for Debugger Extensions Gallery to Initialize **************
>>>>>>>>>>>>> Waiting for Debugger Extensions Gallery to Initialize completed, duration 0.031 seconds
----> Repository : UserExtensions, Enabled: true, Packages count: 0
----> Repository : LocalInstalled, Enabled: true, Packages count: 36
Microsoft (R) Windows Debugger Version 10.0.25921.1001 AMD64
Copyright (c) Microsoft Corporation. All rights reserved.
CommandLine: F:\Debug\Simplicity01.exe
************* Path validation summary **************
Response Time (ms) Location
Deferred cache*F:\Project\Symbol\Windbg
Deferred srv*F:\Project\Symbol\Windbg*https://msdl.microsoft.com/download/symbols
Symbol search path is: cache*F:\Project\Symbol\Windbg;srv*F:\Project\Symbol\Windbg*https://msdl.microsoft.com/download/symbols
Executable search path is:
ModLoad: 00007ff7`e82d0000 00007ff7`e82fb000 apphost.exe
ModLoad: 00007fff`86a90000 00007fff`86c88000 ntdll.dll
ModLoad: 00007fff`85a30000 00007fff`85aed000 C:\Windows\System32\KERNEL32.DLL
ModLoad: 00007fff`84290000 00007fff`84586000 C:\Windows\System32\KERNELBASE.dll
ModLoad: 00007fff`81930000 00007fff`819c1000 C:\Windows\SYSTEM32\apphelp.dll
ModLoad: 00007fff`84d00000 00007fff`84e9e000 C:\Windows\System32\USER32.dll
ModLoad: 00007fff`84ac0000 00007fff`84ae2000 C:\Windows\System32\win32u.dll
ModLoad: 00007fff`86420000 00007fff`8644c000 C:\Windows\System32\GDI32.dll
ModLoad: 00007fff`848a0000 00007fff`849ba000 C:\Windows\System32\gdi32full.dll
ModLoad: 00007fff`845e0000 00007fff`8467d000 C:\Windows\System32\msvcp_win.dll
ModLoad: 00007fff`849c0000 00007fff`84ac0000 C:\Windows\System32\ucrtbase.dll
ModLoad: 00007fff`85af0000 00007fff`86235000 C:\Windows\System32\SHELL32.dll
ModLoad: 00007fff`866a0000 00007fff`8674e000 C:\Windows\System32\ADVAPI32.dll
ModLoad: 00007fff`84ea0000 00007fff`84f3e000 C:\Windows\System32\msvcrt.dll
ModLoad: 00007fff`86530000 00007fff`865cc000 C:\Windows\System32\sechost.dll
ModLoad: 00007fff`86750000 00007fff`86876000 C:\Windows\System32\RPCRT4.dll
(5070.5034): Break instruction exception - code 80000003 (first chance)
ntdll!LdrpDoDebuggerBreak+0x30:
00007fff`86b60750 cc int 3
0:000> sxe ld:Simplicity01
0:000> g
ModLoad: 00007fff`84b10000 00007fff`84b40000 C:\Windows\System32\IMM32.DLL
ModLoad: 00007fff`71920000 00007fff`71982000 C:\Program Files\dotnet\host\fxr\7.0.11\hostfxr.dll
ModLoad: 00007fff`059a0000 00007fff`05a03000 C:\Program Files\dotnet\shared\Microsoft.NETCore.App\7.0.11\hostpolicy.dll
ModLoad: 00007ffe`b25b0000 00007ffe`b2aaa000 C:\Program Files\dotnet\shared\Microsoft.NETCore.App\7.0.11\coreclr.dll
ModLoad: 00007fff`84fd0000 00007fff`850fa000 C:\Windows\System32\ole32.dll
ModLoad: 00007fff`85660000 00007fff`859b4000 C:\Windows\System32\combase.dll
ModLoad: 00007fff`862a0000 00007fff`8636d000 C:\Windows\System32\OLEAUT32.dll
ModLoad: 00007fff`84810000 00007fff`84892000 C:\Windows\System32\bcryptPrimitives.dll
(5070.5034): Unknown exception - code 04242420 (first chance)
ModLoad: 00007ffe`b15d0000 00007ffe`b20eb000 C:\Program Files\dotnet\shared\Microsoft.NETCore.App\7.0.11\System.Private.CoreLib.dll
ModLoad: 00007ffe`b1450000 00007ffe`b15cb000 C:\Program Files\dotnet\shared\Microsoft.NETCore.App\7.0.11\clrjit.dll
ModLoad: 00007fff`82000000 00007fff`82012000 C:\Windows\SYSTEM32\kernel.appcore.dll
ModLoad: 000001f9`3d350000 000001f9`3d358000 F:\Debug\Simplicity01.dll
ntdll!NtMapViewOfSection+0x14:
00007fff`86b2d354 c3 ret
0:000> !bpmd Simplicity01 Simplicity01.Program.TestDebugging01
Adding pending breakpoints...
0:000> g
(5070.5034): CLR notification exception - code e0444143 (first chance)
ModLoad: 000001f9`3ed50000 000001f9`3ed5e000 C:\Program Files\dotnet\shared\Microsoft.NETCore.App\7.0.11\System.Runtime.dll
(5070.5034): CLR notification exception - code e0444143 (first chance)
ModLoad: 00007ffe`b5500000 00007ffe`b552a000 C:\Program Files\dotnet\shared\Microsoft.NETCore.App\7.0.11\System.Console.dll
(5070.5034): CLR notification exception - code e0444143 (first chance)
ModLoad: 00007fff`2bb90000 00007fff`2bba3000 C:\Program Files\dotnet\shared\Microsoft.NETCore.App\7.0.11\System.Threading.dll
(5070.5034): CLR notification exception - code e0444143 (first chance)
ModLoad: 000001f9`3d3d0000 000001f9`3d3d8000 C:\Program Files\dotnet\shared\Microsoft.NETCore.App\7.0.11\System.Text.Encoding.Extensions.dll
(5070.5034): CLR notification exception - code e0444143 (first chance)
ModLoad: 00007fff`541f0000 00007fff`541fd000 C:\Program Files\dotnet\shared\Microsoft.NETCore.App\7.0.11\System.Runtime.InteropServices.dll
(5070.5034): CLR notification exception - code e0444143 (first chance)
(5070.5034): CLR notification exception - code e0444143 (first chance)
JITTED Simplicity01!Simplicity01.Program.TestDebugging01()
Setting breakpoint: bp 00007FFE52C10B00 [Simplicity01.Program.TestDebugging01()]
Breakpoint 0 hit
Simplicity01!COM+_Entry_Point:
00007ffe`52c10b00 55 push rbp
0:000> g
(5070.5034): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
00007ffe`52c10b60 0000 add byte ptr [rax],al ds:00007ffe`52d445b8=ff
Теперь исключение «Нарушение доступа» выдается после выполнения команды «a».
Я не знаю, почему это вызывает исключение «Нарушение доступа» при отладке.
Как мне решить эту проблему?
«Я не знаю, почему при отладке возникает исключение «Нарушение доступа». - как сказал Лекс Ли, это исключение может быть неспецифичным для отладки. Может произойти и другое, но вы этого не заметите.
«Я не знаю, почему при отладке возникает исключение «Нарушение доступа». — ну, вы уже отлаживаете это приложение, и именно там вы узнаете о причине. Посмотрите на стек вызовов, выясните, что делает приложение, и в конечном итоге вы обнаружите, что а) какой-то объект имеет значение NULL, б) произошло переполнение или опустошение буфера, в) некоторые арифметические операции с указателями пошли не так, г) память была освобожден, ... Многое из этого маловероятно в приложении .NET, поэтому я предполагаю, что а), но это умозрительно.
с точки зрения кода в WinDbg нет ничего, что указывало бы на AccessViolation. Более того, если вы не настроите точку останова, программа заработает без каких-либо проблем. AccessViolation вызвано попыткой выполнить около 0000 байт. Чтобы разобраться в этом, нужно немного больше расследования.





Проведя небольшое расследование и поспрашивав в X/twitter, оказалось, что эта проблема связана с настройкой W^X (запись и выполнение), которая была введена в .NET 7 (или, возможно, в .NET7 было изменено только значение по умолчанию). . Новое значение проблематично для отладчиков и инструментов, связанных с профилированием.
Вы можете контролировать это, установив для переменной среды DOTNET_EnableWriteXorExecute значение 0 с помощью setx DOTNET_EnableWriteXorExecute 0. Если установлено это значение, сценарий пройдет.
Зная имя флага, поиск показывает некоторые проекты (например, Benchmark.NET здесь), переопределяющие это значение, чтобы избежать проблем, которые создает для них это новое значение по умолчанию.
Существует открытая проблема по устранению этой проблемы для команды bpmd.
Большое спасибо за ваш ответ. Вы вселили в меня уверенность в том, что я смогу изучить отладку.
Исключения первого шанса, как правило, ожидаемы и безвредны, если только не будет надлежащей обработки и не произойдет исключение второго шанса. Что именно вы пытаетесь здесь сделать? Просто научитесь использовать WinDBG или разберетесь в конкретной проблеме?