0xe7f001f0!?NDK調試過程,無故拋出SIGSEGV。
阿新 • • 發佈:2017-08-30
x86 如果 崩潰 .cn 多次 img studio ogl 分享
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強差人意的地方還多著。
0xe7f001f0!?NDK調試過程,無故拋出SIGSEGV。