setjmp, longjmp使用不当引起崩溃

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值