dotnet-trace не разрешает символы в linux-arm

#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>
 
  1. Как я создаю двоичные файлы для linux-arm Windows:
 dotnet publish --configuration Debug -r linux-arm --self-contained
 
  1. Я скопировал все содержимое внутри каталога ..TraceTestbinDebugnetcoreapp5.0linux-armpublish в $HOME/TraceTest on linux-arm
  2. Установите .net core 5.0 sdk on linux-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
 
  1. Установить dotnet-trace на linux-arm :
 dotnet tool install --global dotnet-trace
export PATH="$PATH:/home/root/.dotnet/tools"
 
  1. Соберите трассировку для моего 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.
 
  1. Я открыл файл трассировки $HOME/TraceTest/trace.nettrace на своем компьютере с Windows PerfView с помощью . Я дважды щелкнул 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 ).

Надеюсь, я пропустил здесь что-то простое, и кто-нибудь может мне помочь.