J'ai essayé d'effectuer le vidage de mon programme et d'enregistrer sa trace de pile en cas de panne. J'ai installé mon propre gestionnaire win32 SE avec _set_se_translator
et j'ai essayé de vider la trace de la pile avec StackWalk64
et enfin de lancer une exception C++ (qui fait la journalisation quand elle est interceptée).Pourquoi StackWalk64 est-il toujours vrai?
Le code ressemble à ceci:
...
_set_se_handlers(WIN32EXCEPTION::Win32ExceptionStuff);
...
void WIN32EXCEPTION::Win32ExceptionStuff(unsigned int Code, struct _EXCEPTION_POINTERS* Info) // static
{
STACKFRAME64 sf64;
sf64.AddrPC.Offset = Info->ContextRecord->Eip;
sf64.AddrStack.Offset = Info->ContextRecord->Esp;
sf64.AddrFrame.Offset = Info->ContextRecord->Ebp;
sf64.AddrPC.Mode= sf64.AddrStack.Mode= sf64.AddrFrame.Mode= AddrModeFlat;
while (StackWalk64(IMAGE_FILE_MACHINE_I386,GetCurrentProcess(),GetCurrentThread(),
&sf64,Info->ContextRecord,0,SymFunctionTableAccess64,SymGetModuleBase64,0))
{
//... Do something with the stack frames
}
throw WIN32EXCEPTION(/*...*/);
}
comme je l'ai vu dans quelques exemples, mais il y a un problème: StackWalk64 retourne toujours vrai et que la boucle while
devient infinie. Le StackWalk64 ne répète que la même image.
Quel est le problème et comment y remédier?
Et oui, c'était le problème. – Calmarius
Vous pouvez faire 'STACKFRAME64 sf64 = {0};' pour le mettre à zéro aussi. –