2

我们有一个事件,我打电话给 Microsoft 支持,他们能够使用 WinDBG 分析我的一个小型转储并确定发生的确切问题。我 WinDBG 分析了相同的转储,但无法通过堆栈跟踪。我假设我无法找到金块,因为我很无知,但微软不会告诉我他们自己做了什么来挖掘它。有没有机会在这里得到一些帮助?

这种情况涉及对供应商提供的 Web 服务的 .NET 1.1 调用。连续几周每晚 1 小时,我们无法针对该服务进行身份验证,但连接没有失败。在每次中断期间,我们都会挂起数十个线程,直到服务重新上线。

如果我 DebugDiag 和 Report,我可以看到线程 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 对我不起作用。它返回与不要求参数完全相同的信息。我认为这是因为我没有代码的私有符号。但是!do 对我也不起作用! dumpobj 确实如此。我通过“.loadby sos mscorsvr”加载了 sos,而不是 mscorwks,因为我在服务器上运行。我的 sos 加载可能在某种程度上是错误的吗?)

无论如何,微软很友好地告诉我他们发现的部分内容。他们告诉我他们提取的堆栈跟踪,而我也提取了同一个。(这很酷。)不过,他们从堆栈跟踪中提取了以下信息。如何?

- 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

谢谢你。

4

3 回答 3

5

我的猜测是他们转储了套接字对象以查看其内部字段。您可以使用 !dso 转储所有堆栈对象的地址,或使用 !dumpheap -type System.Net.Sockets.Socket 来获取内存中的所有 Socket 对象。

了解对象的内部结构在这里有很大帮助。给定 .NET 源代码或.NET Reflector产生的反编译,将有助于理解套接字对象的内部结构。

转储套接字对象将为您提供字段的内存地址m_RemoteEndPointm_RightEndPoint. 其中一个可能给了他们IP地址、端口和家庭。

于 2009-07-15T15:42:14.657 回答
1

他们使用Symbol Server来获取符号。

于 2009-07-15T14:54:30.003 回答
1

他们可能拥有所有符号文件的本地副本。

您可以在此处下载它们,将它们放在本地系统上,然后通过键入以下命令将它们加载到调试器中:

.symfix c:\YourLocalSymbols

.reload

于 2009-07-15T15:22:27.473 回答