在 Android AArch64 上用 QBDI trace 时避免 C++ 异常导致 abort
发表评论
用 qbdi trace 跑一段目标函数时,如果目标函数里会间接调用到某个会抛 C++ 异常的函数(内部用 __cxa_throw),进程经常会直接 abort 原因: QBDI 把执行交给“原生”跑被调函数时,会在栈上改掉返回地址,让函数返回时回到 QBDI 的 trampoline。C++ 异常在找 catch 时会按栈上的返回地址做 unwind;这时看到的是 QBDI 的地址,没有对应的异常处理信息,就被当成未处理异常 → 直接 abort。所以:会 throw 的那段代码不能在被 QBDI 插桩/控制的这条“假栈链”里,要么别插桩它,要么别让它出现在你 trace 的这条调用链的“插桩范围”里。 解决思 ... 阅读更多