2009-10-30 85 views
5

我正在使用第三方封闭源代码API,它引发一个异常,指出“所有命名管道都很忙”。在windbg中分析崩溃转储

我想进一步调试(而不是仅仅通过),所以我实际上可以了解封面下发生了什么。

我已使用WinDbg转储了此过程。我现在应该使用哪些命令来分析此转储?

感谢

+0

它是托管还是本机?你能抛出更多的细节吗? – Naveen 2009-10-30 13:58:27

回答

2

这当客户端调用的CreateFile对现有管道和所有现有的管道实例都忙普遍发生。此时CreateFile返回一个错误,错误代码是ERROR_PIPE_BUSY。此时正确的方法是使用超时值调用WaitNamedPipe以等待管道实例变为可用。

当多个客户端尝试同时连接到命名管道时,通常会发生此问题。

0

我认为第三方DLL是本地(否则,只用反射镜)

使用的WinDbg分析转储之前,请尝试使用进程监视器(Sysinternals的,免费软件)来监控你的流程的活动。如果由于文件系统相关问题而导致失败,您可以准确查看是什么导致了问题,以及在发生故障前究竟发生了什么。

如果Process-Monitor不够,那么您可以尝试并调试您的过程。但为了查看关于第三方DLL的一些有意义的信息,您将需要它是pdb的。

设置正确的调试符号后,您可以使用k命令或其中一个变体(我假设您正在谈论本机代码)查看调用堆栈。如果你的进程确实因为这个DLL而崩溃,而不是检查你传递给它的函数的参数,以确保问题不在你身边。我猜想进一步调用堆栈,你会到达一些Win32 API--检查dll函数传递的参数,试图看看是否有“异味”。如果你有dll的私有符号,你可以检查它的函数的局部变量(dv),它可以给你更多的信息。

我希望我给你一个很好的起点。

4

在使用Windbg进行事后调试时,在决定深入挖掘之前运行一些常规诊断命令会很有用。这些应该是你的第一个步骤:

.logopen <filename> (See also .logappend) 
.lastevent    See why the process halted and on what thread 
u      List disassembly near $eip on offending thread 
~      Status of all threads 
Kb      List callstack, including parameters 
.logclose 

这些命令通常会给你发生了什么事,所以你可以进一步深入研究的概述。在处理没有源代码的库的情况下,将生成的日志文件与二进制库的构建号一起发送给供应商应该足以让它们追踪到已知问题(如果有的话)。

12

你可以开始做如下得到异常的概述:

!analyze -v 

现在你可以加载异常背景记录:

.ecxr 

而现在......只是来看看在堆栈,寄存器,线程,...

kb  ;will show you the stack trace of the crash. 
dv  ;local variables 

根据你得到的线索,你应该遵循一个dif不寻常的方向。如果你想快速参考WinDbg,我建议你this link

我希望你找到一些这些命令和信息有用。