Question

J'ai un code dans MS VC ++ 6.0 que je suis le débogage. Pour une raison quelconque, à ce certain point où je suis en train de supprimer de la mémoire allouée dynamiquement, il se casse et je reçois une boîte de message pop up disant « Breakpoint utilisateur appelé à partir du code à bla bla » .. alors la fenêtre désassemblage apparaît et je voir

*memory address* int      3

La chose étrange est, il y a NOWHERE dans le code que je fais appel une instruction de montage comme celui-ci (je pense asm int 3 est une commande de rupture de matériel pour x86?) ..

ce qui pourrait être la cause?

EDIT: REPONSE: Mon code était « marche de la fin » d'un tableau, mais seulement dans les endroits marqués par débogage Visual Studio avec 0xFDFDFDFD, qui est appelé une clôture de NoMan'sLand .. Je pense que c'est aussi appelé Off -Par-une erreur .. Ce tableau était sans rapport avec le point où je libérait la mémoire lorsque l'erreur se produisait. Ce qui rendait plus difficile à repérer ..: (

Était-ce utile?

La solution

Vous êtes probablement frapper le code dans les routines de tas de débogage qui ont trouvé la corruption du tas.

Qu'est-ce que l'apparence de la pile d'appel comme lorsque vous avez atteint l'Int 3?

Edit: Basé sur la trace de la pile dans vos commentaires, la routine _CrtIsValidHeapPointer() dit que le pointeur étant libéré est mauvais. Voici l'extrait de code de source de DBGHEAP.C de MSVC:

    /*
     * If this ASSERT fails, a bad pointer has been passed in. It may be
     * totally bogus, or it may have been allocated from another heap.
     * The pointer MUST come from the 'local' heap.
     */
    _ASSERTE(_CrtIsValidHeapPointer(pUserData));

pUserData serait la valeur du pointeur vous deleteing.

Autres conseils

  

(je pense asm int 3 est une rupture matérielle   commande pour x86?

Il est. Il est appelé "matériel breakpoint" . Si vous utilisez le débogueur VS avec le code source du projet, il est comme un point d'arrêt (mais dans le code). Depuis VS2005, si votre application est lancée sans débogueur, l'application va tout simplement tomber en panne, comme si elle a lancé une exception non gérée.

Dans beaucoup d'entreprises, il y a une macro simple pour ajouter que dans le code de point d'arrêt. Cela peut remplacer et exceptions affirme certains (durs et rares):

#define BREAKPOINT __asm { int 3; }

BREAKPOINT;

Voir:

Je suggère donc que la recherche d'une macro ou un objet faisant cela, ou peut-être appen dans un module (dll / lib) que vous n'avez pas le code de?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top