2009-07-15 11 views
2

Wir hatten einen Vorfall, in dem ich Microsoft Support anrief und sie konnten WinDBG verwenden, um eine meiner Mini-Dumps zu analysieren und das genaue Problem zu identifizieren. I WinDBG analysierte den gleichen Speicherabzug und konnte die Stack-Trace nicht überholen. Ich gehe davon aus, dass ich das goldene Nugget nicht finden kann, weil ich unwissend bin, aber Microsoft wird mir nicht sagen, was sie getan haben, um es selbst auszugraben. Gibt es eine Chance, dass ich hier Hilfe bekomme?WinDBG Dump-Analyse ohne Symbole

Die Situation beinhaltete einen .NET 1.1-Aufruf an einen vom Anbieter bereitgestellten Webdienst. Für 1 Stunde pro Nacht konnten wir uns wochenlang nicht gegen den Dienst authentifizieren, aber die Verbindung scheiterte nicht. Bei jedem Ausfall haben wir Dutzende Threads aufgehängt, bis der Service wieder online war.

Wenn ich DebugDiag und Report, kann ich sehen, dass Thread 49 hängt, und run! Clrstack gegen diesen Thread.

0:049> !clrstack
succeeded
Loaded Son of Strike data table version 5 from "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\mscorsvr.dll"
Thread 49
ESP EIP
1382ec64 7c82860c [FRAME: NDirectMethodFrameStandalone] [DEFAULT] I4 System.Net.UnsafeNclNativeMethods/OSSOCK.recv(I,I,I4,ValueClass System.Net.Sockets.SocketFlags)
1382ec78 10fb1fef [DEFAULT] [hasThis] I4 System.Net.Sockets.Socket.Receive(SZArray UI1,I4,I4,ValueClass System.Net.Sockets.SocketFlags)
1382ecb8 10fb1e65 [DEFAULT] [hasThis] I4 System.Net.Sockets.NetworkStream.Read(SZArray UI1,I4,I4)
1382ece4 10fb1dd1 [DEFAULT] [hasThis] I4 System.Net.TlsStream.ForceRead(SZArray UI1,I4,I4)
1382ed00 10fb1cc4 [DEFAULT] [hasThis] SZArray UI1 System.Net.TlsStream.ReadFullRecord(SZArray UI1,I4)
1382ed20 10a6f7df [DEFAULT] [hasThis] Class System.Exception System.Net.TlsStream.Handshake(Class System.Net.ProtocolToken)
1382ed44 10a6f59b [DEFAULT] [hasThis] Void System.Net.TlsStream..ctor(String,Class System.Net.Sockets.Socket,Boolean,Class System.Security.Cryptography.X509Certificates.X509CertificateCollection)
1382ed5c 10a6f4d0 [DEFAULT] [hasThis] ValueClass System.Net.WebExceptionStatus System.Net.Connection.ConstructTlsChannel(String,Class System.Net.HttpWebRequest,ByRef Class System.Net.Sockets.NetworkStream,Class System.Net.Sockets.Socket)
1382ed78 10a6f47b [DEFAULT] [hasThis] ValueClass System.Net.WebExceptionStatus System.Net.Connection.ConstructTransport(Class System.Net.Sockets.Socket,ByRef Class System.Net.Sockets.NetworkStream,Class System.Net.HttpWebRequest)
1382edac 10a693d7 [DEFAULT] [hasThis] Void System.Net.Connection.StartConnectionCallback(Object,Boolean)
1382f028 791b7f92 [FRAME: ContextTransitionFrame]

(! Clrstack -p für mich nicht funktioniert. Es gibt genau die gleichen Informationen wie nicht für params zu fragen. Ich nehme an, das liegt daran, dass ich nicht privat Symbole für den Code verfügen.! Tun funktioniert auch nicht für mich, obwohl! Dumpobj tut. Ich lud sos über ".loadby sos mscorsvr", nicht mscorwks, da ich auf einem Server laufen. Könnte mein sos Laden in irgendeiner Weise falsch sein?)

Wie auch immer Microsoft war so freundlich, mir Teile der Dinge zu erzählen, die sie gefunden haben. Sie haben mir die Stapelspur erzählt, die sie gezogen haben, und ich habe dieselbe gezogen. (Das ist cool.) Von der Stapelverfolgung extrahierten sie jedoch die folgenden Informationen. Wie?

- So the above thread is waiting on a socket. The socket details are mentioned below
SOCKADDR @ 01285dc0
sin_family = 2 (IP)
sin_port = 443
sin_addr = 206.16.40.219

