喜欢2次
在移植Lua解析器的过程中遇到初始化过程成触发异常中断(system_default_exception_handler),Debug怀疑是在setjmp函数的调用过程中触发的,因此找了一段 setjmp的测试代码来定位问题。
开发环境信息:
setjmp应用代码:
#include "stdio.h"
#include "setjmp.h"
static jmp_buf env;
double func_div(double dividend, double divisor)
{
printf("call func_div \n");
if(divisor == 0)
longjmp(env, 1);
return dividend / divisor;
}
void try_exception()
{
if (setjmp(env) == 0)
func_div(2, 0);
else
printf("Zero divisor !!! \n");
printf("Finished \n");
}
int main(){
try_exception();
return 0;
}
Debug到setjmp函数的调用中,执行单步调试到0x08001876处触发异常中断(与Lua源码调试结果一致)
后来查询fsw指令发现是涉及浮点数的sw指令,用于保存浮点环境参数的。想到之前遇到启动文件进入FPU配置造成系统不能启动问题时没有去掉工程宏定义arch中的f参数。
修改配置重新编译Demo工程:
其中setjmp函数对应的汇编代码已经没有了保存浮点数环境参数的部分逻辑。
运行Demo正常逻辑输出: