c# - tipo - Cómo encontrar el origen de una excepción StackOverflowException en mi aplicación
system stackoverflowexception vb net (2)
Tengo un StackOverFlow en algún lugar de mi aplicación, y estoy tratando de encontrar maneras de rastrearlo.
Mis registros de eventos muestran un bloqueo todos los días aproximadamente con la siguiente información:
Nombre de la aplicación con errores: MyApp.exe, versión: 1.0.0.0, marca de tiempo: 0x522e8317
Nombre de módulo defectuoso: clr.dll, versión: 4.0.30319.18047, sello de tiempo: 0x515530ce
Código de excepción: 0xc00000fd
Desplazamiento de fallas: 0x000000000000c657
Identificación del proceso con errores: 0x117fc
Error en el inicio de la aplicación: 0x01ceadf607b184d2
Ruta de la aplicación con errores: C: / Users / Administrator / Desktop / MyApp.exe
Ruta del módulo defectuoso: C: / Windows / Microsoft.NET / Framework64 / v4.0.30319 / clr.dll
ID de informe: d52424aa-1a16-11e3-bc4b-002590a4ec55
Leí que 0xc00000fd es un desbordamiento de pila, pero no estoy seguro de dónde podría estar ocurriendo (base de código muy grande) y cómo rastrearlo. ¿Algunas ideas?
Esto suele ser algo que uso WinDbg para localizar, de lo contrario es solo un juego de adivinanzas. Aquí hay un tutorial rápido que debería ponerte en la dirección correcta.
WinDbg es un depurador para Windows, bueno para depurar código administrado y no administrado. También es ideal para examinar los vertederos de accidentes. Vamos a empezar con un programa de ejemplo.
class Program
{
static void Main(string[] args)
{
IWill(0);
}
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
static int IWill(int i)
{
return IWill(i + 1);
}
}
Este es un ejemplo bastante artificial, pero vamos a seguir adelante. De hecho, apila el desbordamiento, y tampoco proporciona un seguimiento de la pila. Aquí es donde entra en juego WinDbg. Primero necesita instalarlo, que es parte de las herramientas de depuración en el SDK de Windows . Hay dos versiones, la x64 y la x86. Querrá ejecutar el que coincida con el bitness de su aplicación.
En WinDbg, use Archivo -> Abrir archivo ejecutable y ejecute su ejecutable con WinDbg adjunto. El depurador se interrumpirá tan pronto como se cargue su aplicación, puede usar el comando g
para Ir y usar su aplicación hasta que obtenga una Exception. Sin embargo, antes de hacer eso, asegúrate de que tus símbolos sean correctos. Por lo general, la ejecución de .symfix+
lo corregirá, luego podrás ir.
Cuando obtenga su Exception, el depurador se interrumpirá en el hilo que generó la excepción y el mensaje será algo como esto:
(cc0.b00): desbordamiento de pila - código c00000fd (primera oportunidad)
Ahora podemos cargar las extensiones de depuración administradas con este comando (supongo que está utilizando .NET Framework 4.0 o 4.5 aquí):
.loadby sos clr
Y llamando !clrstack
. En este ejemplo, la salida es:
000000d440c76040 00007ffb282b0111 er.Program.IWill(Int32) [Program.cs @ 20]
000000d440c76080 00007ffb282b0111 er.Program.IWill(Int32) [Program.cs @ 20]
000000d440c760c0 00007ffb282b0111 er.Program.IWill(Int32) [Program.cs @ 20]
..Repeat thousands of times..
Así que tenemos nuestra pila administrada en el momento de la excepción Exception.
Si su aplicación no hace muy fácilmente, puede configurar ADPlus para tomar un volcado de memoria de su aplicación en el momento de la excepción Exception. ADPlus es otra herramienta de gran martillo, pero es efectiva. Primero necesita una configuración para ADPlus, aquí hay un ejemplo:
<ADPlus>
<!-- Add log entry, log faulting thread stack and dump full on first chance -->
<Exceptions>
<Config>
<!-- Use sov for exception -->
<Code> sov </Code>
<Actions1> Log;Stack;FullDump </Actions1>
<!-- Depending on what you intend - either stop the debugger (Q or QQ) or continue unhandled (GN) -->
<ReturnAction1> GN </ReturnAction1>
< Config>
</Exceptions>
</ADPlus>
Este ejemplo de configuración fue publicado originalmente por el usuario jaskis en los foros de MSDN: http://blogs.msdn.com/b/jaskis/archive/2010/08/11/cwa-ends-up-with-blank-screen-on-browser-on-iis-7.aspx Luego use la línea de comandos para iniciar su aplicación con la configuración.
Esto es solo un ejemplo, WinDbg es una herramienta muy poderosa, aunque tiene una pequeña curva de aprendizaje. Hay muchos buenos recursos en Internet para aprender a usarlo. Tess Ferrandez tiene muchos artículos en su blog que cubren WinDbg y las extensiones de depuración administradas.
Esto ya se ha respondido, pero estaba buscando una mejor respuesta que WinDbg
en la máquina afectada, ya que esto solo sucede en las máquinas de un servidor de producción donde no quiero instalar WinDbg
. Encontré este artículo donde se refiere a una herramienta descargable de Microsoft que le permite configurar, por código de excepción, cómo debe responder el sistema a diferentes excepciones. Esto (con suerte) permitirá la depuración en una máquina diferente a la máquina de producción:
Esta utilidad DebugDiag
puede configurarse para generar un volcado cuando se produce la Exception
. Descárgalo here .