Skip to content

Fix orphaned crashpad_handler processes after Android emulator stop#48

Open
Copilot wants to merge 3 commits intomainfrom
copilot/fix-orphaned-crashpad-handler-processes
Open

Fix orphaned crashpad_handler processes after Android emulator stop#48
Copilot wants to merge 3 commits intomainfrom
copilot/fix-orphaned-crashpad-handler-processes

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Mar 31, 2026

maui android emulator stop kills the main qemu-system-aarch64 process via ADB but leaves its crashpad_handler children orphaned (reparented to PID 1). These accumulate ~5 MB each over repeated start/stop cycles.

Approach

Capture the emulator's child PIDs before issuing the ADB stop, then kill any survivors after it completes:

// AndroidProvider.StopEmulatorAsync
var emulatorPid = EmulatorProcessHelper.FindEmulatorProcessId(deviceSerial);
IReadOnlyList<int> childPids = emulatorPid.HasValue
    ? EmulatorProcessHelper.GetChildProcessIds(emulatorPid.Value)
    : Array.Empty<int>();

await _adb.StopEmulatorAsync(deviceSerial, cancellationToken);

if (childPids.Count > 0)
    EmulatorProcessHelper.KillProcessIds(childPids);

New: EmulatorProcessHelper

Internal static helper with two layers:

  • Pure parsing methods (testable, no I/O) — parse ps output to map PIDs to parents, identify the qemu-system-* process for a given serial's console port (matching -port XXXX and @XXXX arg formats), and enumerate direct children
  • Platform operation methods (macOS/Linux only; no-op on Windows and on any error) — run ps -eo pid,args / ps -eo pid,ppid, return discovered PIDs, kill survivors with per-process error isolation

Tests

17 unit tests covering port extraction, ps output parsing, qemu PID matching (both -port and @port formats, multiple simultaneous emulators), and child PID enumeration.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • 11vvsblobprodcus336.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/4DD03B7307853E158CACADCFA3560377/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force cros�� (dns block)
  • 1p7vsblobprodcus324.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet build src/Cli/Microsoft.Maui.Cli.UnitTests/Microsoft.Maui.Cli.UnitTests.csproj -c Release 0 -j ACCEPT (dns block)
    • Triggering command: /usr/share/dotnet/dotnet /usr/share/dotnet/dotnet msbuild /m /nologo /clp:Summary /v:minimal /nr:false /warnaserror /p:TreatWarningsAsErrors=true /p:ContinuousIntegrationBuild=true /home/REDACTED/work/maui-labs/maui-labs/artifacts/toolset/restore.proj /bl:/home/REDACTED/work/maui-labs/maui-labs/artifacts/log/Release/ToolsetRestore.binlog /t:__WriteToolsetLocation /clp:ErrorsOnly;NoSummary /p:__ToolsetLocationOutputFile=/home/REDACTED/work/maui-labs/maui-labs/artifacts/toolset/10.0.0-beta.26168.104.txt (dns block)
    • Triggering command: /usr/bin/dotnet dotnet build src/Cli/Microsoft.Maui.Cli.UnitTests/Microsoft.Maui.Cli.UnitTests.csproj -c Release --no-restore (dns block)
  • 2kmvsblobprodcus39.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/46EB19D8E6D150879BD3367A72FC2FBC/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • 4myvsblobprodcus32.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/5A662EEFB2568432D6FDBE7CF1D19C8E/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force ng/emptyFakeDotnetRoot ing/emptyFakeDotnetRoot (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/89B4107364AD016C1857C138B15EFD04/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • 4vyvsblobprodcus361.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/CCFF80F07862756B14349BFA65E8CEB4/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/89B4107364AD016C1857C138B15EFD04/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/BDA7B32C5A2E208C2B285E396532BAD8/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • 5dkvsblobprodcus355.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/9AA715C847E13D676D5E6D186CBCC963/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • 6s7vsblobprodcus313.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/85ED87705A97662A3C6AC9F60AF6DBA9/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/89B4107364AD016C1857C138B15EFD04/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/71D8F1331231B3366990DDCEAEF101CB/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • 7devsblobprodcus323.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/8C05F420C0A27C744026142384549B8D/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • 7tjvsblobprodcus341.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/8A2F7455CD2F458A2062C7DF2BE22B1E/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/7D8BC36542F9E5B7835753BC11373DCE/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • 80zvsblobprodcus35.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/3A31E2867A9E7AA6F06B7D2833E11491/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • c50vsblobprodcus330.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/CB3D70C1C3CCEDE61E9080295E05A90C/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • cflvsblobprodcus383.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/89B4107364AD016C1857C138B15EFD04/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • dlbvsblobprodcus316.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/5B74F40C93A078C72D8DF238B871667A/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/89B4107364AD016C1857C138B15EFD04/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/BDA7B32C5A2E208C2B285E396532BAD8/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • e7bvsblobprodcus348.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/4DD03B7307853E158CACADCFA3560377/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force cros�� (dns block)
  • frdvsblobprodcus327.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/3F3C89B33496786B1BC802D045E3B1EC/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • josvsblobprodcus372.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/8C05F420C0A27C744026142384549B8D/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/0D40234D717C8D8DC65416C06F8EE66F/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • k4kvsblobprodcus344.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/B8868C850D22F21D56C42BA51547696A/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/97B6F2CA4656254F7A852783585D5FF8/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/2DF8A9EB8592198A8B4530E65D919638/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force cros�� (dns block)
  • kmuvsblobprodcus389.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/8C05F420C0A27C744026142384549B8D/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • kxqvsblobprodcus376.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/8C05F420C0A27C744026142384549B8D/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • m8dvsblobprodcus37.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/5A662EEFB2568432D6FDBE7CF1D19C8E/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force ng/emptyFakeDotnetRoot ing/emptyFakeDotnetRoot (dns block)
  • n3kvsblobprodcus335.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/6EDBD3A810A2F498C79EAF56BB45C68B/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • p2ovsblobprodcus312.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/1381A7934071EB35EC16B755076CAB69/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • pc2vsblobprodcus360.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/89B4107364AD016C1857C138B15EFD04/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • securitytools.pkgs.visualstudio.com
    • Triggering command: /opt/hostedtoolcache/CodeQL/2.24.3/x64/codeql/csharp/tools/linux64/Semmle.Autobuild.CSharp /opt/hostedtoolcache/CodeQL/2.24.3/x64/codeql/csharp/tools/linux64/Semmle.Autobuild.CSharp (dns block)
  • u6ovsblobprodcus377.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/3A31E2867A9E7AA6F06B7D2833E11491/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • uy6vsblobprodcus34.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet build src/Cli/Microsoft.Maui.Cli.UnitTests/Microsoft.Maui.Cli.UnitTests.csproj -c Release 0 -j ACCEPT (dns block)
  • vwvvsblobprodcus334.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/CCFF80F07862756B14349BFA65E8CEB4/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/89B4107364AD016C1857C138B15EFD04/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • yluvsblobprodcus367.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/9AA715C847E13D676D5E6D186CBCC963/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • ytvvsblobprodcus310.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/FDF62E18DC280BA5DDB971B891D2EB18/missingpackages_workingdir --packages /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-a7656e55742be5f5/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)

