【问题标题】:WinDBG Dump Analysis without symbols没有符号的 WinDBG 转储分析
【发布时间】:2009-07-15 14:48:25
【问题描述】:

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

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

如果我调试诊断和报告,我可以看到线程 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

谢谢。

【问题讨论】:

    标签: windbg


    【解决方案1】:

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

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

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

    【讨论】:

    • 太棒了。如果您不介意,我想稍等片刻,然后再将其标记为答案,但它确实有效。转储套接字对我没有多大帮助,但我转储了 HttpWebRequest 对象,然后通过 URI 和绝对 URI 查找有问题的链接。如果我能以某种方式直接从跟踪向下钻取到 HttpWebRequest 就好了。 “-type”命令仍然很漂亮。谢谢。
    • 宾果游戏!这是线索:~49s [切换到挂起的线程] !dumpstackobjects [给你 HttpWebRequest obj] !dumpobj 09278e84 [包含 URI] !dumpobj 09278cb0 [包含 AbsoluteURI] !dumpobj 09278dbc [拿着金块!直路!] 天哪,这东西很有趣!我可以用一个不同的问题再次复制它!谢谢你,保罗。
    【解决方案2】:

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

    【讨论】:

    • 感谢您的想法。如果我根据您链接的文章配置了符号搜索路径,这仍然是一个问题吗?我前段时间配置的。
    【解决方案3】:

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

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

    .symfix c:\YourLocalSymbols

    .重新加载

    【讨论】:

    • 我已将 WinDBG 连接到 Microsoft 的符号服务器,因此我认为这不会有太大的不同。 WinDBG 已经提取了 81mb 的符号,所以我希望我已经得到了微软可以给我的一切。如果我错了,请纠正我。
    • 您在技术上应该得到相同的结果。如果您没有看到加载的符号,那么您应该执行上述操作。另外,关于加载 SOS。这就是我所做的: .load C:\WINDOWS\Microsoft.NET\Framework64\v2.0.50727\sos.dll 以获取我想要的确切 dll。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多