我有一个程序,其中包含一个作为wxThread的派生类实现的线程。有时,此程序会因非法指令或访问冲突而崩溃,但始终在线程执行的代码中的某处。
我甚至试图删除该线程并将其替换为一个看似如下的简单Win32线程:
DWORD WINAPI LoggerThread::winthread(void* arg) {
while (true) { Sleep(2000); }
}
它仍然会间歇性地在Sleep(2000)线路上发生访问冲突而崩溃,但几乎总是在大约30秒后崩溃。
最近,它在非法指令(更具体地说,未定义的指令)上崩溃,在wxThread类调用的静态函数上:
void* LoggerThread::Entry() {
while(true) {
if (queue->size() > 0) {
SOCKET sd = LoggerThread::Init(); /* Crash on this line */
/* ....... */
}
}
}
控制台的输出如下:
未定义指令:Thread = 8e823ac4 Proc = 8c329400'Opcode.exe' 未定义指令:Thread = 8c69663c Proc = 8c329400'Opcode.exe'
AKY = 00004001 PC = 800003f8(??? + 0x800003f8)RA = 006492bc(Opcode.exe + 0x006392bc)BVA = 05ffed24> FSR = 000000f5
AKY = 00004001 PC = 003ade44(Opcode.exe + 0x0039de44)RA = 004cc784(Opcode.exe + 0x004bc784)> BVA = 05ffed24 FSR = 000000f5
数据中止:线程= 8e823ac4 Proc = 8c329400'Opcode.exe'
AKY = 00004001 PC = 80188d03(NK.EXE + 0x00008d03)RA = 80000059(??? + 0x80000059)BVA = 1e07807b> FSR = 000000f3
Opcode.exe中0x003ade44处的未处理异常:0xC000001D:非法指令。
线程'public:static unsigned long __cdecl wxThreadInternal :: WinThreadStart(void *)'>(0x2fb5e2c6)已退出,代码为-1073741795(0xc000001d)。
Opcode.exe中0x80188d02处的未处理异常:0x80000002:数据类型错位。
该项目是VC ++(Visual Studio 2005),我也尝试使用Windows Mobile 5.0 SDK,Standard SDK和Pocket PC 2003 SDK进行编译。我一直在MC55和MC3090上测试我的代码,两者都做同样的事情,但我想MC55可能会更快崩溃。
值得注意的是,如果我将源代码编译为Win32程序(它基于wxWidgets),它的工作没有任何问题。
有人能让我知道我的样子吗?
答案 0 :(得分:0)
我对wxWidgets一无所知,但我可能首先看一下这个定义:
DWORD WINAPI LoggerThread::winthread(void*)
根据你的控制台输出,wxThreadInternal :: WinThreadStart是
WINAPI在ARM上指定了什么调用约定?也许WINAPI指定
对于时髦的格式表示抱歉:)
答案 1 :(得分:0)
问题解决了!事实证明,wxWidgets与Standard SDK不兼容。我之前切换到Windows Mobile SDK 5.0进行检查,但碰巧有另一个运行时问题阻止该构建按预期工作。我对其他人的建议是确保你不要将标准SDK用于带有wxWidgets的WinCE应用程序。它可能起初似乎起作用,但你最终会像我一样落入这个陷阱......谢谢所有