2009-02-05 7 views
1

Pour une raison quelconque, le débogueur intégré est provoquant une erreur dès que je fais référence à la classe dll d'un fournisseur tiers. Ce même code s'exécute lorsqu'il est créé et exécuté en tant que version autonome. Les deux propriétés pour le débogage et la libération devraient être les mêmes que je n'ai pas vraiment changé. J'ai ajouté le fichier lib au chemin des deux versions. J'ai simplement:Erreurs Visual Studio débogage en C++

ClassNameFromDll blah; 

Quand il est ici, je reçois cette exception:

exception non gérée à 0x78a3f623 (mfc90ud.dll) dans MTGO SO bot.exe: 0xC0000005: violation d'accès emplacement lecture 0xf78e4568 .

Il se produit dans: afxtls.cpp, ligne 252.

Ceci est une application MFC, mais je ne suis pas vraiment en utilisant une MFC autre qu'un très simple qui IUG se déclenche au large un événement qui est tout win32. J'utilise Visual Studio 2008 Express.

Répondre

1

engageant le débogage psychique

Le fait qu'il fonctionne en mode sortie fin et se bloque en mode debug me porte à croire que vous avez réussi à référence, en particulier, la version de cette DLL (mfc90u .dll), plutôt que de référencer la bibliothèque elle-même et de permettre à l'éditeur de liens de décider quelle version importer.

Vous ne pouvez pas utiliser MFC pour quoi que ce soit dans cette application, mais s'il est construit comme une application MFC, vous obtiendrez tous les trucs MFC si vous le voulez ou non (ce qui signifie que vous devez également résoudre la dépendance MFC problème et expédier les DLL MFC avec votre application).

+0

Heh, peut-être que je devrais juste prendre tout ce code et le remettre dans le projet C++ droit? Tout ce dont j'avais besoin était un simple gui: 1 boîte de textarea, 1 bouton, 1 événement à partir du bouton pressé. – Zombies

+1

Peut-être mieux. MFC est une chose assez lourde à importer juste pour une fenêtre. – TheSmurf

+0

"débogage psychique" c'est un bon .. – Naveen

0

Avez-vous une trace de pile que vous pouvez publier? Il pourrait avoir des informations utiles. Si la DLL tierce est toujours activement supportée par le fournisseur, la première chose à faire est de voir si vous pouvez avoir le même problème avec un programme très simple que vous pouvez envoyer au fournisseur et lui demander de répare le.

Si le vendeur ne suffit pas disponibles ou sensibles:

Si vous avez la source de la DLL 3ème partie et peut facilement construire votre propre version, vous avez probablement la meilleure façon de déboguer ce (court d'obtenir le vendeur pour vous soutenir). Même si vous ne pouvez pas facilement créer une DLL source-débuggable, vous pouvez tracer dans les instructions d'assemblage du constructeur et utiliser la source comme une carte pour vous aider à comprendre ce qui se passe.

Même si vous n'avez pas de source pour la DLL tierce, je pense que le meilleur plan d'action est de suivre le constructeur pour ClassNameFromDll pour essayer de comprendre ce qui ne va pas. Il peut être utile de comparer le chemin d'instructions dans la version Debug et la version Release. La source MFC est distribuée avec MSVC (probablement pas avec la version Express, mais je pense avec toutes les autres versions). Ainsi, lorsque vous entrez dans le code de la DLL MFC, vous pouvez trouver la source utile pour déterminer ce qui est passe.

+0

La DLL en question est tessdll.dll. Cela fonctionne correctement lorsque j'exécute l'application à partir d'une version de publication. – Zombies

2

En regardant les atltls.fichier cpp de mon VC9 installer, l'accident se produit ici:

inline void* CThreadSlotData::GetThreadValue(int nSlot) 
{ 
    EnterCriticalSection(&m_sect); 
    ASSERT(nSlot != 0 && nSlot < m_nMax); 
    ASSERT(m_pSlotData != NULL); 
    ASSERT(m_pSlotData[nSlot].dwFlags & SLOT_USED); // <== crash 
    // ... 
} 

La raison pour laquelle l'accident ne se produit pas dans la version build est parce que le assert() est un no-op dans cette construction. Je ne suis pas familier avec l'utilisation du stockage local de thread par ATL, mais cette assertion indique que quelque chose demande une valeur dans un emplacement où rien n'a encore été stocké.

Si l'initialisation de ce slot TLS est de votre responsabilité ou de la responsabilité de la DLL tierce partie, je ne sais pas.

Il semble que GetThreadValue() a des protections supplémentaires de sorte qu'il renverra un pointeur NULL dans la version release pour un slot non initialisé (même si je ne suis pas sûr que ce serait garanti) - Je parie que le 3ème La DLL de la partie s'appuie sur ce comportement (c'est-à-dire qu'elle vérifie la présence d'une valeur NULL), de sorte qu'aucun incident ne se produit dans les versions de version. Notez que le fournisseur peut utiliser la classe CThreadSlotData indirectement (la trace de la pile donne un indice à ce sujet), de sorte qu'ils ne sont peut-être pas conscients de ses attentes.

Questions connexes