Поделиться через


Проверка трассировки управляемого стека (dotnet-stack)

Эта статья относится к версиям ✔️ dotnet-stack 5.0.221401 и более поздних версий.

Установка

Есть два способа загрузки и установки dotnet-stack:

  • Глобальный инструмент dotnet:

    Чтобы установить последнюю версию пакета dotnet-stackNuGet, используйте команду dotnet tool install.

    dotnet tool install --global dotnet-stack
    
  • Прямое скачивание:

    скачайте исполняемый файл средства, соответствующий вашей платформе:

    ОС Платформа
    Виндоус x86 | x64 | Arm | Arm-x64
    Линукс x64 | Arm | Arm64 | musl-x64 | musl-Arm64

Краткие сведения

dotnet-stack [-h, --help] [--version] <command>

Описание

Инструмент dotnet-stack:

  • это кроссплатформенное средство .NET Core.
  • Оно сканирует и выводит управляемые стеки для всех потоков в целевом процессе .NET.
  • Средство использует трассировку EventPipe, обеспечиваемую средой выполнения .NET Core.

Параметры

  • -h|--help

    Показать справку в командной строке.

  • --version

    Отображение версии служебной программы dotnet-stack.

Команды

Команда Описание
Отчет dotnet-stack Выводит трассировку стека для каждого потока в целевом процессе.
dotnet-stack ps Перечисляет процессы dotnet, из которых можно собирать трассировки стека.
символьная символика dotnet-stack Извлеките номер строки из маркера метода и IL смещения в стек-трейсе.

Отчет dotnet-stack

Выводит трассировку стека для каждого потока в целевом процессе.

Краткие сведения

dotnet-stack report -p|--process-id <pid>
                    -n|--name <process-name>
                    [-h|--help]

Параметры

  • -n, --name <name>

    Имя процесса, из которого нужно сообщить о стеке.

  • -p|--process-id <PID>

    Идентификатор процесса, из которого нужно сделать отчет о стеке.

dotnet-stack ps

Выводит список процессов dotnet, из которыми можно собирать трассировки стека. dotnet-stack версии 6.0.320703 и более поздние также отображают аргументы командной строки, с которыми был запущен каждый процесс, если они доступны.

Краткие сведения

dotnet-stack ps [-h|--help]

Пример

Предположим, что вы запускаете длинное приложение с помощью команды dotnet run --configuration Release. В другом окне выполните dotnet-stack ps команду. Выходные данные, которые вы увидите, приведены ниже. Аргументы командной строки, если таковые имеются, отображаются в dotnet-stack версии 6.0.320703 и более поздних версий.

> dotnet-stack ps
  
  21932 dotnet     C:\Program Files\dotnet\dotnet.exe   run --configuration Release
  36656 dotnet     C:\Program Files\dotnet\dotnet.exe

символьная символика dotnet-stack

Извлеките номер строки из токена метода и смещения IL в стековом трассировщике.

Краткие сведения

dotnet-stack symbolicate <input-path> [-d|--search-dir] [-o|--output] [-c|--stdout] [-h|--help]

Параметры

  • -d, --search-dir <directory1 directory2 ...>

    Путь к нескольким директориям со сборками и pdb-файлами.

  • -o, --output <output-path>

    Выводить данные непосредственно в файл.

  • -c, --stdout

    Вывод непосредственно в консоль.

Пример

> cat stack.trace

Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
   at DotnetStackSymbolicate.App.MethodA() in DotnetStackSymbolicate.dll:token 0x6000002+0x6
   at DotnetStackSymbolicate.App..ctor() in DotnetStackSymbolicate.dll:token 0x6000003+0x51
   at DotnetStackSymbolicate.Program.OnCreate() in DotnetStackSymbolicate.Tizen.dll:token 0x6000001+0x8
onSigabrt called
>
> dotnet-stack symbolicate stack.trace --stdout

Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
   at DotnetStackSymbolicate.App.MethodA() in C:\DotnetStackSymbolicate\DotnetStackSymbolicate.cs:line 19
   at DotnetStackSymbolicate.App..ctor() in C:\DotnetStackSymbolicate\DotnetStackSymbolicate.cs:line 38
   at DotnetStackSymbolicate.Program.OnCreate() in C:\DotnetStackSymbolicate.Tizen\DotnetStackSymbolicate.Tizen.cs:line 12
onSigabrt called

Output: stack.trace.symbolicated

Получение отчета об управляемых стеках с помощью dotnet-stack

Чтобы получить отчет об управляемых стеках с помощью dotnet-stack, сделайте следующее.

  • Узнайте идентификатор процесса (PID) приложения .NET Core, чтобы сообщать о стеках.

    • В Windows его можно получить, например, через диспетчер задач или с помощью команды tasklist.
    • В Linux можно использовать, например, команду ps.
    • dotnet-stack ps
  • Выполните следующую команду:

    dotnet-stack report --process-id <PID>
    

    Приведенная выше команда создает выходные данные наподобие следующих:

    Thread (0x48839B):
      [Native Frames]
      System.Console!System.IO.StdInReader.ReadKey(bool&)
      System.Console!System.IO.SyncTextReader.ReadKey(bool&)
      System.Console!System.ConsolePal.ReadKey(bool)
      System.Console!System.Console.ReadKey()
      StackTracee!Tracee.Program.Main(class System.String[])
    

    dotnet-stack выведет следующие данные:

    • у комментариев в выходных данных будет префикс #;
    • у каждого потока будет заголовок, содержащий идентификатор собственного потока: Thread (<thread-id>):;
    • у кадров стеков будет следующий формат: Module!Method;
    • переходы к неуправляемому коду будут представлены в выходных данных как [Native Frames].
    # comment
    Thread (0x1234):
      module!Method
      module!Method
    
    Thread (0x5678):
      [Native Frames]
      Module!Method
      Module!Method
    

Примечание.

Остановка процесса может занять много времени (до нескольких минут) для очень крупных приложений. Среда выполнения должна передавать сведения о типе и методе для всего управляемого кода, который был захвачен для разрешения названий функций.

Следующие шаги