0
votes

Y a-t-il une possibilité de déboguer une DLL imbriquée à l'intérieur de l'application WX GUI?

Le code implique d'intégrer une DLL de surveillance d'utilisation à une DLL hôte existante. La DLL hôte est chargée par l'application WX GUI pour rappel. La DLL de surveillance de l'utilisation fonctionne comme suit.

initialisée // f1 strong> p>

USAGEEXPORTFREQUENCE // F2 STROND> P>

Signal d'utilisation à l'exportation vers Server // F3 strong> p>

DEINIT // F4 strud> p>

F1 est intégré à la routine d'initialisation de ma DLL hôte, F2 à la fonction basée sur l'événement dans la DLL hôte et De même, désinit à mon hôte dll deinit. P>

Lorsque je n'intégrate que F1 et F3, l'interface graphique ne se bloque pas et fonctionne bien. Lorsque j'intègre la fonction F2 principale pour signaler l'utilisation de la fonction de rappel dans ma DLL hôte et exécutez l'application GUI, il se bloque immédiatement lorsque je modifie les valeurs du widget. p>

Cependant, lorsque j'utilise la DLL "Utilisation" dans un exemple de programme (EXE PAS une DLL hôte), cela fonctionne comme un charme. P>

HINSTANCE hGetProcIDDLL;

typedef void (__stdcall *lgUsgIn)(bool);

typedef void (__stdcall *SetMinInt)(long);

typedef bool (__stdcall *lgUsgSnd)(const char*,const char*,const char*);

typedef void(__stdcall *waitforCom)(void);

lgUsgIn LogUsageInit;

lgUsgSnd LogUsageSend;

SetMinInt SetMinInterval;

waitforCom WaitForCompletion;

hGetProcIDDLL = LoadLibrary("D:\\HTA_NG_DevEnvironment\\Utilization\\LogUsage.dll");

LogUsageInit = (lgUsgIn)GetProcAddress(hGetProcIDDLL, "LogUsageInit");

SetMinInterval = (SetMinInt)GetProcAddress(hGetProcIDDLL, "SetMinInterval");

LogUsageSend = (lgUsgSnd)GetProcAddress(hGetProcIDDLL, "LogUsageSend");

WaitForCompletion = (waitforCom)GetProcAddress(hGetProcIDDLL, "WaitForCompletion");

LogUsageInit(1);

SetMinInterval(600);

const char tool[] = "tooln1";

const char opt[] = "remoteValidation";

const char tag[] = "none";

bool OutCome = LogUsageSend(tool,opt,tag); // **crash happens when this function is included**

WaitForCompletion();

FreeLibrary(hGetProcIDDLL);


0 commentaires

3 Réponses :


2
votes

avec Visual Studio (à condition que vous disposiez du fichier DLL PDB (Symboles)), vous pouvez joindre à n'importe quel processus (par exemple, l'application GUI) et déboguer une partie de celui-ci (la partie DLL par exemple) si vous ajoutez un point d'arrêt sur < Code> BOOL Résultat = logusagesend (outil, opt, tag) Vous devriez pouvoir entrer.


2 commentaires

L'IDE utilisé ici est CodeBlocks et je dois m'en tenir avec elle malheureusement.


Il semble également que vous puissiez attacher à un processus de codeblocks aussi: voir Dummies.com/Programmer/cpp/...



0
votes

Si vous avez développé votre DLL dans Visual Studio, vous pouvez désigner l'application GUI comme fichier de démarrage du débogage. Il est sous propriétés du projet, débogage. De cette façon, lorsque vous déboguez votre projet, l'application GUI démarrera et vous toucherez les points d'arrêt de la DLL lorsqu'ils tirent.

Cela dit, il y a une possibilité que l'accident se produit avant que vos fonctions obtiennent le contrôle. Calling Convention Mismatch est un coupable commun ici; Assurez-vous que les fonctions exportées sont __ stdcall et extern "c" .


1 commentaires

L'IDE utilisé ici est CodeBlocks et je dois m'en tenir avec elle malheureusement.



0
votes

Merci pour vos entrées, j'ai trouvé une réponse dans CodeBlocks quelque chose de similaire à vos suggestions.

Nous pouvons attacher une application hôte à la DLL. Et déboguer du projet DLL lui-même.


0 commentaires