Проверка трассировки управляемого стека (dotnet-stack)
Эта статья относится к версиям ✔️ dotnet-stack
5.0.221401 и более поздних версий.
Установка
Есть два способа загрузки и установки dotnet-stack
:
Средство dotnet global:
Чтобы установить последнюю версию пакета NuGet
dotnet-stack
, используйте команду dotnet tool install.dotnet tool install --global dotnet-stack
Прямое скачивание:
скачайте исполняемый файл средства, соответствующий вашей платформе:
ОС Платформа Windows x86 x64 Arm-x64 Arm-x64 | | | Linux x64 Arm64 | | | musl-x64 musl-arm64 |
Краткие сведения
dotnet-stack [-h, --help] [--version] <command>
Description
Программа dotnet-stack
—
- это кроссплатформенное средство .NET Core.
- Оно сканирует и выводит управляемые стеки для всех потоков в целевом процессе .NET.
- Средство использует трассировку
EventPipe
, обеспечиваемую средой выполнения .NET Core.
Параметры
-h|--help
Отображение справки в командной строке.
--version
Отображение версии служебной программы dotnet-stack.
Команды
Команда | Description |
---|---|
dotnet-stack report | Выводит трассировку стека для каждого потока в целевом процессе. |
dotnet-stack ps | Выводит список процессов dotnet, из которыми можно собирать трассировки стека. |
символьная символика dotnet-stack | Получите номер строки из маркера метода и смещения IL в стекtrace. |
dotnet-stack report
Выводит трассировку стека для каждого потока в целевом процессе.
Краткие сведения
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 в стекtrace.
Краткие сведения
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
- В Windows его можно получить, например, через диспетчер задач или с помощью команды
Выполните следующую команду:
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
- у комментариев в выходных данных будет префикс
Примечание.
Остановка процесса может занять много времени (до нескольких минут) для очень крупных приложений. Среда выполнения должна отправлять сведения о типе и методе для всех управляемых кодов, которые были записаны для разрешения имен функций.