Quindi, in realtà, ho dovuto solo capire come farlo: non ho ancora utilizzato questa soluzione in modo estensivo nella produzione, ma esiste una libreria relativamente nuova chiamata ClrMd.
http://blogs.msdn.com/b/dougste/archive/2013/05/04/clrmd-net-crash-dump-and-live-process-inspection.aspx
Con esso, sono in grado di connettersi al mio processo e ottenere una traccia dello stack per tutti i thread dal vivo.L'utilizzo di questo quando viene rilevata una situazione di stallo prima di riavviare la nostra applicazione in questo modo:
var result = new Dictionary<int, string[]>();
var pid = Process.GetCurrentProcess().Id;
using (var dataTarget = DataTarget.AttachToProcess(pid, 5000, AttachFlag.Passive))
{
string dacLocation = dataTarget.ClrVersions[0].TryGetDacLocation();
var runtime = dataTarget.CreateRuntime(dacLocation);
foreach (var t in runtime.Threads)
{
result.Add(
t.ManagedThreadId,
t.StackTrace.Select(f =>
{
if (f.Method != null)
{
return f.Method.Type.Name + "." + f.Method.Name;
}
return null;
}).ToArray()
);
}
}
var json = JsonConvert.SerializeObject(result);
zip.AddEntry("_threads.json", json);
La cosa veramente importante per ottenere che lavorare dallo stesso processo è AttachFlag.Passive
Se lo farete DataTarget.AttachToProcess(pid, 5000)
, lo farà un attaccamento "invasivo" che tenta di mettere in pausa il processo. Ciò genera un'eccezione quando si tenta di collegarsi al proprio processo, presumo poiché non è possibile sospendere l'applicazione durante il tentativo di allegare dall'applicazione o qualcosa del genere.
In ogni caso, sì, roba davvero interessante.
Se qualcuno ha dei motivi per cui questo è super ingenuo o altro, per favore segnalalo. Non l'ho ancora usato molto in produzione (basta mettere la prima istanza) così sperando che funzioni.
fonte
2014-06-19 20:48:52
cosa vuoi fare con i fili? – Simon