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

Multithreading Windows CE线程(C+;+;)中的ARM非法指令/访问冲突,multithreading,windows-ce,wxwidgets,Multithreading,Windows Ce,Wxwidgets,我有一个程序,其中包含一个作为wxThread派生类实现的线程。有时,该程序会因非法指令或访问冲突而崩溃,但总是在线程执行的代码中的某个地方 我甚至尝试删除该线程,并将其替换为一个普通的Win32线程,如下所示: DWORD WINAPI LoggerThread::winthread(void* arg) { while (true) { Sleep(2000); } } 它仍然会间歇性地在Sleep(2000)线路上发生访问冲突,但几乎总是在30秒后发生 最近,它在wxThread类调

我有一个程序,其中包含一个作为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(操作码.exe+0x006392bc)BVA=05ffed24>FSR=000000f5

AKY=00004001 PC=003ade44(操作码.exe+0x0039de44)RA=004cc784(操作码.exe+0x004bc784)>BVA=05ffed24 FSR=000000f5

数据中止:线程=8e823ac4进程=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\uu cdecl wxThreadInternal::WinThreadStart(void*)”>(0x2fb5e2c6)已退出,代码为-1073741795(0xc000001d)

Opcode.exe中0x80188d02处的未处理异常:0x80000002:数据类型未对齐

该项目是VC++(VisualStudio2005),我也尝试过使用WindowsMobile 5.0SDK、标准SDK和PocketPC2003SDK进行编译。我一直在MC55和MC3090上测试我的代码,两者都做相同的事情,但我认为MC55崩溃的速度可能更快

值得注意的是,如果我将源代码编译为Win32程序(它基于wxWidgets),那么它就可以正常工作


有谁能告诉我在哪里可以看吗?

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

DWORD WINAPI LoggerThread::winthread(void*)
根据控制台输出,wxThreadInternal::WinThreadStart是

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

?


很抱歉,格式很奇怪:)

问题已解决!结果证明wxWidgets与标准SDK不兼容。我之前切换到WindowsMobileSDK5.0进行检查,但碰巧出现了另一个运行时问题,导致构建无法按预期工作。我对其他人的建议是,确保不要将WinCE应用程序的标准SDK与wxWidgets一起使用。一开始它可能看起来很有效,但最终你会像我一样落入这个陷阱。。。谢谢大家

嗨,谢谢你们的回复。WINAPI似乎指定了u stdcall,我应该考虑使用u cdecl还是其他约定?SDK中的TTY示例没有显式地给出一个-DWORD-PortReadThread(LPVOID-LPVOID)@Alwyn——我认为paulcam可能在这里找到了一些东西——我们在Win-CE应用程序中遇到了一个类似的问题,结果恰恰是这样,即为作为参数传递给API方法的函数指定了错误的调用约定。使用错误的调用约定肯定是错误的,它会把堆栈填满。不管怎样,把它修好,看看它是否能解决你的问题。我有点缩短了我自己的答案。调用约定的最高要求是它们必须符合预期。您可能需要花几分钟的时间来阅读这些内容,然后再阅读一些有关这些内容的详细信息。正如@AAT所提到的,只需指定wxWidget期望看到的调用约定,就可以更容易地看到它是否有效。其他方法包括在预处理后查看代码,以及在调试器中查看ASM。非常感谢您的回答-非常好的想法。我已经阅读了您发送给我的链接,并且我还阅读了CreateThread()需要_stdcall,因此我对其进行了调整以反映这一点。不幸的是,这并没有解决问题,但我开始认为这与wxWidgets有关,因为如果不创建主wxFrame,问题就不会发生。wxFrame创建的那一刻(根本没有控件,只有窗口),它又开始崩溃。我以前也走过这条路,但我想我没有足够的耐心去观察它是否真的撞车了。有什么想法吗?对不起,我对wxWidget一无所知:(在WinCE wxWidgets build的setup.h中也可能有一些帮助:`define wxUSE_EXCEPTIONS 1#define wxUSE_DEBUGREPORT 1#define wxUSE_STACKWALKER 0#define wxUSE_ON_FATAL_EXCEPTION 0#define wxUSE_DEBUG_NEW 1#此外,我最初编译的代码没有在wxWidgets中启用异常,尽管我在代码中使用了异常。