首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调试器问题

调试器问题
EN

Stack Overflow用户
提问于 2009-09-28 16:34:34
回答 4查看 5.8K关注 0票数 9

我有一个我正在追逐的bug (我想这是一个死锁)。当我运行代码时,它挂起了,调试器没有标记出错误,所以过了一段时间,我尝试按下暂停(全部中断)按钮。然后,调试器会报告“进程似乎已死锁...”。然后我可以看到,除了已经在临界区中的一个线程之外,所有的线程都被挂起在写有EnterCriticalSection的行上。当我使用调试器查看位于C.S.内的线程时,我看到一个绿色箭头,旁边是一个蓝色的小圆圈,它指向一条带有GetWindowText的线……如下所示:

代码语言:javascript
复制
// 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实际上是语句:

代码语言:javascript
复制
if (buf_ptr != NULL)
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-09-28 20:03:52

您的问题是,GetWindowText实际上会向另一个窗口发送一条消息,并等待它返回。如果该窗口归另一个正在等待临界区的线程所有,则GetWindowText将永远等待。

您被困在GetWindowText中,并造成了一个死锁。

票数 5
EN

Stack Overflow用户

发布于 2009-09-28 16:50:18

通常,代码行旁边的绿色箭头表示“如果不是因为我们被困在更深的堆栈框架中,这是下一行要执行的代码。”然而,根据到目前为止提供的信息,VS使得我们无法确定...

编辑-当然,深入的Win32知识可以提供一个非常好的猜测-查看"mos“的答案,以获得基于GetWindowText() API的已知陷阱的可能解释

如前所述,Visual Studio向您展示的内容有时会产生误导。为了更好地了解到底发生了什么,你需要关闭一些VS默认启用的无用的“功能”。在Tools -> Options -> Debugging -> General中,确保:

  • 启用地址级调试=ON
  • 启用仅我的代码=OFF
  • 启用源服务器支持= ON

这将允许您:

1)中断/跳过/等导致死锁的确切指令

2)查看该点之前的完整堆栈跟踪,而不考虑模块

3)只要有源代码,请查看源代码,假设您的symbol & source servers are configured correctly

票数 6
EN

Stack Overflow用户

发布于 2009-09-28 20:10:58

正如前面的回答所暗示的那样,您的代码被卡在了"Stuff A“中。

我可以为你推荐另一种工具--皮带吗?

我通常发现使用WinDbg调试本机同步问题要容易得多。只需在WinDbg中启动你的程序,指向正确的符号,所有的信息就会在那里,供你使用!lock,!cs和k命令进行调查。

如果你是WinDbg的新手,你会发现互联网上到处都是关于它的信息。我也推荐阅读Advanced Windows Debugging

与用户友好的VS Debugger相比,它有点难上手,但你每花一分钟时间学习如何使用它,就会节省你未来几个小时的调试时间。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1488037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档