ARM Windows CE线程中的非法指令/访问冲突(C ++)

时间:2011-03-20 21:44:24

标签: multithreading windows-ce wxwidgets

我有一个程序,其中包含一个作为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),它的工作没有任何问题。

有人能让我知道我的样子吗?

2 个答案:

答案 0 :(得分:0)

我对wxWidgets一无所知,但我可能首先看一下这个定义:

DWORD WINAPI LoggerThread::winthread(void*)

根据你的控制台输出,wxThreadInternal :: WinThreadStart是

__cdecl

WINAPI在ARM上指定了什么调用约定?也许WINAPI指定

__stdcall

对于时髦的格式表示抱歉:)

答案 1 :(得分:0)

问题解决了!事实证明,wxWidgets与Standard SDK不兼容。我之前切换到Windows Mobile SDK 5.0进行检查,但碰巧有另一个运行时问题阻止该构建按预期工作。我对其他人的建议是确保你不要将标准SDK用于带有wxWidgets的WinCE应用程序。它可能起初似乎起作用,但你最终会像我一样落入这个陷阱......谢谢所有