Pregunta

Quiero acceder a la pila de llamadas en tiempo de ejecución en una aplicación nativa de C++.No estoy usando el IDE.¿Cómo muestro la pila de llamadas?

Actualizar:Tengo una función que se llama desde muchos puntos de toda la aplicación.Se bloquea en raras ocasiones.Estaba buscando una manera de obtener el nombre de la persona que llama y registrarlo.

¿Fue útil?

Solución

Creo que este La página tiene la respuesta que estás buscando.Dijiste Visual C, así que supongo que te refieres a Windows.

Otros consejos

Mira esto pilawalk64.

Si está acostumbrado a hacer esto en .NET, se llevará una desagradable sorpresa.

Deberías considerar configurar tu filtro de excepción no controlado y escribir un archivo de minivolcado desde dentro.No es tan complicado y es bien documentada.Simplemente limítese al mínimo de cosas que haga una vez en su filtro de excepciones no controladas (lea lo que puede todo va mal si eres creativo).

Pero para estar seguro (su filtro de excepciones no controladas podría sobrescribirse inadvertidamente), puede poner su código dentro del bloque __try/__except y escribir el minivolcado desde la función de filtro (tenga en cuenta que no puede tener objetos que requieran desenredado automático en un función con el bloque __try/__except, si los tiene, considere ponerlos en una función separada):

largo __stdcall myfilter(EXCEPTION_POINTERS *pexcept_info)
{
mycreateminidump(pexcept_info);
devolver EXCEPTION_EXECUTE_HANDLER;
}
anular mifunc()
{
__intentar{
//tu lógica aquí
} __except(mifiltro(GetExceptionInformation())) {
// excepción manejada
}
}

Luego puede inspeccionar el archivo de volcado con un depurador de su elección.Tanto Visual Studio como los depuradores del paquete de herramientas de depuración de Windows pueden manejar minivolcados.

Si desea obtener una pila de llamadas del bloqueo, lo que realmente desea hacer es depuración post mortem.Si desea verificar una pila de llamadas de una aplicación mientras se está ejecutando, esta es una de las muchas funciones Explorador de procesos SysInternals Puedo ofrecer.

Si no está depurando activamente, puede "bloquear" la aplicación para producir un minivolcado (esto se puede hacer de forma no invasiva y permite que la aplicación continúe ejecutándose).IIRC DrWatson le permitirá hacer esto, si no, el volcado de usuario del soporte de MS lo hará.

Luego puede cargar el volcado en windbg y ver la pila de llamadas + variables, etc. allí.Necesitará los símbolos de su aplicación para que el rastro tenga sentido.

Si está buscando trazas de estilo de código en tiempo de ejecución más simples, le recomiendo una clase simple que cree una instancia en cada método, el constructor escribe el nombre del método usando OutputDebugString.Utilice WinDebug para ver el seguimiento mientras se ejecuta el programa.(ponga alguna forma de control en su clase, incluso si es solo una variable global o un valor de registro, o un Atom global para que pueda activar o desactivar el seguimiento a voluntad).

Se bloquea en raras ocasiones.Estaba buscando una manera de obtener el nombre de la persona que llama y registrarlo.

¿A qué te refieres con que falla?¿Infracción de acceso?¿Dividir entre cero?¿qué exactamente?¿Interactúa con los componentes del modo kernel?

Activa el verificador de aplicaciones.eso debería eliminar muchas cosas.

crea esto:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\FileName.exe

Bajo esa tecla, cree un nuevo nombre de cadena:Valor del depurador:c:\pathtowindbg\windbg.exe -gG -xe av

Si está ejecutando código de 32 bits con WOW, debe hacerlo en el nodo wow3264.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top