2009-11-03 5 views
1

J'analyse un blocage qui se produit lors de l'utilisation d'une bibliothèque native en même temps que du code managé. J'utilise WinDbg pour déboguer le problème avec l'intention d'enregistrer une sauvegarde de sorte que le fournisseur puisse observer le problème dans ses locaux.WinDbg montre différentes piles d'appels lorsqu'il est joint au processus par rapport au vidage sur incident

Lors de la fixation au processus problématique que je vois le message suivant avant que les piles d'appel:

AVERTISSEMENT: Stack informations non disponibles se détendre. Les images suivantes peuvent être erronées.

Les cadres semblent réellement corrects lorsqu'ils sont attachés directement au processus. Cependant, quand je prends une image de ce fichier et que j'ouvre la sauvegarde dans WinDbg sur une autre machine, l'une des trames de pile est différente (l'erreur ci-dessus est affichée aussi). .

Je pris la décharge à l'aide:

.dump /ma filename.dmp 

Quelle serait la cause de cette différence, et est-ce que je peux faire pour analyser de manière fiable les piles d'appels d'un fichier de vidage? Pourrait-il y avoir d'autres données faussées dont je devrais être au courant?

Répondre

2

Cela peut vous donner l'impression d'avoir des pdbs incompatibles. Avez-vous essayé les commandes !chksym et !itoldyouso? par exemple, voir the Bugslayer article

Une autre chose à essayer est !sym noisy qui devrait vous montrer quels fichiers pdb sont en cours de chargement.

Voir aussi MSDN blog

2

L'avertissement vous indique que le débogueur ne peut pas associer une ou plusieurs adresses sur la pile avec des informations de module existant. Comme le code managé est compilé à la volée par le CLR, il n'y a pas de modules correspondants pour le code et donc l'avertissement.

La commande SOS! Clrstack possède les informations nécessaires du CLR pour afficher une pile significative (ou au moins sans avertissement). Si vous utilisez une commande de vidage de pile native, cet avertissement s'affiche pour le code managé.

Le prochain livre Advanced .NET Debugging contient des détails supplémentaires. Voir http://advanceddotnetdebugging.com/

+0

Merci Brian. Donc, je devrais attendre cet avertissement lors du débogage des threads exécutant du code managé dans WinDbg? C'est bon à savoir, mais le problème que je vois est qu'un cadre de pile non géré est différent lors du débogage local par rapport au débogage du fichier de vidage sur une machine différente. Merci pour le lien - je vais lire. –

+0

Je pensais que vous étiez en train de déboguer du code managé à cause de la balise .NET. Vous verrez l'avertissement si vous videz la pile native pour un thread qui exécute du code managé car WinDbg ne reconnaît pas les appels gérés. Avec SOS, vous obtenez la vue gérée correcte et donc pas d'avertissement. Cependant, il peut toujours être utile de vider la pile native, auquel cas vous devez simplement ignorer l'avertissement. Comme pour votre autre question: Pourriez-vous élaborer un peu sur la façon dont les piles diffèrent entre le débogage local et le débogage dump. –

+0

Je débogue un mélange de .NET et de code natif via interop. Je fournirai plus d'informations quand je serai capable de reproduire le problème. Merci encore. –

Questions connexes