使用反彙編精確到一條彙編指令
addr2line可以精確到哪一行**,但是一行**可能對應多條指令,所以如果條件允許的話,拿到帶有符號表的演算法庫,反彙編到具體指令。
工作中出現乙個crash,首先定位到具體語句
mdevice->getpixfmt(framemsg->mframe, &framefmt);
如果單看這條語句,涉及兩個指標,那究竟是哪個指標有問題,通過反彙編+上下文,我們可以定位出具體哪個指標出問題了。
反彙編如下:
add x2, sp, #0x14 //&mframefmt
ldr x0, [x20, #48] //mdevice
ldr x1, [x19, #16] //framemsg->mframe
ldr x8, [x0] //crash!!!!!
ldr x8, [x8, #416]
通過原始碼分析,mdevice變數本身分配在棧上,獲取到mdevice值,它是乙個指標,再取它對應位址的值出現crash,位址非法。
也就是說mdevice變數被踩,導致非法記憶體。
這個問題還可以仔細研究下:
1、虛函式,
虛函式在虛函式表中是按宣告順序排列的,是通過虛函式表來呼叫的。
mdevice指向乙個類,是這個類的起始位址,也是這個類的虛函式表的位址,虛函式表一般放在類的起始位置。從而獲得這個虛函式表位址,虛函式在虛函式表中是按宣告順序排列的的,所以**中直接偏移#416找到虛函式位址。
DSYM 檔案定位crash
重點是dwarfdump uuid命令 我們在ios開發中會碰到的很多crash問題,如果debug除錯模式的話,我們可以往往很容易的根據log的輸出定位到導致crash的原因,但對於已經上線的應用,或者是release環境包導致的crash,我們就需要一些特殊的手段來通過crash log進行分析...
定位程式crash的方法。
一 利用工具,比如crashfinder。先來測試一段簡單除0 出錯。include int crash int x,int y int main 當前 我用vs2008,release模式編譯一下。直接單獨執行一下exe,得到下面的錯誤。位置為 0x00401678。二 我們把crashfinde...
Android 使用NDK定位Crash
02 27 10 57 15.736 a libc 32000 fatal signal 11 sigsegv at 0x0000000c code 1 thread 32014 thread 1461 02 27 10 57 15.736 a libc 32000 send stop signal...