Así que en realidad solo tuve que descubrir cómo hacer esto: todavía no he usado esta solución de forma exhaustiva en la producción, pero hay una biblioteca relativamente nueva llamada ClrMd.
http://blogs.msdn.com/b/dougste/archive/2013/05/04/clrmd-net-crash-dump-and-live-process-inspection.aspx
Con ella, yo soy capaz de conectar a mi propio proceso y obtener un seguimiento de pila para todos los hilos en vivo.El uso de este cuando se detecta un punto muerto antes de reiniciar nuestra aplicación de este 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);
Lo realmente importante para conseguir que para trabajar desde el mismo proceso es AttachFlag.Passive
Si usted acaba de hacer DataTarget.AttachToProcess(pid, 5000)
, que va a hacer una conexión "invasiva" que intenta detener el proceso. Esto arroja una excepción cuando intenta adjuntar a su propio proceso, lo asumo porque no puede pausar su aplicación mientras intenta adjuntar desde su aplicación o algo así.
De todos modos, sí, cosas muy interesantes.
Si alguien tiene alguna razón por la cual esto es súper ingenuo o algo así, por favor, señálelos. Todavía no lo he usado en producción (solo apagué la primera instancia), así que espero que funcione.
¿Qué quieres hacer con los hilos? – Simon