dotnet / android

.NET for Android provides open-source bindings of the Android SDK for use with .NET managed languages such as C#
MIT License
1.9k stars 525 forks source link

EndOfStreamException in dotnet-trace when tracing an Android app #9080

Closed MichaelRumpler closed 1 week ago

MichaelRumpler commented 2 weeks ago

Android framework version

net8.0-android

Affected platform version

.NET 8.0.300

Description

I tried to follow https://github.com/dotnet/android/blob/main/Documentation/guides/tracing.md#running-dotnet-trace-on-the-host

I ran adb reverse and dotnet-dsrouter without a problem, but when I try dotnet-trace I get this output:

D:\src\RoyalConnect.Mobile.Android>dotnet-trace collect -p 4208 --format speedscope --dur ation 00:00:05:00 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

[ERROR] System.IO.EndOfStreamException: Unable to read beyond the end of the stream. at System.IO.BinaryReader.InternalRead(Int32 numBytes) at System.IO.BinaryReader.ReadUInt16() at Microsoft.Diagnostics.NETCore.Client.IpcHeader.Parse(BinaryReader reader) in //src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcHeader.cs:line 55 at Microsoft.Diagnostics.NETCore.Client.IpcMessage.Parse(Stream stream) in //src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcMessage.cs:line 117 at Microsoft.Diagnostics.NETCore.Client.IpcClient.Read(Stream stream) in //src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcClient.cs:line 107 at Microsoft.Diagnostics.NETCore.Client.IpcClient.SendMessageGetContinuation(IpcEndpoint endpoint, IpcMessage message) in //src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcClient.cs:line 44 at Microsoft.Diagnostics.NETCore.Client.EventPipeSession.Start(IpcEndpoint endpoint, EventPipeSessionConfiguration config) in //src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/EventPipeSession.cs:line 45 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, Boolean showchildio, Boolean resumeRuntime, String stoppingEventProviderName, String stoppingEventEventName, String stoppingEventPayloadFilter, Nullable`1 rundown) in //src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs:line 285

The two providers are listed at once. The error comes after about a minute even though I set duration to 5 minutes. I don't see

Waiting for connection on /tmp/maui-app Start an application with the following environment variable: DOTNET_DiagnosticPorts=/tmp/maui-app

One minute is not enough to run dotnet build -t:Run -c Release -p:AndroidEnableProfiler=true --no-restore in another window.

I also tried setting DOTNET_DiagnosticPorts to some file in both windows, but then both commands are waiting for that file. How can I get dotnet-trace and my Android app to sync?

I installed all three dotnet global tools today. dotnet-trace has version 8.0.532401+d98406ff95be0a8398d4c403056c5705389665f3.

Steps to Reproduce

  1. In a command window: adb reverse tcp:9000 tcp:9001
  2. dotnet-dsrouter android
  3. In another window: adb shell setprop debug.mono.profile '127.0.0.1:9000,nosuspend,connect'
  4. dotnet-trace ps - look up pid of dsrouter and use it in
  5. dotnet-trace collect -p 43512 --format speedscope --duration 00:00:05:00

Did you find any workaround?

No response

Relevant log output

No response

jpobst commented 2 weeks ago

@jonathanpeppers Is this us or is this a dotnet/runtime thing?

jonathanpeppers commented 2 weeks ago

@MichaelRumpler you might watch this, and see if you missed a step:

I think we could move this to the dotnet/diagnostics repo, but it doesn't seem like I have permission:

MichaelRumpler commented 2 weeks ago

Thanks for the fast response! In the video I also didn't see

Waiting for connection on /tmp/maui-app

But I saw that you started the app in advance. I thought I should start it when dotnet-trace is already running. This will probably be the reason. I'll let you know (but don't have time today anymore).

MichaelRumpler commented 2 weeks ago

Yes, that was the problem. The app needs to be started already (at least with nosuspend) when you run dotnet-trace.

Maybe you can switch the order of "Running dotnet-trace on the Host" and "Running the .NET for Android Application" and remove the "Waiting for connection on /tmp/maui-app" in Documentation/guides/tracing.md.

dotnet-trace now saves something, but speedscope cannot get useful data out of it. But thats a different problem. image

jonathanpeppers commented 1 week ago

I feel like ?!? appears if dotnet-trace wasn't shut down cleanly. Did you press enter to stop it?

Do all the other threads look the same?

MichaelRumpler commented 1 week ago

I added the --duration in my previous attempts because I wanted it to wait until the app was started. It seems like when it ended via duration, the trace was not complete. I started the app in advance and removed that parameter and now the trace is complete. Thank you!

Here again what I did.

Window 1:

Window 2:

Do the tests in the app and press return in dotnet-trace to write the trace.