If you need me to access, download, or install something from one of these locations, you can either:

Copilot AI changed the title [WIP] Fix orphaned crashpad_handler processes after emulator stop Fix orphaned crashpad_handler processes after Android emulator stop Mar 31, 2026
Copilot AI requested a review from rmarinho March 31, 2026 16:53
@rmarinho rmarinho marked this pull request as ready for review April 1, 2026 22:55
Copilot AI review requested due to automatic review settings April 1, 2026 22:56
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR addresses a resource leak in the MAUI CLI’s Android emulator stop flow where adb emu kill stops the main qemu-system-* process but can leave crashpad_handler (and potentially other) child processes orphaned, accumulating memory over repeated cycles.

Changes:

  • Add EmulatorProcessHelper utilities to find the emulator’s QEMU PID, enumerate its direct child PIDs, and terminate remaining child processes after shutdown (macOS/Linux only).
  • Update AndroidProvider.StopEmulatorAsync to snapshot child PIDs before stopping the emulator and kill survivors afterward.
  • Add unit tests covering port parsing, ps output parsing, QEMU PID matching, and child PID enumeration.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.

File Description
src/Cli/Microsoft.Maui.Cli/Utils/EmulatorProcessHelper.cs New helper to locate emulator QEMU process, enumerate child PIDs, and kill remaining child processes post-stop.
src/Cli/Microsoft.Maui.Cli/Providers/Android/AndroidProvider.cs Hooks the helper into StopEmulatorAsync to clean up orphaned child processes.
src/Cli/Microsoft.Maui.Cli.UnitTests/EmulatorProcessHelperTests.cs Adds unit coverage for parsing and PID matching/enumeration behavior.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +176 to +180
{
try
{
using var process = Process.GetProcessById(pid);
process.Kill(entireProcessTree: false);
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

KillProcessIds terminates processes solely by PID captured earlier. If a child exits during shutdown and its PID gets reused before this loop runs, this can kill an unrelated process. Consider re-validating each PID before killing (e.g., re-query pid→ppid and/or verify the command line still matches expected emulator child processes like crashpad_handler).

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[MAUI CLI] Orphaned crashpad_handler processes after emulator stop

3 participants