2009-06-03 8 views
0

Nous avons un composant COM Delphi appelé à partir d'une application Web ISAPI. Le composant COM suspend l'application car il essaie d'afficher un MessageBox(). Nous n'avons pas d'appel MessageBox() dans notre code utilisateur, il doit donc être situé dans la source d'exécution Delphi, probablement dans le code du gestionnaire d'exception.Comment utiliser le rapport IIS Debug Diagnostics pour localiser la ligne du fichier source dans le composant COM Delphi

Nous avons un rapport de diagnostic de débogage IIS qui montre notre nom de module + une adresse de décalage comme le code incriminé.

Nous avons un fichier .MAP pour notre module et nous avons également produit un fichier .dbg en utilisant MAP2DBG.

Notre question est de savoir comment localiser la ligne de code du fichier source en utilisant le rapport IIS debug diag hang report contenant l'adresse de décalage, en utilisant le fichier .MAP ou .DBG?

Nous avons essayé d'utiliser WinDbg mais n'avons pas été capables de comprendre ce que nous devions faire pour localiser la ligne source.

Répondre

3

Tout d'abord, vous devez trouver l'adresse de base où le processus a chargé le module COM dans le processus IIS. Cela peut être évident pour le journal de débogage IIS. Appelons cette BASE.

Ensuite, vous calculez le MAPoffset = offset - BASE - $ 1000 et vous avez une adresse qui peut être recherchée dans le fichier MAP Delphi.

Dans le fichier MAP (qui doit être détaillé pour obtenir le mappage du numéro de ligne), vous trouverez une section pour chaque module source répertoriant les enregistrements de "segment de linge: décalage". Ensuite, vous vérifiez si MAPoffset est égal à un décalage ou entre deux décalages de numéro de ligne. Cela devrait vous donner une direction à quelle ligne est la ligne fautive.

Le segment est généralement 1 - indiquant un segment de texte avec du code généré - (il existe une carte de segment dans la partie supérieure du fichier MAP).

Espérons que cela aide!

+0

+1 Bonne réponse. Le fichier de carte est la clé pour trouver le bogue, et la compréhension du fichier de carte est le secret pour trouver ces erreurs AV embêtantes qui apparaissent après le déploiement. J'ai tendance à garder les fichiers MAP dans le contrôle de la source étiquetés avec la source à une version pour cette raison. – skamradt

+0

Le rapport de débogage IIS sur le fichier de vidage répertorie ModuleName + 4974 comme adresse incriminée. En utilisant WinDbg pour charger le fichier de vidage, le début du module est 064F0000. Donc 064F4974 - 064F000 = 4974. 4974 - 1000 est 3974. Je ne vois rien dans le fichier .map même proche de ce nombre. Qu'est-ce que je rate? –

+0

Dans votre fichier de carte, vous devriez avoir une section très près du sommet appelée «Liste détaillée des segments». Dans cette section, la toute première ligne ressemble à ceci dans un fichier de carte: 0001: 00000000 00006B49 C = CODE S = .text G = (aucun) M = Système ACBP = A9 Ceci est un segment de type 1 (. texte) qui commence à 0 et exécute $ 6B49 octets. Si c'était votre fichier map, il me dirait que votre module est le module 'System'. Maintenant, étant donné que vous avez identifié votre module, il devrait y avoir une section comme celle-ci pour ce module: "Numéros de ligne pour le système (GETMEM.INC) segment .text". –

Questions connexes