setjmp, longjmp使用不当引起崩溃

setjmp 将CPU核中的一组寄存器保存在一块jmp_buf中,要注意它不保存局部变量,当函数调用过深时发生错误,可以用longjmp跨越式跳回当初setjmp的地方,根据setjmp的返回值,可以判断是首次调用setjmp,还是从longjmp返回。

setjmp和longjmp的使用要处于链式调用关系的函数中, 如果是在平级函数中,由于栈帧被后面的函数复用,再跳转回来时,局部变量失效,导致各种各样的异常。

libpng库里使用了大量setjmp, longjmp处理异常, 某业务层在使用这些函数时,由于不能直接看到setjmp, longjmp的调用, 出现了非线性的调用,局部指针变量被覆盖导致的奇奇怪怪的崩溃, 栈回溯了两层就遇到 fp = 0, 无法继续, 当时将栈数据全部打印出来,暴力分析了栈上所有的疑似指令地址对应的函数(可以通过nm命令查看代码段范围,以跳过不必要的数据),这样确定了主要的函数调用关系,最后费力地定位到局部指针变量在longjmp之后发生了变化,导致释放出错。

调整了业务代码调用层次和顺序后,不再出现崩溃问题。

猜你喜欢

转载自blog.csdn.net/konga/article/details/122376566