Mic*_*ick 8 c++ debugging multithreading visual-studio-2008
我有一个我正在追逐的错误(我认为它是一个僵局).当我运行代码时它挂起而没有调试器标记错误,所以过了一会儿我尝试按下暂停(全部中断)按钮.然后调试器报告"进程似乎已死锁......".然后我可以看到所有的线程都被保持在EnterCriticalSection的行上,除了那个已经在临界区内的线程.当我用调试器查看CS内部的线程时,我看到一个绿色箭头,伴随着一个指向GetWindowText线的小蓝圈......如下所示:
// stuff A
{
GetWindowText(editwin[a].child_window_handle,existing_text,MAX_TEXT_SIZE-1);
}
// stuff B
Run Code Online (Sandbox Code Playgroud)
如果我将鼠标悬停在绿色箭头上,我会看到文本"这是当此线程从当前函数返回时执行的下一个语句".现在这让我很难过,因为我不知道它是否意味着它被卡在"东西A"中并等待回来或者卡在GetWindowText里面并且不知何故卡在里面.GetWindowText的参数对我来说都很合理.如果我点击"进入",我会收到消息"无法步骤.该过程已被软打破".
编辑:东西A实际上是声明:
if (buf_ptr != NULL)
Run Code Online (Sandbox Code Playgroud)
通常,代码行旁边的绿色箭头表示"这是将要执行的下一行,如果不是因为我们被困在更深的堆栈帧中的某个地方." 但是,根据目前提供的信息,VS无法肯定地说...
[编辑 - 当然,对Win32的深入了解可以提供一个非常好的猜测 - 根据GetWindowText()API已知的陷阱,查看"mos"的答案可能的解释
如上所述,Visual Studio向您展示的内容有时会产生误导.为了更准确地了解正在发生的事情,您需要关闭VS默认启用的一些无用的"功能".在工具 - >选项 - >调试 - >常规中,确保:
这应该允许你:
1)打破/跳过/ etc导致死锁的确切指令
2)查看到那一点的完整堆栈跟踪,无论模块是什么
3)假设您的符号和源服务器配置正确,请在可用时查看源代码
您的问题是GetWindowText实际上是向另一个窗口发送消息并等待它返回.如果该窗口由另一个正在等待临界区的线程拥有,则GetWindowText将永远等待.
你被困在GetWindowText中,并造成了死锁.
归档时间: |
|
查看次数: |
5670 次 |
最近记录: |