週末碰到一個問題,Android可執行程序段錯誤,如何定位呢。仔細查看段錯誤如下
...
1-07 06:10:29.240: I/DEBUG(2319): backtrace:
01-07 06:10:29.240: I/DEBUG(2319): #00 pc 0001ce38 /system/lib/libc.so (memcpy+112)
01-07 06:10:29.240: I/DEBUG(2319): #01 pc 00001ef7 /system/lib/KDrvService
01-07 06:10:29.240: I/DEBUG(2319): #02 pc 0000166b /system/lib/KDrvService
01-07 06:10:29.240: I/DEBUG(2319): #03 pc 0000ca78 /system/lib/libc.so (__thread_entry+72)
01-07 06:10:29.240: I/DEBUG(2319): #04 pc 0000cbf4 /system/lib/libc.so (pthread_create+208)
...
對照函數MAP文件發現是某函數中的memcpy導致的問題。
基本斷定是memcpy導致的段錯誤,瀏覽代碼發現如下錯誤:
memcpy(buf+offset, length, length);
修改爲:
memcpy(buf+offset, buffer, length);
解決問題。
解決問題的思路有多種:
1. 代碼審查,對於出現問題前,可以通過代碼審,減少BUG數量。
2. 調試跟蹤,開發過程中通過調試跟蹤,能更快定位問題所在。
3. 依賴系統輸出的錯誤信息定位問題,對於發佈的程序i問題,通過系統輸出的錯誤信息,能更準確的定位問題。