11
votes

Points d'arrêt hors de nulle part lors du débogage avec GDB, à l'intérieur de NTDLL

J'ai fait un programme très simple qui automatise certaines choses pour moi.Je l'a écrit en C ++ et elle fonctionne sous Windows. Tout en le débogage avec GDB de l'intérieur de l'IDE de CodeBlocks, je reçois de nombreux points d'arrêt de nulle part. Je n'ai aucune idée de ce qui pourrait causer ce problème. Les points d'arrêt semblent être liés avec des problèmes de mémoire ... Depuis que lorsque j'ai réparé une fuite de mémoire que j'ai détectée, le numéro des points d'arrêt a été significativement moins élevé.

La chose exacte que GDB me dit est: P>

#0  0x76fefadd in ntdll!TpWaitForAlpcCompletion () from C:\Windows\system32\ntdll.dll
#1  0x0028e894 in ?? ()
#2  0x76fb272c in ntdll!RtlCreateUserStack () from C:\Windows\system32\ntdll.dll
#3  0x00657fb8 in ?? ()
#4  0x00657fb8 in ?? ()
#5  0x76f4b76a in ntdll!RtlDowncaseUnicodeChar () from C:\Windows\system32\ntdll.dll
#6  0x02070005 in ?? ()
#7  0x00000b10 in ?? ()
#8  0x0028e8dc in ?? ()
#9  0x76ff0b37 in ntdll!TpQueryPoolStackInformation () from C:\Windows\system32\ntdll.dll
#10 0x038b0000 in ?? ()
#11 0x00657fb8 in ?? ()
#12 0x76f4b76a in ntdll!RtlDowncaseUnicodeChar () from C:\Windows\system32\ntdll.dll
#13 0x6e6e9a5e in ?? ()
#14 0x038b0000 in ?? ()
#15 0x038b0000 in ?? ()
#16 0x00000000 in ?? ()


2 commentaires

À quoi ressemble le reste de la pile d'appel lorsque vous obtenez un sigtrap? Veuillez poster la sortie de GDB "où".


Merci pour votre réponse, je vais ajouter la sortie de "où" dans la question. Modifier maintenant ...


4 Réponses :


2
votes

Je recommanderais d'utiliser WINDBG, le débogueur Windows natif. Cela donnera une meilleure trace de pile spécialement pour les symboles lors de la transition vers le mode noyau.


0 commentaires

8
votes

wow, vous m'avez renvoyé 5 ans à quand j'ai utilisé GDB sur la plate-forme Linux :)

Vous pouvez empêcher GDB de se casser lors de la réception de Sigtrap avec la commande suivante: p>

handle SIGTRAP nostop


2 commentaires

Où vous supposez que l'on pourrait obtenir un windbg gratuit? Afaik il est apporté uniquement avec le studio visuel, je doute que quelqu'un va l'acheter juste à cause d'un débogueur, ce qui n'est même pas meilleur GDB. Mais ⁺¹ Quoi qu'il en soit, je n'ai même pas remarqué que des points d'arrêt dans les bibliothèques système provoquent un autre signal, différent d'une pause habituelle.


Windbg est gratuit et vient dans le cadre des outils de débogage de l'emballage Windows. Vous pouvez le télécharger depuis Microsoft.com/click/services/redirect2.ashx ? Cr_eac = 300135395



16
votes

Bien que la question soit assez ancienne maintenant, voici quelques points qui pourraient aider quelqu'un qui viendrait ici après une recherche comme je l'ai fait:

Je viens de rencontrer ce problème lors du test sur Win7 une application développée par moi sur WinXP. Dans mon cas, il est lié à la fois à la surveillance de la gestion de la mémoire Windows 7 et à une mauvaise allocation de mémoire dans mon application.

Pour faire courte de l'histoire, dans le code de l'application, un bloc de mémoire qui a été mallocède par erreur (au lieu d'utiliser globallalloc () ) et a été libéré avec un GlobalFree () (ce qui ne va pas, car le tas de système a été accédé avec un pointeur à partir du pool de mémoire d'exécution C). Bien que cela provoque une fuite de mémoire (très petite dans cette affaire), elle était complètement inaperçue tout en effectuant des tests sur WinXP et l'ensemble du programme était apparemment correctement exécuté.

Maintenant, lorsqu'il est exécuté sur Win7, une fonction de surveillance de la mémoire appelée Le tas de défaillance tolérant (fth) détecte ce bogue de l'application (qui provoque une exception):

  • En même temps, il s'agit de certaines informations via de sortieDebugstring () (ou peut-être dbgprint () ) à l'aide de la simple Débourview outil, ou par tout débogueur lors de la traçage de l'application. Ainsi, juste avant le signal reçu, vous pouvez voir quelque chose comme ça dans les messages:

    AVERTISSEMENT: HAUT [NOM_OF_YOUR.EXE]:

    Avertissement: adresse non valide spécifiée à RTLFreeeheap (006b0000, 006a3698)

  • et (dans le cas où l'application est en cours de débogage), elle génère un point d'arrêt qui n'a aucun effet en dehors d'un débogueur, mais sinon cela devrait aider à pointer le problème. Ce point d'arrêt est montré comme le signal SIGTRAP par GDB .

    À ce stade, vous avez 2 alternatives:

    • Essayez de marcher sur la pile d'appels pour trouver les instructions défectueuses de votre code (malheureusement dans ce cas, le BT ou Les commandes GDB ne peuvent pas montrer assez loin pour voir où Dans mon code, le tas a été débarrassé à tort - Si quelqu'un sait comment afficher la bonne pile d'appels à partir du module de départ au lieu de NTDLL, laissez-moi savoir )
    • Essayez de continuer lorsque FTH a la possibilité de corriger automatiquement la mémoire en tant que tentative de contourner votre bogue (ce correctif automatisme peut également se produire à l'avance sur la prochaine exécution de l'application)

      Pour ne pas arrêter au moment du problème du tas, levez MosHe Levi, vous pouvez définir un poignée SIGTRAP NOSTOP à l'invite GDB avant de démarrer l'application.

      Donc, en bref: oui, vous avez eu quelque chose qui ne va pas dans votre code relatif à la gestion de la mémoire, mais dans certains cas, il peut fonctionner sans crash. Mais en mode de débogage, le noyau essaie de vous mettre sur le chemin du problème.


1 commentaires

J'ajouterais cela semble pas toujours le code faux. Je suis un problème assez ressemblant, et voir un bloc de tas AVERTISSEMENT à 003E5E78 modifié à 003E5EBA Taille requise de 3A . Je suis même attrapé le mauvais endroit qui déclenche l'avertissement et le code a l'air bien: j'ai créé un tableau «wchar_t» avec «nouveau» et le libérer gratuitement avec «Suppr []». Probablement un bug de Mingw. BTW, une chose confirme indirectement ceci: Je suis testé l'application sur GNU / Linux avec Valgrind et cela n'a pas constaté aucun problème.



2
votes

Je viens d'expérimenter ce crash à l'aide de GCC / Mingw avec QT Creator.

J'ai eu d'autres problèmes, y compris des variables qui semblaient avoir mal (compensées par 6 octets). Dans mon cas, il s'est avéré être un pack de pragma qui a fait des ravages sur le code.

J'avais ceci: xxx

... mais je Je ne l'ai pas terminé avec un pack de pragma () appel à la fin de l'emballage de 1 après la structure et de revenir à l'alignement / l'emballage des octets par défaut. Ajoutant cela corrigé: xxx


0 commentaires