在DispatchMessage崩溃,为什么?(Crash in DispatchMessage, why)
IT问题网 2021-02-19 00:00:00
问 题
嗨,亲爱的:
我有一个工作线程,里面有一个窗口。线程proc如:
unsigned __stdcall threadfunc(void * param)
{
mywindow mywin;
msg msg;
bool bret;
while((bret = getmessage(amp; msg,null,0,0))!= 0)
{
if(bret == -1)
{
//处理错误并可能退出
}
else
{
translatemessage(amp; msg);
dispatchmessage(amp; msg);
}
}
return(int)msg.wparam;
}
mywindow派生自cwindowimpl。现在我的问题是这个程序在dispachmessage中随机崩溃,如崩溃报告中的minidump所示。
可能是什么问题?
解决方案
崩溃很可能是一个更深层的功能。调试器在 dispatchmessage 函数中显示它,因为它是最近的源代码可用。
是c ++调试器能够显示所有堆栈跟踪条目,而不仅仅是那些有源代码的条目?
这有助于检测真正的问题。
干杯
uwe
是的,当我使用windbg打开minidump时,我得到了所有堆栈跟踪,如下所示:
00 1a14f398 76cd86ef 0xfdf920e
01 1a14f3c4 76cd8876 user32 + 0x186ef
02 1a14f43c 76cd70f4 user32 + 0x18876
03 1a14f498 76cccea0 user32 + 0x170f4
04 1a14fcc8 771d647e user32 + 0xcea0
05 1a14fd34 21725f86 ntdll + 0x4647e
06 1a14ff38 1a14ff20 rjck!threadfunc + 0xb6
或类似:
00 1a14f398 76cd86ef 0xfdf920e
01 1a14f3c4 76cd8876 user32!internalcallwinproc + 0x23
02 1a14 f43c 76cd70f4 user32!usercallwinproccheckwow + 0x14b
03 1a14f498 76cccea0 user32!dispatchclientmessage + 0xda
04 1a14fcc8 771d647e user32!__ fnoutstring + 0x63
05 1a14fcd0 00000000 ntdll!kiusercallbackdispatcher + 0x2e
并且msg很常见,就像wm_timer一样。这是有线的。我认为原因是在首先处理所有msg in循环之前销毁了window类。但是当句柄无效时,getmessage将返回-1。现在我认为堆栈可能在某些窗口proc中失败,然后在它返回时崩溃。或者也许我的win proc被其他代码破坏,是否可能?
分享: