SoloCodigo

Programación General => C/C++ => Visual C++ => Mensaje iniciado por: diego.martinez en Jueves 30 de Noviembre de 2006, 18:08

Título: Pila De Llamadas / Call Stack
Publicado por: diego.martinez en Jueves 30 de Noviembre de 2006, 18:08
Buenas:

Estoy intentando hacer un gestor de errores del codigo, y me preguntaba, (no se si estoy preguntando una burrada):

hay alguna forma de accesar el contenido de la pila de llamadas (call stack),
tal que al llamar a una funcion me indique por que funciones ha pasado?

un ejemplo de lo que querria seria:

void func1()
{
func2();
}

void func2()
{
func3();
}
void func3()
{
escribe_pila();
}


y el resultado :

xxxx:xxxx func3
xxxx:xxxx func2
xxxx:xxxx func1

ya se que seguramente tendria que hacer una tabla con pseudonimos para las direcciones de las funciones y comparar las direcciones de la pila con la tabla para identificarlas, pero ¿es posible acceder a la pila?.
Inmagino que acceder a ella tendra el problema intrinseco de afectar a la propia pila en la llamada...

pd: gracias por adelantado como siempre
Título: Re: Pila De Llamadas / Call Stack
Publicado por: Eternal Idol en Jueves 30 de Noviembre de 2006, 18:25
Busca en Google por "walking the stack", tenes que comprender como se estructura la pila y los registros fundamentales (esp y ebp). Pero esto no es algo completamente FIABLE, hay funciones que construyen marcos de pila (con ebp) y otras que no, depende del compilador y su configuracion. Hay funciones de la API de Windows por ahi pero ahora no me acuerdo si servian para x86 o solo para x64.
Título: Re: Pila De Llamadas / Call Stack
Publicado por: diego.martinez en Martes 5 de Diciembre de 2006, 10:01
muchisimas gracias, con "walking the stack" ya lo he encontrado.  :)
parece que hay una funcion que lo hace tal como queria y todo.

http://www.codeproject.com/threads/StackWalker.asp (http://www.codeproject.com/threads/StackWalker.asp)