我了解一般概述: http://msdn.microsoft.com/en-us/library/dn743843.aspx; 有大量关于win32异常机制的信息和一些关于win64的信息,但是ARM并不那么清晰。
我想知道: 当机器异常被生成(内存保护违规),控制会被转移到哪里(以便我可以设置断点)? 它会转移到内核模式吗? 大概它会从向量表中查找处理程序的地址,并将其转移。内核代码执行SEH展开,还是在用户模式下执行展开? 如果在用户模式下,具体在哪里——exe的一部分、coredll还是其他地方? 背景 我们有一个大型应用程序,它在每个线程的顶层周围放置__try / __except处理程序,以便以信息丰富的方式记录崩溃情况。这在MIPS上已经运行良好多年。我们现在正在将其移植到ARM上的WinCE 7,并在VS2008下构建。我们发现在发布版本中有时无法正确处理异常。这似乎取决于异常在代码中生成的位置(我有一个测试函数,故意访问空指针以引发SEH异常,并从代码的各个位置调用此函数)。
我们使用/EHsc选项启用SEH。发布版本使用/O2/Os;删除/O2使其工作但速度明显变慢。这导致我相信优化器正在删除一些必须的内容,以使SEH起作用 - 但是究竟是什么?并非所有函数都具有“mov r12,sp ...”序言,但某些不具备此功能的函数仍然可以正常工作。这是PDATA中的某些错误吗?是否存在PDATA条目数量的上限?“dumpbin / pdata”的输出没有每行都有函数名称,这是正常现象吗?
通过使用调试器(尽管是发布版本),我可以在我的异常过滤函数的开头(从__except调用)设置断点,并观察在失败情况下它从未被调用。程序只是退出了。
我想知道: 当机器异常被生成(内存保护违规),控制会被转移到哪里(以便我可以设置断点)? 它会转移到内核模式吗? 大概它会从向量表中查找处理程序的地址,并将其转移。内核代码执行SEH展开,还是在用户模式下执行展开? 如果在用户模式下,具体在哪里——exe的一部分、coredll还是其他地方? 背景 我们有一个大型应用程序,它在每个线程的顶层周围放置__try / __except处理程序,以便以信息丰富的方式记录崩溃情况。这在MIPS上已经运行良好多年。我们现在正在将其移植到ARM上的WinCE 7,并在VS2008下构建。我们发现在发布版本中有时无法正确处理异常。这似乎取决于异常在代码中生成的位置(我有一个测试函数,故意访问空指针以引发SEH异常,并从代码的各个位置调用此函数)。
我们使用/EHsc选项启用SEH。发布版本使用/O2/Os;删除/O2使其工作但速度明显变慢。这导致我相信优化器正在删除一些必须的内容,以使SEH起作用 - 但是究竟是什么?并非所有函数都具有“mov r12,sp ...”序言,但某些不具备此功能的函数仍然可以正常工作。这是PDATA中的某些错误吗?是否存在PDATA条目数量的上限?“dumpbin / pdata”的输出没有每行都有函数名称,这是正常现象吗?
通过使用调试器(尽管是发布版本),我可以在我的异常过滤函数的开头(从__except调用)设置断点,并观察在失败情况下它从未被调用。程序只是退出了。
nkarm.h
文件中的struct _SCOPE_TABLE
。 - Igor Skochinsky