#c# #.net-core #arm #embedded-linux #trace
#c# #.net-core #рука #встроенный-linux #трассировка
Вопрос:
Я хочу использовать dotnet-trace
on linux-arm
для анализа своего приложения, но символы / имена моего приложения по какой-то причине не разрешаются.
Если я использую dotnet-trace
для того же приложения linux-x64
, оно будет разрешать символы / имена просто отлично.
Пример трассировки linux-arm
выглядит следующим образом в PerfView
:
Трассировка в linux-arm в PerfView
Вот мои подробные шаги. Мое приложение TestTrace
состоит из 2 файлов:
Program.cs:
using System;
namespace TraceTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("DoSomething ...");
DoSomething();
Console.WriteLine("Finished!");
}
static void DoSomething()
{
for(var i = 0; i< 1_000_000_000; i ){}
}
}
}
TraceTest.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp5.0</TargetFramework>
</PropertyGroup>
</Project>
- Как я создаю двоичные файлы для
linux-arm
Windows:
dotnet publish --configuration Debug -r linux-arm --self-contained
- Я скопировал все содержимое внутри каталога
..TraceTestbinDebugnetcoreapp5.0linux-armpublish
в$HOME/TraceTest
onlinux-arm
- Установите
.net core 5.0 sdk
onlinux-arm
(все следующие команды были выполнены какroot
.):
wget https://download.visualstudio.microsoft.com/download/pr/726e260e-ce94-46c3-a169-57b2ebf5433d/5fb2a00b04b3509a0a6db63e302523a8/dotnet-sdk-5.0.102-linux-arm.tar.gz -O dotnet-sdk-5.0.102-linux-arm.tar.gz
mkdir -p "$HOME/dotnet" amp;amp; tar zxf dotnet-sdk-5.0.102-linux-arm.tar.gz -C "$HOME/dotnet"
export DOTNET_ROOT=$HOME/dotnet
export PATH=$PATH:$HOME/dotnet
- Установить
dotnet-trace
наlinux-arm
:
dotnet tool install --global dotnet-trace
export PATH="$PATH:/home/root/.dotnet/tools"
- Соберите трассировку для моего
TraceTest
приложения:
cd $HOME/TraceTest
chmod x TraceTest
dotnet-trace collect -- TraceTest
Я получил следующий вывод (я остановил трассировку вручную здесь):
root@myLinuxArmMachine:$HOME/TraceTest# dotnet-trace collect -- TraceTest
No profile or providers specified, defaulting to trace profile 'cpu-sampling'
Provider Name Keywords Level Enabled By
Microsoft-DotNETCore-SampleProfiler 0x0000F00000000000 Informational(4) --profile
Microsoft-Windows-DotNETRuntime 0x00000014C14FCCBD Informational(4) --profile
Process : $HOME/TraceTest/TraceTest
Output File : $HOME/TraceTest/trace.nettrace
[00:00:00:17] Recording trace 599.055 (KB)
Press <Enter> or <Ctrl C> to exit...969 (KB)
Stopping the trace. This may take up to minutes depending on the application being traced.
Trace completed.
- Я открыл файл трассировки
$HOME/TraceTest/trace.nettrace
на своем компьютере с WindowsPerfView
с помощью . Я дважды щелкнулThread Time (with StartStop Activities) Stacks
и открыл вкладкуCallTree
, но разрешенных символов / имен не было (см. Скриншот выше).
Я выполнил тот же процесс трассировки linux-x64
, и символы / имена были разрешены просто отлично: трассировка с помощью символов / имен в linux-x64 в PerfView
Другие вещи, которые я безуспешно пытался:
- Используйте .net core 3.1 вместо 5.0 (поэтому адаптируйте TraceTest.csproj, используйте .net core 3.1 sdk и установите dotnet-trace для .net core 3.1). Я знаю, что выполнить команду невозможно
dotnet-trace collect -- TraceTest
.net core 3.1
(поэтому я добавил консоль.ReadKey() в мой Program.cs и запустил приложение вручную). - Преобразуйте трассировку в формат speedscope с помощью
dotnet-trace convert trace.nettrace --format Speedscope --output trace.speedscope
. Но вы можете ясно видеть, что внутри trace.speedscope.json нет разрешенных имен для каких-либо фреймов. В сравнении я вижу некоторые значимые имена имен в преобразованной трассировкеlinux-x64
. - Скопируйте проект
TestTrace
напрямуюlinux-arm
и запустите его черезdotnet run
. - Не останавливайте трассировку вручную. Я всегда получаю следующую ошибку, но я не думаю, что это должно повлиять на результат трассировки:
[ERROR] Microsoft.Diagnostics.NETCore.Client.ServerNotAvailableException: Could not send Stop command. The target process may have exited.
at Microsoft.Diagnostics.NETCore.Client.EventPipeSession.Stop() in /_/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/EventPipeSession.cs:line 62
at Microsoft.Diagnostics.Tools.Trace.CollectCommandHandler.Collect(CancellationToken ct, IConsole console, Int32 processId, FileInfo output, UInt32 buffersize, String providers, String profile, TraceFileFormat format, TimeSpan duration, String clrevents, String clreventlevel, String name, String diagnosticPort) in /_/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs:line 221
Я также искал связанные проблемы, но не могу найти свою точную проблему (работает нормально linux-x64
, но не работает linux-arm
).
Надеюсь, я пропустил здесь что-то простое, и кто-нибудь может мне помочь.