我们遇到了一个事件,我打电话给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对我不起作用。它返回完全相同的信息,而不是要求参数。我认为这是因为我没有代码的私有符号。!对我也不起作用虽然!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
谢谢。
答案 0 :(得分:5)
我的猜测是他们转储套接字对象来查看其内部字段。你可以使用!dso来转储所有堆栈对象的地址,或者使用!dumpheap -type System.Net.Sockets.Socket来获取内存中的所有Socket对象。
了解对象的内部结构对此有很大帮助。鉴于.NET源代码或.NET Reflector生成的反编译,将有助于理解套接字对象的内部。
转储套接字对象会为您提供字段m_RemoteEndPoint
和m_RightEndPoint
的内存地址。其中一个可能给了他们IP地址,端口和家庭。
答案 1 :(得分:1)
他们使用Symbol Server来获取符号。
答案 2 :(得分:1)