2010-09-16 20 views
0

Nous avons une grande application VB héritée constituée d'un certain nombre de DLL (une douzaine environ), toutes installées dans une seule application serveur COM +. De temps en temps, il arrive quelque chose que les causes dllhost.exe à chavirer (et redémarrer automatiquement), en laissant ce message dans le journal des applications Windows événement ...Exception COM sur "composant personnalisé" - comment identifier DLL?

Le système a appelé un composant personnalisé et ce composant a a échoué et généré une exception. Cela indique un problème avec le composant personnalisé . Avertissez le développeur de ce composant qu'une panne s'est produite et fournissez-lui les informations ci-dessous.
ID d'application serveur: {8CC02F18-2733-4A17-9E5C-1A70CB6B6977}
instance d'application serveur ID: {1940A147-8A5E-45FA-86FE-DAF92A822597}
Nom Application Server: MyTestApp
La nature grave de cette erreur a provoqué la fin du processus.
Exception: C0000005
Adresse: 0x758DA3DA

Source: Complus
ID d'événement: 4786
Niveau: erreur

À côté de ce journal est un autre, en particulier sur dllhost.exe ..

Nom de l'application défaillante: dllhost.exe, version: 6.0.600 0,16386, horodatage: 0x4549b14e
Nom du module Défaillant: msvcrt.dll, Version: 7.0.6002.18005, horodatage: 0x49e0379e
Code Exception: 0xc0000005
défaut offset: 0x0000a3da
processus Faulting id: 0x83c
Défaillant démarrage de l'application temps: 0x01cb50c507ee0166
chemin défaillant application:% 11
chemin du module défaillant: 12%
Rapport Id:% 13

Je sais qu'il est un failur repérage e dans le runtime C (msvcrt), mais idéalement, j'ai besoin de retracer cela dans la DLL qui est appelée dans msvcrt (probablement avec de mauvaises données/paramètres). Donc, sans installer un débogueur, est-il possible d'identifier la DLL qui provoque cela? J'essaie de voir s'il y a un vidage de mémoire n'importe où je peux utiliser pour analyser hors ligne - et ainsi attacher l'adresse à quelque chose de spécifique. Mais sans cela, je ne suis pas sûr que ce soit possible. Peut-on demander au sous-système COM de générer une minidump lorsqu'une application hébergée se bloque? (oui, il peut [probablement] - il y a une case à cocher dans l'onglet 'Dump').

Ceci est sur Windows Server 2008 R1 32 bits (mais aussi pour Server 2003).

Cela n'affecte pas la disponibilité de l'application - COM + redémarre simplement dllhost et l'application continue, mais c'est un inconvénient qu'il serait utile de corriger.

Édition Bon, j'ai un vidage sur incident, j'ai du vent, mais ça n'aide pas.Je ne sais pas si je suis épais (une possibilité) ou quelque chose d'autre :-) Sortie de !analyze -v est ci-dessous, mais il ne me montre rien dans nos DLL, mais il semble qu'il n'a pas été en mesure de résoudre FAULTING_IP? Je ne suis pas sûr de savoir où aller ensuite. Je me demande si l'un de mes pdb est douteux et vaut la peine d'en générer de nouveaux - accrochés dans le serveur de symboles de Microsoft, donc ils ne devraient pas l'être, mais je ne sais pas pour quel module il signale (apparemment) (BUGCHECK_STR et PRIMARY_PROBLEM_CLASS) (ou sont ces symboles sur le serveur sur lequel le code était initialement exécuté?). Serait-il préférable de mettre les PDB sur le serveur lui-même?

Si non, d'autres idées? J'ai déjà utilisé windbg un peu avant, mais je n'en suis pas un utilisateur régulier, alors peut-être y-a-t-il d'autres incantations que je dois taper pour creuser plus profondément? Guide de bienvenue :-)

******************************************************************************* 
*                    * 
*      Exception Analysis         * 
*                    * 
******************************************************************************* 

FAULTING_IP: 
+5c112faf02e0d82c 
00000000 ??    ??? 

EXCEPTION_RECORD: ffffffff -- (.exr 0xffffffffffffffff) 
ExceptionAddress: 00000000 
    ExceptionCode: 80000003 (Break instruction exception) 
    ExceptionFlags: 00000000 
NumberParameters: 0 

FAULTING_THREAD: 00000f1c 
DEFAULT_BUCKET_ID: WRONG_SYMBOLS 
PROCESS_NAME: dllhost.exe 
ERROR_CODE: (NTSTATUS) 0x80000003 - {EXCEPTION} Breakpoint A breakpoint has been reached. 
EXCEPTION_CODE: (HRESULT) 0x80000003 (2147483651) - One or more arguments are invalid 
MOD_LIST: <ANALYSIS/> 
NTGLOBALFLAG: 0 
APPLICATION_VERIFIER_FLAGS: 0 
MANAGED_STACK: !dumpstack -EE 
OS Thread Id: 0xf1c (0) 
Current frame: 
ChildEBP RetAddr Caller,Callee 

