2009-07-15 74 views
2

我們遇到了一個我稱之爲Microsoft支持的事件,他們能夠使用WinDBG分析我的一個小轉儲並確定發生的確切問題。我WinDBG分析了相同的轉儲,無法越過堆棧跟蹤。我假設我無法找到金塊,因爲我無知,但微軟不會告訴我他們自己發掘了什麼。我有什麼機會在這裏得到一些幫助?WinDBG無符號轉儲分析

這種情況涉及到供應商提供的Web服務的.NET 1.1調用。對於每週一個小時,我們無法對服務進行身份驗證,但連接並未失敗。在每次停電期間,我們都掛了幾十個線程,直到服務恢復在線。

如果我DebugDiag和報告,我可以看到線程49掛起,並運行!clrstack針對該線程。

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不工作對我來說,它返回完全相同的信息,不要求PARAMS。我想這是因爲我沒有對代碼的專用符號。!做也不適合我,雖然!dumpobj的確如此,我通過「.loadby sos mscorsvr」加載了sos,而不是mscorwks,因爲我在服務器上運行,可能我的sos加載在某種程度上是錯誤的嗎?)

Anyway ,微軟很友好地告訴我他們發現的部分事情。他們告訴我他們拉出的堆疊痕跡,並且我拉了同一個。 (這很酷。)但是,從堆棧跟蹤中,他們提取了以下信息。怎麼樣?

- 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

然後他們告訴我,掛對象的名稱,所以我可以放棄它,我可以。

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

他們怎麼從那個堆棧跟蹤,以確保這些物品沒有私人的符號?作爲管理員,我不能在調試模式下編譯此代碼,除非是最後的手段,否則我不會將調試代碼部署到生產環境中。微軟擁有和我一樣的信息,他們找到了答案,所以我認爲如果我能克服愚蠢的問題就可以找到答案。

(每一個答案,我補充一點,我的WinDBG符號搜索路徑說: SRV*D:\Tools\Debuggers\Symbols*http://msdl.microsoft.com/download/symbols

謝謝

回答

5

我的猜測是他們傾倒的Socket對象看它的內部字段。您可以使用!dso轉儲所有堆棧對象的地址,或!dumpheap -type System.Net.Sockets.Socket以獲取內存中的所有Socket對象。

瞭解對象的內部有很多幫助。鑑於 。NET源代碼,或由.NET Reflector生成的反編譯,將有助於理解套接字對象的內部。

轉儲套接字對象會爲您提供m_RemoteEndPointm_RightEndPoint的內存地址。其中一個可能給了他們IP地址,端口和家庭。

1

他們用Symbol Server得到符號

+0

謝謝你的想法。如果我已經爲每個鏈接的文章配置了符號搜索路徑,這仍然是一個問題嗎?我前一段時間配置了它。 – codepoke 2009-07-15 15:11:50

1

他們可能有所有的本地副本。的符號文件

您可以將它們下載到here,將它們放在本地系統上,然後通過鍵入以下命令將它們加載到調試器中:

.symfix C:\ YourLocalSymbols

.reload

+0

我有WinDBG連接到微軟的符號服務器,所以我不認爲這會有很大的不同。 WinDBG已經拉到了81mb的符號,所以我希望我已經擁有了微軟能給我的所有東西。如果我錯了,請糾正我。 – codepoke 2009-07-15 15:39:22

+0

那麼你應該在技術上有相同的結果。如果您沒有看到加載的符號,那麼您應該執行上述操作。另外,關於加載SOS。這是我做的:。加載C:\ WINDOWS \ Microsoft.NET \ Framework64 \ v2.0.50727 \ sos.dll來抓取我想要的確切的DLL。 – AaronS 2009-07-15 16:18:02