Как отладить консольное приложение .NET Core с помощью WinDbg с помощью «Запустить исполняемый файл»?

Я пытаюсь отладить простое консольное приложение .NET Core с WinDbg в реальном времени (с помощью «Запуска исполняемого файла» в WinDbg), но было выдано исключение «Нарушение доступа».

Информация об окружающей среде:

  • ОС: Windows 10 22H2 19045.3448
  • Среда выполнения .NET: .NET 7
  • Инструмент сборки: Visual Studio 2022 (64-разрядная версия) v17.7.4.
  • Варианты сборки: Отладка, Любой процессор.
  • Инструмент отладки: WinDbg Preview 1.2308.2002.0

Код:

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».

Я не знаю, почему это вызывает исключение «Нарушение доступа» при отладке.

Как мне решить эту проблему?

Исключения первого шанса, как правило, ожидаемы и безвредны, если только не будет надлежащей обработки и не произойдет исключение второго шанса. Что именно вы пытаетесь здесь сделать? Просто научитесь использовать WinDBG или разберетесь в конкретной проблеме?

Lex Li 24.09.2023 01:36

«Я не знаю, почему при отладке возникает исключение «Нарушение доступа». - как сказал Лекс Ли, это исключение может быть неспецифичным для отладки. Может произойти и другое, но вы этого не заметите.

Thomas Weller 25.09.2023 09:08

«Я не знаю, почему при отладке возникает исключение «Нарушение доступа». — ну, вы уже отлаживаете это приложение, и именно там вы узнаете о причине. Посмотрите на стек вызовов, выясните, что делает приложение, и в конечном итоге вы обнаружите, что а) какой-то объект имеет значение NULL, б) произошло переполнение или опустошение буфера, в) некоторые арифметические операции с указателями пошли не так, г) память была освобожден, ... Многое из этого маловероятно в приложении .NET, поэтому я предполагаю, что а), но это умозрительно.

Thomas Weller 25.09.2023 09:09

с точки зрения кода в WinDbg нет ничего, что указывало бы на AccessViolation. Более того, если вы не настроите точку останова, программа заработает без каких-либо проблем. AccessViolation вызвано попыткой выполнить около 0000 байт. Чтобы разобраться в этом, нужно немного больше расследования.

Paweł Łukasik 25.09.2023 23:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
117
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проведя небольшое расследование и поспрашивав в X/twitter, оказалось, что эта проблема связана с настройкой W^X (запись и выполнение), которая была введена в .NET 7 (или, возможно, в .NET7 было изменено только значение по умолчанию). . Новое значение проблематично для отладчиков и инструментов, связанных с профилированием.

Вы можете контролировать это, установив для переменной среды DOTNET_EnableWriteXorExecute значение 0 с помощью setx DOTNET_EnableWriteXorExecute 0. Если установлено это значение, сценарий пройдет.

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

Существует открытая проблема по устранению этой проблемы для команды bpmd.

Большое спасибо за ваш ответ. Вы вселили в меня уверенность в том, что я смогу изучить отладку.

Dic4000 28.09.2023 06:40

Другие вопросы по теме