我有一个我正在追逐的bug (我想这是一个死锁)。当我运行代码时,它挂起了,调试器没有标记出错误,所以过了一段时间,我尝试按下暂停(全部中断)按钮。然后,调试器会报告“进程似乎已死锁...”。然后我可以看到,除了已经在临界区中的一个线程之外,所有的线程都被挂起在写有EnterCriticalSection的行上。当我使用调试器查看位于C.S.内的线程时,我看到一个绿色箭头,旁边是一个蓝色的小圆圈,它指向一条带有GetWindowText的线……如下所示:
// stuff A
{
GetWindowText(editwin[a].child_window_handle,existing_text,MAX_TEXT_SIZE-1);
}
// stuff B如果我将鼠标悬停在绿色箭头上,我会看到文本"this is the next statement to execute when this thread return from the current function“。这把我难倒了,因为我不知道这是不是意味着它被困在"stuff A“中,等待着回来,或者它被困在GetWindowText中,不知何故被困在了里面。在我看来,对GetWindowText的争论都是合理的。如果我点击"step into“,我就会收到消息"Unable to step. the process has has”。
编辑: stuff A实际上是语句:
if (buf_ptr != NULL)发布于 2009-09-28 20:03:52
您的问题是,GetWindowText实际上会向另一个窗口发送一条消息,并等待它返回。如果该窗口归另一个正在等待临界区的线程所有,则GetWindowText将永远等待。
您被困在GetWindowText中,并造成了一个死锁。
发布于 2009-09-28 16:50:18
通常,代码行旁边的绿色箭头表示“如果不是因为我们被困在更深的堆栈框架中,这是下一行要执行的代码。”然而,根据到目前为止提供的信息,VS使得我们无法确定...
编辑-当然,深入的Win32知识可以提供一个非常好的猜测-查看"mos“的答案,以获得基于GetWindowText() API的已知陷阱的可能解释
如前所述,Visual Studio向您展示的内容有时会产生误导。为了更好地了解到底发生了什么,你需要关闭一些VS默认启用的无用的“功能”。在Tools -> Options -> Debugging -> General中,确保:
这将允许您:
1)中断/跳过/等导致死锁的确切指令
2)查看该点之前的完整堆栈跟踪,而不考虑模块
3)只要有源代码,请查看源代码,假设您的symbol & source servers are configured correctly
发布于 2009-09-28 20:10:58
正如前面的回答所暗示的那样,您的代码被卡在了"Stuff A“中。
我可以为你推荐另一种工具--皮带吗?
我通常发现使用WinDbg调试本机同步问题要容易得多。只需在WinDbg中启动你的程序,指向正确的符号,所有的信息就会在那里,供你使用!lock,!cs和k命令进行调查。
如果你是WinDbg的新手,你会发现互联网上到处都是关于它的信息。我也推荐阅读Advanced Windows Debugging。
与用户友好的VS Debugger相比,它有点难上手,但你每花一分钟时间学习如何使用它,就会节省你未来几个小时的调试时间。
https://stackoverflow.com/questions/1488037
复制相似问题