In-process (.NET, Windows): access violation in copilot_runtime_connection_write when responding to runtime requests

Aperta
#2,821 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
43/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Attiva
Stack tecnologico
csharp, typescript
Ambito
backend, devtools

Direzione di ricerca

Start by tracing the .NET in-process response path from FfiRuntimeHost.SendFrame through JsonRpc.SendResultResponseAsync, then inspect the native copilot_runtime_connection_write implementation and its connection lifecycle. Try to reproduce on Windows x64 with parallel MCP tool calls using the reported SDK/runtime versions; done means writes either succeed or report a managed error without crashing the host.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Summary

With in-process hosting (RuntimeConnection.ForInProcess()) on Windows x64, the host process dies with an access violation (0xC0000005) inside the native copilot_runtime_connection_write while the .NET SDK writes a response frame. It happens mid-turn in long agent sessions and takes down the whole host application.

Versions

  • GitHub.Copilot.SDK 1.0.16 (runtime 1.0.89) and 1.0.17 (runtime 1.0.93); reproduced on both
  • .NET 10, win-x64, self-contained WPF app, in-process hosting
  • Session config: OnPreToolUse hook (synchronous, returns allow), OnPermissionRequest handler (synchronous allow), OnUserInputRequest, OnElicitationRequest, an HTTP MCP server with many tools, AskUserVariant.Elicitation, a custom provider pointed at a loopback HTTP endpoint

Stack (1.0.17)

Fatal error.
0xC0000005
   at GitHub.Copilot.FfiRuntimeHost.<ConnectionWrite>g____PInvoke|55_0(UInt32, Byte*, UIntPtr)
   at GitHub.Copilot.FfiRuntimeHost.SendFrame(System.ReadOnlySpan`1<Byte>)
   at GitHub.Copilot.JsonRpc+<SendMessageAsync>d__35`1[[System.__Canon, ...]].MoveNext()
   at GitHub.Copilot.JsonRpc+<SendResultResponseAsync>d__46.MoveNext()
   at GitHub.Copilot.JsonRpc.SendResultResponseAsync(System.Text.Json.JsonElement, System.Object, System.Type, System.Threading.CancellationToken)
   at GitHub.Copilot.JsonRpc+<HandleIncomingMethodAsync>d__41.MoveNext()
   at GitHub.Copilot.JsonRpc+<ReadLoopAsync>d__37.MoveNext()
   ...
   at GitHub.Copilot.JsonRpc+<ReadMessageAsync>d__39.MoveNext()
   ...
   at GitHub.Copilot.FfiRuntimeHost+CallbackReceiveStream+<ReadAsync>d__4.MoveNext()
   ...
   at GitHub.Copilot.FfiRuntimeHost+CallbackReceiveStream+<ReadCoreAsync>d__5.MoveNext()
   at System.Threading.ThreadPoolWorkQueue.Dispatch()
   at System.Threading.PortableThreadPool+WorkerThread.WorkerThreadStart()

On 1.0.16 the same fault came through JsonRpc.SendMessageAsync from CopilotSession.HandlePendingPermissionRequestAsync.

Pattern

Both crashes happened right after the model issued two MCP tool calls in parallel. The host log shows two preToolUse approvals, then two permission-request approvals, then an MCP HTTP call returning 200, and then the fault while writing a response frame back to the runtime. FfiRuntimeHost.SendFrame already holds _lifecycleLock and checks _disposed and _connectionId, so the managed side does not seem to be writing concurrently or after close. The fault appears to be in the native write path.

Frequency: about 1 crash in 15–20 multi-tool conversations when replaying real user sessions (each 1–4 turns, 10–60 tool calls). Single-turn tests and a 40-turn sequential stress run did not reproduce it, so concurrency between parallel tool calls looks like a factor.

Possibly related: on 1.0.16 we also saw one turn hang forever. The session's events.jsonl had hook.start for preToolUse with no matching hook.end, even though our hook returns synchronously.

Expected

A response write to an open connection either succeeds or fails with a managed error. It should never crash the host process.

Happy to run a build with extra native logging if that helps.

Lingua principale
Java
Stelle
10.7k
Fork
1.5k
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di github/copilot-sdk

Tutte le issue di github/copilot-sdk

Issue simili

Altre issue su Java

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.