• Sábado 14 de Diciembre de 2024, 23:58

Autor Tema:  Pila De Llamadas / Call Stack  (Leído 1575 veces)

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Pila De Llamadas / Call Stack
« en: Jueves 30 de Noviembre de 2006, 18:08 »
0
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

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Pila De Llamadas / Call Stack
« Respuesta #1 en: Jueves 30 de Noviembre de 2006, 18:25 »
0
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.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: Pila De Llamadas / Call Stack
« Respuesta #2 en: Martes 5 de Diciembre de 2006, 10:01 »
0
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