2010-01-20 2 views
3

J'utilise Visual Studio pour déboguer une application ATL.Pourquoi pourrait déclencher un point d'arrêt lorsque je renvoie TRUE à partir de mon OnCopyData?

Lorsque je fais un pas sur return TRUE dans ce code, l'erreur se produit:

BOOL CMainFrame::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) { 

    // Code snipped from here - maybe this causes stack/heap corruption? 

    // I have a breakpoint here, if I step over (F10), AFX trace message 
    // is shown (as below) 
    return TRUE; 

} 

C'est la boîte de message qui est affiché:

Windows a déclenché un point d'arrêt dans foobar.exe.

Cela peut être dû à une corruption du tas , ce qui indique un bogue dans foobar.exe ou l'une des DLL qu'il a chargé.

Cela peut également être due à l'utilisateur en appuyant sur F12 tandis que phonejournal.exe a focus. La fenêtre de sortie peut contenir plusieurs informations de diagnostic .

Le message est un peu vague, et je me demande quels outils je peux utiliser pour obtenir plus d'informations. Les pauses débogueur sur l'appel à AtlTraceVU dans atltrace.h:

inline void __cdecl CTrace::TraceV(const char *pszFileName, int nLine, 
    DWORD_PTR dwCategory, UINT nLevel, LPCWSTR pszFmt, va_list args) const 
{ 
    AtlTraceVU(m_dwModule, pszFileName, nLine, dwCategory, nLevel, pszFmt, args); 
} 

Répondre

4

Le Application Verifier de Microsoft peut aider avec ceci. Si l'application a une corruption de tas, cet utilitaire peut provoquer l'exception à se produire lorsque l'erreur se produit. Cependant, il peut utiliser beaucoup de mémoire en cours d'exécution, car il peut produire de grands changements dans les schémas d'allocation de mémoire.

Le code suivant évidemment imparfait donne une démonstration simple:

char *pc = malloc(4); 
memcpy(pc, "abcdabcd", 9); 
free(pc); 

Quand je courais cela sans vérification de l'application, il a couru à la fin sans erreur évidente. Avec le vérificateur d'application, cependant, il a provoqué une exception (0x80000003). Application Verifier a forcé l'allocation à être à la fin d'un segment (par exemple, 0x1e9eff8). Le memcpy a entraîné une écriture dans le segment suivant, ce qui a entraîné l'exception au cours de l'appel memcpy. Si l'écrasement est moindre dans cet exemple simple, la coupure ne se produit pas avant l'appel free, mais c'est toujours mieux qu'aucune exception. C'est un utilitaire plutôt cool.

+0

Nice, merci! Je n'ai pas encore essayé, mais je l'accepterai comme réponse quand je le ferai. –

+0

N'avez pas encore essayé, mais il s'est avéré être une corruption de tas (découvert en utilisant des essais et erreurs), mais je me souviendrai Application Verifier pour la prochaine fois. –

0

Votre mémoire (peut-être votre pile) est endommagé par un pointeur rétif quelque part ailleurs dans le code.

+0

Yup, mais comment le trouver? Le code est massif. Peut-être que cela n'a rien à voir avec OnCopyData - ou peut-être parce que je fais quelque chose de mal à l'un des args passés (ce que je ne pense pas être le cas). Quels outils puis-je utiliser pour obtenir la ligne de code à l'origine de l'erreur? –

+0

Sauf si vous pouvez envelopper les contrevenants possibles dans smart, vérification, wrappers vous devrez probablement recourir à * diviser et conquérir * - désactiver certains/moitié/... du code, si cela ne se produit plus, vous savez où regarder plus profond. –

Questions connexes