Und dann sagten sie mir den Namen des aufgehängten Objekts, damit ich es abladen konnte, und ich kann.

0:049> !dumpobj 0x09278dbc
Name: System.String
MethodTable 0x79b946b0
EEClass 0x79b949fc
Size 140(0x8c) bytes
mdToken: 0200000f (c:\windows\microsoft.net\framework\v1.1.4322\mscorlib.dll)
String: https://www.vendorname.com/services/v2006/Authentication

Wie haben sie von dieser Stack-Trace erhalten, um diese Objekte ohne private Symbole zu identifizieren? Als Administrator kann ich diesen Code nicht nur im Debug-Modus kompilieren, noch würde ich den Debug-Code als letzten Ausweg in die Produktion implementieren. Microsoft hatte genau die gleichen Informationen, die ich habe, und sie fanden die Antwort, also nehme ich an, dass es gefunden werden kann, wenn ich gerade den Ignoranzhöcker überwinden kann.

(Pro eine Antwort, ich hinzufügen, dass mein WinDBG Symbol Suchpfad sagt:. SRV*D:\Tools\Debuggers\Symbols*http://msdl.microsoft.com/download/symbols

Danke

Antwort

5

Meine Vermutung ist, dass sie das Socket-Objekt zu betrachten seine internen Felder geworfen. Sie könnten! Dso verwenden, um die Adressen aller Stapelobjekte auszugeben, oder! Dumpheap -type System.Net.Sockets.Socket, um alle Socket-Objekte im Speicher abzurufen.

Das Wissen über die Interna der Objekte hilft hier sehr. Angenommen .NET-Quellcode oder eine Dekompilierung, die von .NET Reflector erzeugt wird, würde helfen, die Interna des Socket-Objekts zu verstehen.

Wenn Sie das Socket-Objekt ausgeben, erhalten Sie die Speicheradressen der Felder m_RemoteEndPoint und m_RightEndPoint. Einer von ihnen gab ihnen wahrscheinlich die IP-Adresse, den Port und die Familie.

+0

Brilliant. Wenn es Ihnen nichts ausmacht, würde ich gerne ein wenig warten, bevor ich dies als Antwort markieren würde, aber es hat funktioniert. Das Ausgeben der Sockets hat mir nicht viel geholfen, aber ich habe die HttpWebRequest-Objekte gelöscht und bin dann durch den URI und den absoluten URI gejagt, um den problematischen Link zu finden. Wenn ich nur irgendwie vom Trace zum HttpWebRequest bohren könnte. Immer noch war der Befehl "-type" wunderschön. Vielen Dank. – codepoke

+0

Bingo! Hier ist der Weg: ~ 49s [Schalter auf blockierter Thread] dumpstackobjects [Gibt Ihnen die HttpWebRequest obj] dumpobj 09278e84 [Enthält die URI] dumpobj 09278cb0 [Enthält die absoluteURI] dumpobj 09278dbc [Hält das goldene!! Nugget! Gerader Weg!] Golly, dieses Zeug macht Spaß! Und ich kann es wieder mit einem ähnlichen Problem replizieren! Danke, Paul. – codepoke

1

Sie Symbol Server verwendeten Symbole zu erhalten

+0

Vielen Dank für den Gedanken. Wäre das immer noch ein Problem, wenn ich den Symbolsuchpfad für den Artikel konfiguriert habe, den Sie verknüpfen? Ich habe das vor einiger Zeit konfiguriert. – codepoke

1

Sie wahrscheinlich lokale Kopien von allen.

Sie können sie herunterladen here, sie auf Ihrem lokalen System, und laden Sie sie dann in Ihren Debugger, indem Sie eingeben:

.symfix c: \ YourLocalSymbols

.reload

+0

Ich habe WinDBG mit dem Symbolserver von Microsoft verbunden, also erwarte ich nicht, dass dies einen großen Unterschied macht. WinDBG hat 81MB Symbole eingezogen, also erwarte ich, dass ich alles habe, was Microsoft mir geben kann. Bitte korrigieren Sie mich, falls ich falsch liege. – codepoke

+0

Sie sollten dann technisch die gleichen Ergebnisse haben. Wenn Sie die Symbole nicht geladen sehen, sollten Sie das oben beschriebene tun. Auch bezüglich des Ladens von SOS. Dies ist, was ich tue: .Laden C: \ WINDOWS \ Microsoft.NET \ Framework64 \ v2.0.50727 \ sos.dll, um die genaue DLL, die ich will. – AaronS