Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Suite à la migration des sources de mon application PB5 vers PB11.5.1 Build 4843 en environnement Windows 7, il arrive de manière semble-t-il aléatoire que le fait de quitter l’application en mode « Run » fasse planter PB.
J’écris aléatoire car un même scénario ne fera pas forcément planter PB à la sortie de l’application.
Une fois que PB a planté de cette façon puis est relancé, certaines fenêtres ne peuvent plus être modifiées ou re-générées sans faire également planter PB.
Afin de débloquer la situation, il m’est alors nécessaire de « Full Build » le workspace ou la target.
Pensant qu’il s’agissait peut-être d’une mauvaise gestion de l’allocation mémoire, j’ai ajouté dans les évènements « Close » de mes 3 fenêtres principales (les seules à se lancer lors de mes tests) ainsi que de l’objet application un « GarbageCollect() » mais le dysfonctionnement persiste.
J’ai ensuite voulu m’assurer du plus important, c’est-à-dire que se passe-t-il avec l’application compilée. Aucun message Windows ne m’indique le moindre problème à la sortie de l’application, tout va bien de ce côté.
Quelqu’un aurait-il une idée?
Y aurait un moyen de monitorer le dysfonctionnement du mode run afin de cibler l’origine du problème?
Merci d'avance.
Hors ligne
Bonjour,
Ton appli est fermée comment ?
Hors ligne
Bonjour Erasorz
Je la ferme par l'icone de menu qui fait faire Close(This) à la MDI principale
Hors ligne
Tu as du code dans le Close de l'objet Application ?
Hors ligne
Oui
Quelques SetProfileString, 2 destroy de classe (une de ClientSideContext et une relié à une DLL servant aux notifications MOS de l'appli), quelques appels à une fonction de traçage dans la log, une GarbageCollect() que j'ai laissé pour l'instant et un StandardClose().
Le StandardClose() fait des SetProfileString et 5 If IsValid(Object) Then Destroy Object
Dernière modification par John77 (05-03-2013 13:45:13)
Hors ligne
StandardClose : kesako ?
Hors ligne
Oui, en faisant Shift+F1 dessus me suis rendu compte que c'était une user function, dsl.
Le StandardClose() fait des SetProfileString et 5 If IsValid(Object) Then Destroy Object, les Objects étant reliés à des DLL
Hors ligne
Y'a un Return dans ton close ?
Hors ligne
Non, pas de Return explicite, la valeur de retour étant "none"
Hors ligne
Il faudrait peut-être commenter et dé-commenter au fur et à mesure ce qui se trouve dans ton close pour identifier la cause du plantage. (il y a peut-être des choses dans les destructor de certains objets)
Hors ligne
J'ai suivi cette piste toute l'après-midi mais il n'y a rien dans le destructor de la plupart des objets et le fait de les commenter me fait planter plus systématiquement.
Pour 2 d'entres eux, il y a un LoadLibraryA dans le constructor et un FreeLibrary dans le destructor (pour DEV.DLL et NOTIFICATION.DLL)
Les FreeLibrary pourraient-ils être la cause de mes problèmes?
Hors ligne
Alors, je ne comprends pas bien pourquoi, n'étant pas un spécialiste des objets d'encapsulation de DLL, mais en bloquant les 2 FreeLibrary, c'est beaucoup plus stable oO
Et si ça plante, je récupère la main sur PB quelques secondes avant le crash.
C'est bizarre car ça marchait nickel en PB5 que ce soit en environnement XP ou 7
Si quelqu'un a une idée là-dessus, je suis preneur.
Hors ligne
Juste pour info, j'ai trouvé ça:
Préconisation du support Microsoft sur l'utilisation de Freelibrary
Peut-être qu'en remplaçant les LoadLibraryA par des LoadlibraryEx avec l'argument préconisé, tu n'auras plus le problème?
Hors ligne
Bonjour Foon et merci pour ta réponse.
J'ai dupliqué mon projet pour tester ta proposition.
J'ai trouvé la définition de LoadLibraryEx:
FUNCTION ulong LoadLibraryEx(ref string lpLibFileName, ulong hFile, ulong dwFlags) LIBRARY "KERNEL32.DLL" ALIAS FOR "LoadLibraryExA;Ansi"
J'ai également trouvé un exemple d'utilisation pour les paramètres puisque LoadLibrary n'en avait qu'un:
ll_handle = LoadLibraryEx(ls_file,0,LOAD_LIBRARY_AS_DATAFILE)
Par contre, je bloque pour la valeur de LOAD_LIBRARY_AS_DATAFILE et bien entendu, si je l'utilise tel quel, PB me dit que la variable n'est pas définie
Hors ligne
LOAD_LIBRARY_AS_DATAFILE=2
http://msdn.microsoft.com/en-us/library … 85%29.aspx
Hors ligne
Bonjour,
Des crash intermittents en utilisant des fonctions de l'API externe, je pense que ton problème est tout simplement celui-la :
http://pbadonf.fr/forum/viewtopic.php?pid=29272
Hors ligne
buck a écrit:
Bonjour,
Des crash intermittents en utilisant des fonctions de l'API externe, je pense que ton problème est tout simplement celui-la :
http://pbadonf.fr/forum/viewtopic.php?pid=29272
D'un autre côté, LoadLibrary n'a pas besoin de buffer, juste du nom de la dll...
Hors ligne
Merci à tous pour vos interventions.
Après plusieurs dizaines de tests, LoadLibraryEx semble avoir les mêmes effets que lorsque j'avais désactivé les 2 FreeLibrary -> PB crash bien moins souvent mais ça arrive encore. Et quand ça arrive, PB ne me rend plus la main quelques secondes avant de planter.
Quoi qu'il en soit, ça reste satisfaisant par rapport à ma situation initiale.
C'est quand même dommage qu'il n'y ait rien pour monitorer ces crashs et pouvoir comprendre ce qu'il se passe vraiment.
Hors ligne
John77 a écrit:
C'est quand même dommage qu'il n'y ait rien pour monitorer ces crashs et pouvoir comprendre ce qu'il se passe vraiment.
Ben si, il y a le debugger si l'assembleur ne te fait pas peur . Si tu as un Visual Studio installé sur le poste où ça plante, lorsqu'un message "L'application a cessé de fonctionner..." apparaît, la fenêtre a un bouton supplémentaire qui permet de "débugger" l'application fautive (en fait de débugger, ça permet de charger l'appli dans le debugger et se placer sur la ligne fautive).
Si tu n'as pas visual studio, OllyDbg peut le remplacer tout aussi bien pour la seule partie trace / debug. Comme tu n'as pas le code source de PB sous la main (si tu l'as tu m'intéresses ) tu ne pourras voir que des instruction en assembleur mais tu peux voir à quelle adresse ça plante, pour quel motif (access violation est classique, on cherche à lire / écrire à une adresse impossible), et l'affichage de la pile d'appel (partie en bas / droite de la fenêtre "cpu" reste intéressante car on peut parfois voir les appels qui ont précédé.
Dans cet exemple, ce sont les lignes en rouge qui sont intéressantes : on y voit des appels de fonctions successifs, et c'est lors d'un appel à WideCharToMultiByte que le plantage se passe (pendant ue conversion de texte unicode -> ansi. Dans ce cas là, Olly me montre même les paramètres d'appel de la fonction.
Un Dependency Walker en mode trace peut parfois aider (si c'est l'appel à une fonction de l'api pour la gestion des dll) mais ce n'est pas le meilleur outil.
Hors ligne
Au début, pensant avoir un problème similaire à http://pbadonf.fr/forum/viewtopic.php?pid=16513#p16513 j'avais donc suivi les instructions de Erazorz sur le thread pour virer le debugger de VStudio. Je viens donc de le remettre avec regedit pour voir si quelque chose me saute aux yeux, Seki.
Ya plus qu'à refaire planter PB ... mais c'est plus difficile qu'avant ^^
Hors ligne
Hors ligne
John77 a écrit:
Bon, j'ai réussis mais je reste perplexe devant le résultat
[...]
Unhandled exception at 0x10bf6145 in PB115.EXE: 0xC0000005: Access violation reading location 0x00000000.
Arf! pas vraiment parlant le truc et je ne connais pas bien VStudio
Access Violation = le programme tente de lire (ou d'écrire) à une adresse incorrecte (parce qu'il n'y a rien à cette adresse, ou que l'adresse est nulle). Un cas classique par exemple de pointeur incorrect.
Essaie de regarder (en bas de ton écran) "call stack" pour savoir qui c'est qui merde au moment du problème (l'exception peut avoir lieu dans une dll système, parce que PB lui a donné une mauvaise valeur), et si tu peux retrouver le module non-système fautif (l'IDE PB, l'application PB compilée, ou une des dll qui lui sont associées)
Hors ligne
Hors ligne
C'est la VM de PB 11.5 qui déraille, (pbvm qui appelle une fonction dans pbshr, des fonctions partagées).
Avec OllyDbg, je pourrais peut-être te dire quelle fonction cafouille, mais avec visual studio, je ne sais pas comment te le demander...
Bon, une fois qu'on a le nom de la fonction fautive, on n'est pas toujours plus avancé. Mais parfois ça permet de savoir quel type d'action était en cours.
Hors ligne
Merci beaucoup pour ces précisions Seki
Je viens de récupérer OllyDbg pour relancer le test.
Dois-je installer le Plugin Development Kit?
Hors ligne