2009-02-13 7 views
0

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?

Répondre

1

Cela ressemble beaucoup au code que j'ai, et cela fonctionne. La seule différence que je peux voir est que mon code utilise ZeroMemory() pour effacer la structure de STACKFRAME64 avant de peupler des parties de celui-ci - cela peut être nécessaire.

+0

Et oui, c'était le problème. – Calmarius

+1

Vous pouvez faire 'STACKFRAME64 sf64 = {0};' pour le mettre à zéro aussi. –