1. 程式人生 > >0xe7f001f0!?NDK調試過程,無故拋出SIGSEGV。

0xe7f001f0!?NDK調試過程,無故拋出SIGSEGV。

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

Architecturedebug_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。