LAST_CONTROL_TRANSFER: from 77b15620 to 77b15e74 
PRIMARY_PROBLEM_CLASS: WRONG_SYMBOLS 
BUGCHECK_STR: APPLICATION_FAULT_WRONG_SYMBOLS 

STACK_TEXT: 
0022fa68 77b15620 77429884 00000064 00000000 ntdll!KiFastSystemCallRet 
0022fa6c 77429884 00000064 00000000 00000000 ntdll!NtWaitForSingleObject+0xc 
0022fadc 774297f2 00000064 ffffffff 00000000 kernel32!WaitForSingleObjectEx+0xbe 
0022faf0 778e2c44 00000064 ffffffff 00e42374 kernel32!WaitForSingleObject+0x12 
0022fb0c 778e2e32 00060848 0022fb5b 00000000 ole32!CSurrogateProcessActivator::WaitForSurrogateTimeout+0x55 
0022fb24 00e413a4 0022fb40 00000000 00061d98 ole32!CoRegisterSurrogateEx+0x1e9 
0022fcb0 00e41570 00e40000 00000000 00061d98 dllhost!WinMain+0xf2 
0022fd40 7742d0e9 7ffde000 0022fd8c 77af19bb dllhost!_initterm_e+0x1a1 
0022fd4c 77af19bb 7ffde000 dc2ccd29 00000000 kernel32!BaseThreadInitThunk+0xe 
0022fd8c 77af198e 00e416e6 7ffde000 ffffffff ntdll!__RtlUserThreadStart+0x23 
0022fda4 00000000 00e416e6 7ffde000 00000000 ntdll!_RtlUserThreadStart+0x1b 

STACK_COMMAND: .cxr 00000000 ; kb ; dt ntdll!LdrpLastDllInitializer BaseDllName ; dt ntdll!LdrpFailureData ; ~0s; .ecxr ; kb 

FOLLOWUP_IP: 
dllhost!WinMain+f2 
00e413a4 ff15a410e400 call dword ptr [dllhost!_imp__CoUninitialize (00e410a4)] 

SYMBOL_STACK_INDEX: 6 
SYMBOL_NAME: dllhost!WinMain+f2 
FOLLOWUP_NAME: MachineOwner 
MODULE_NAME: dllhost 
IMAGE_NAME: dllhost.exe 
DEBUG_FLR_IMAGE_TIMESTAMP: 4549b14e 
FAILURE_BUCKET_ID: WRONG_SYMBOLS_80000003_dllhost.exe!WinMain 
BUCKET_ID: APPLICATION_FAULT_WRONG_SYMBOLS_dllhost!WinMain+f2 

Répondre

1

Avez-vous des symboles pour les dlls VB? Les symboles sont importants pour obtenir la pile d'appel. J'espère que vous avez les symboles corrects. Vous pouvez utiliser ld * puis lme, ce qui devrait vous permettre d'obtenir la liste des symboles qui ne correspondent pas dans windbg. L'option la plus simple consiste à charger la sauvegarde dans DebugDiag qui devrait vous donner la raison de l'échec avec la pile d'appel. DebugDiag a des extensions de débogueur pour Complus.

Et voici une commande de pile d'appel natif pour tous les fils

~*ek 

et celui-ci passer à l'exception actuelle

.ecxr 
+0

Ah - DebugDiag - ça m'a donné quelque chose avec lequel travailler :-) Il est montré que les PDB sont (probablement) corrects aussi. Je serai en mesure de confirmer demain. –

0

Debug Mon/WinDbg est la meilleure façon de résoudre ce problème. vous devriez pouvoir utiliser la liste des modules dans winDbg, ou la commande lm pour lister les modules chargés. La trace de la pile devrait alors vous indiquer quelles DLL sont impliquées. Cela devrait être possible même sans les symboles pour le processus/dll.

+0

Le problème était que je ne voyais aucun moyen de localiser facilement le fil qui a jeté l'exception dans windbg - vous pouvez voir à partir de la décharge au-dessus de l'analyse! Ne m'a donné rien utile de travailler avec. Naveen m'a pointé vers DebugDiag qui a localisé le fil, et à partir de là, j'ai pu creuser plus loin. Soyez gentil de savoir cependant s'il y a un moyen facile de trouver l'exception parmi 40 threads impairs, ou est-ce simplement un cas de passer à chaque thread et de regarder le backtrace manuellement? –

+0

Mise à jour ma réponse avec les commandes pour obtenir des piles d'appels et afficher l'exception courante dans le contexte. – Naveen