2010-05-17 12 views
5

Tengo un código administrado que llama a un método dentro de una DLL nativa (tengo los archivos de símbolos apropiados).
A veces, ese método nativo arroja una excepción que capto en mi código administrado. Sin embargo, cuando imprimo el stacktrace de mi excepción detectada, solo veo código administrado (el último fotograma es la llamada al código nativo ... pero no ve el stacktrack dentro del código nativo).Cómo obtener la pila de pila nativa de las excepciones nativas capturadas en el código administrado

¿Cómo puedo obtener la pila de llamadas nativa también?
* Cuando estoy depurando el código, puedo entrar en el código nativo y ver la pila de llamadas actual.

Respuesta

1

La obtención de un seguimiento de pila nativo es bastante difícil. En el momento en que pasa a través de la capa de traducción nativa/.NET, el rastreo de la pila nativa ya se ha perdido.

Por lo tanto, debe capturarlo mientras todavía está en el código nativo, y esto también es bastante difícil. Eche un vistazo al trabajo de John Robbins para el trazado correcto de la pila nativa; la última versión públicamente disponible de su SUPERASSERT que pude encontrar es MSJ, Feb 1999.

+1

-1 Traducir como "No sé cómo hacerlo, así que voy a escribir jerga sobre lo que no sé, luego al azar enlace de búsqueda de Google" Muy útil. –

+0

En realidad, lo he hecho (capturó de manera confiable un seguimiento de pila nativo, a partir del código no administrado). Antes de que se escribiera SUPERASSERT también. Toma eso. : P –

+0

Lo siento, levanto una ceja a la palabra "difícil". "Difícil" generalmente se traduce en, difícil de investigar o difícil de mantener. Porque decir que el código es difícil no tiene mucho sentido. Descubrí que esto no requeriría mucho mantenimiento, así que asumí lo anterior. –

1

Esto no es tan ingenioso como mostrar la pila de llamadas nativas cuando detecta la excepción, pero si intenta rastrear un problema específico en la computadora de un usuario y el usuario es razonablemente inteligente puede hacer que ejecute su aplicación bajo WinDbg. Se romperá cuando se lanza la excepción nativa y se puede ver la pila de llamadas.

Otra posibilidad es usar stackwalker. Es gratis y está disponible aquí: http://www.codeproject.com/KB/threads/StackWalker.aspx Si conoce la llamada nativa de nivel superior, puede envolverla con un catch __try/__ y usar stackwalker para volcar la pila en un archivo de registro. Presumiblemente, también podría detectar la excepción, obtener la pila de llamadas usando stackwalker, agregar la pila de llamadas a la excepción (como una cadena), y luego volver a lanzar la excepción a su código .NET. El código .NET podría obtener la llamada de su excepción.

Cuestiones relacionadas