arm调试过程,如果抛一个SIGSEGV,地址在 0xe7f001f0 附近,原因居然是因为我在调试。当我使用n指令跳到下一行代码时,往往变成了continue指令一样地执行。还不确定地抛出SIGSEGV(addr:0xe7f00XXX),使用程序直接崩溃不能继续调试下去。查看寄存器发现的确有某个rN的寄存器被诡异地修改了。多次归纳后发现,都在调用虚函数时抛出SIGSEGV(addr:0xe7f00XXX),不论何处何种逻辑下,这个被神修改的寄存器的值都是0xe7f00XXX,在反编译逻辑中是要在这里取出虚函数表的虚函数指针。这个寄存器原本是从对象中读取出虚函数表地址,然后偏移取出虚函数指针,却无端被写0xe7f001f0。最后google这个地址,才发现,这是arm下调试中断,.inst 0xe7f001f0。
参考https://github.com/scottt/debugbreak。
Behavior on Different Architectures
Architecture | debug_break() |
---|---|
x86/x86-64 | int3 |
ARM mode, 32-bit | .inst 0xe7f001f0 |
Thumb mode, 32-bit | .inst 0xde01 |
AArch64, ARMv8 | .inst 0xd4200000 |
MSVC compiler | __debugbreak |
Otherwise | raise(SIGTRAP) |
不得不喷google的android studio,lldb做得如此强差人意。它的lldb强差人意的地方还多着。
时间: 2024-11-02 04:13:07