1. 程式人生 > >分析android crash log(記錄未實驗)

分析android crash log(記錄未實驗)

2 c/c++, 通常情況下,可以通過segment fault 等錯誤即訊號 SIGSEGV(11) 做出相應處理,即設定SIGSEGV的handler呼叫libc的backtrace,即可列印對於的callback stack;定位問題所在;但在android 中, bionic 不提供類似功能,而且只能通過logcat才能看到log資訊,但是我們也可以根據android出錯資訊獲得呼叫堆疊資訊,如以下出錯資訊: [cpp] view plain copy  print?
  1. D/CallStack( 2029): #00  pc 00008156  /system/lib/hw/audio.primary.tf4.so  
  2. D/CallStack( 2029): #01  pc 000089e8  /system/lib/hw/audio.primary.tf4.so (android_audio_legacy::AudioHardware::AudioStreamOutALSA::setParameters(android::String const&)+139)  
  3. D/CallStack( 2029): #02  pc 0000b2ca  /system/lib/hw/audio.primary.tf4.so  
  4. D/CallStack( 2029): #03  pc 0003ac6a  /system/lib/libaudioflinger.so (android::AudioFlinger::MixerThread::checkForNewParameters_l()+377)  
  5. D/CallStack( 2029): #04  pc 0003960a  /system/lib/libaudioflinger.so (android::AudioFlinger::PlaybackThread::threadLoop()+145)  
  6. D/CallStack( 2029): #05  pc 00011264  /system/lib/libutils.so (android::Thread::_threadLoop(void*)+111)  
  7. D/CallStack( 2029): #06  pc 00010dca  /system/lib/libutils.so  
  8. D/CallStack( 2029): #07  pc 0000e3f8  /system/lib/libc.so (__thread_entry+72)  
  9. D/CallStack( 2029): #08  pc 0000dae4  /system/lib/libc.so (pthread_create+160)  
2.1 可以使用 arm-linux-addr2line 獲得呼叫堆疊,arm-eabi-addr2line -C -f -e symbols/system/lib/*.so addr, 這樣就可以打印出 呼叫堆疊資訊了。

2.2 使用ndk-stack 工具, 儲存出錯log為 logcat.log, cat logcat..log | ndk-stack -sym ~/[SOURCE-DIR]/out/target/product/[PROJECT]/symbols/system/lib/ 列印呼叫堆疊

2.3 使用 panic.py(程式碼在下面) 指令碼分析並列印呼叫堆疊,/panic.py logcat.log, 注意logcat 必須轉換成以下格式

[cpp] view plain copy  print?
  1. D/CallStack( 2029): #00  pc 00008156  /system/lib/hw/audio.primary.tf4.so  
  2. D/CallStack( 2029): #01  pc 000089e8  /system/lib/hw/audio.primary.tf4.so  
  3. D/CallStack( 2029): #02  pc 0000b2ca  /system/lib/hw/audio.primary.tf4.so  
  4. D/CallStack( 2029): #03  pc 0003ac6a  /system/lib/libaudioflinger.so  
  5. D/CallStack( 2029): #04  pc 0003960a  /system/lib/libaudioflinger.so  
  6. D/CallStack( 2029): #05  pc 00011264  /system/lib/libutils.so  
  7. D/CallStack( 2029): #06  pc 00010dca  /system/lib/libutils.so  
  8. D/CallStack( 2029): #07  pc 0000e3f8  /system/lib/libc.so  
  9. D/CallStack( 2029): #08  pc 0000dae4  /system/lib/libc.so  
這樣執行指令碼 ./panic.py setincallpath_l.txt, 列印定位資訊:
[cpp] view plain copy  print?
  1. [email protected]:/meizu/JellyBean-4.2.1/trunk/out/target/product/tf4$ ./panic.py ./backtrack/setincall_path.txt  
  2. read file ok  
  3. AudioHardware.cpp:829         android_audio_legacy::AudioHardware::setIncallPath_l(unsigned int)  
  4. AudioHardware.cpp:1537        android_audio_legacy::AudioHardware::AudioStreamOutALSA::setParameters(android::String8 const&)  
  5. audio_hw_hal.cpp:197          out_set_parametersAudioFlinger.cpp:3535         android::AudioFlinger::MixerThread::checkForNewParameters_l()  
  6. AudioFlinger.cpp:2586         android::AudioFlinger::PlaybackThread::threadLoop()  
  7. Threads.cpp:793               android::Thread::_threadLoop(void*)  
  8. Threads.cpp:132               thread_data_t::trampoline(thread_data_t const*)  
  9. pthread.c:204                 __thread_entry  
  10. pthread.c:348                 pthread_create  
2.4 google提供了一個python指令碼,可以從 http://code.google.com/p/android-ndk-stacktrace-analyzer/ 下載這個python指令碼,然後使用
adb logcat -d > logfile 匯出 crash 的log,
使用 arm-eabi-objdump (位於build/prebuilt/linux-x86/arm-eabi-4.2.1/bin下面)把so或exe轉換成彙編程式碼,如:
arm-eabi-objdump -S mylib.so > mylib.asm,
然後使用指令碼
python parse_stack.py <asm-file> <logcat-file>

panic.py 需要設定環境,如下:

[python] view plain copy  print?
  1. #!/usr/bin/python
  2. # stack symbol parser
  3. import os  
  4. import string  
  5. import sys  
  6. #define android product name
  7. #ANDROID_PRODUCT_NAME = 'generic'
  8. ANDROID_PRODUCT_NAME = 'ok'
  9. ANDROID_WORKSPACE = os.getcwd()+"/"
  10. # addr2line tool path and symbol path
  11. addr2line_tool = 'arm-linux-addr2line'
  12. symbol_dir = ANDROID_WORKSPACE + '/symbols'
  13. symbol_bin = symbol_dir + '/system/bin/'
  14. symbol_lib = symbol_dir + '/system/lib/'
  15. class ReadLog:  
  16.     def __init__(self,filename):  
  17.         self.logname = filename  
  18.     def parse(self):  
  19.         f = file(self.logname,'r')  
  20.         lines = f.readlines()  
  21.         if lines != []:  
  22.             print'read file ok'
  23.         else:  
  24.             print'read file failed'
  25.         result =[]  
  26.         for line in lines:  
  27.             if line.find('stack') != -1:  
  28.                 print'stop search'
  29.                 break
  30.             elif line.find('system') != -1:  
  31.                 #print 'find one item' + line
  32.                 result.append(line)  
  33.         return result  
  34. class ParseContent:  
  35.     def __init__(self,addr,lib):  
  36.             self.address = addr # pc address
  37.             self.exename = lib  # executable or shared library
  38.     def addr2line(self):  
  39.         cmd = addr2line_tool + " -C -f -s -e " + symbol_dir + self.exename + " " + self.address  
  40.         #print cmd
  41.         stream = os.popen(cmd)  
  42.         lines = stream.readlines();  
  43.         list = map(string.strip,lines)  
  44.         return list  
  45. inputarg = sys.argv  
  46. if len(inputarg) < 2:  
  47.     print'Please input panic log'
  48.     exit()  
  49. filename = inputarg[1]  
  50. readlog = ReadLog(filename)  
  51. inputlist = readlog.parse()  
  52. for item in inputlist:  
  53.     itemsplit = item.split()  
  54.     test = ParseContent(itemsplit[-2],itemsplit[-1])  
  55.     list = test.addr2line()  
  56.     print"%-30s%s" % (list[1],list[0])  
3 出了上述系統主動輸出出錯資訊,我們還可以通過程式碼在系統不出錯的情況下,列印呼叫資訊,然後通過panic.py 列印呼叫堆疊

3.1 在cpp檔案新增如下資訊

[cpp] view plain copy  print?
  1. #include <utils/CallStack.h>
  2. ...  
  3. status_t AudioHardware::setIncallPath_l(uint32_t device) {  
  4. ...  
  5. #ifdef _ARM_
  6.     android::CallStack stack;  
  7.     stack.update(1, 100);  
  8.     stack.dump("");  
  9. #endif
  10. ...  
  11. }  
3.2 在Android.mk中,加入:
    LOCAL_CFLAGS += -D_ARM_
    LOCAL_SHARED_LIBRARIES += libutils

這樣將會列印上面所述的呼叫資訊,便於分析程式碼,debug,定位問題。

相關推薦

分析android crash log記錄實驗

2 c/c++, 通常情況下,可以通過segment fault 等錯誤即訊號 SIGSEGV(11) 做出相應處理,即設定SIGSEGV的handler呼叫libc的backtrace,即可列印對於的callback stack;定位問題所在;但在android 中, b

自編譯安卓系統分析Android核心漏洞

目標 編譯Android4.4.3-r1原始碼及核心 0x00 環境 手機環境: nexus5 + Kernel3.4.0+Android4.4.3_r1 虛擬機器編譯環境: Vmware + Ubuntu 14.04 0x01 編

Android 壓力測試 記錄bug

經高人指點,騰訊的良心之作  bugly (網站首頁  https://bugly.qq.com)  有些bug是偶爾才出現的,所以讓開發者措手不及。而bugly 可以把bug資訊和輸出的所有資訊即時傳到網上,良心之作啊  其實官網的文件寫的很清楚,但是是pdf版的  ,為

Android開發效能優化記錄、自用

雖然做Android開發已經有一段時間了,但是開發過程中經常是忙著實現功能,卻忽略了效能上的優化。以下都是來自於各位前輩的總結。特此總結記錄一下。  一、Android效能優化之佈局優化技巧 佈局優化就是用最少的view實現一樣的效果layout。最少的view也就是

【編譯原理龍書筆記】詞法分析附聯絡答案完成

這篇部落格是根據自己學習龍書的過程編寫,因為博主習慣了英語環境,在強行從英語轉化為中文的時候難免會有些不自然,請大家諒解。 感謝沉魚姐姐,很多答案都是參考了她的github,雖然無緣認識,但也算是一位領路人。 3.1 詞法分析器的作用 詞法分析

一個酷炫的button變化動畫開源庫原始碼分析Android morph Button

最近很是喜愛一些酷炫的動畫效果,特意在github上找了一些,看看他們是怎麼做到的,做個分析,順便可以對自定義控制元件和動畫有進一步的認識。 先來看下這個庫中button的變化效果是什麼樣的: 是不是很酷炫,而且中間的變化過程很舒服,沒

Android開發系列二十四:Notification的功能與使用方法

font _id when ice extends 開發 content androi mark 關於消息的提示有兩種:一種是Toast,一種就是Notification。前者維持的時間比較短暫,後者維持的時間比較長。 並且我們尋常手機的應用比方網易、貼吧等等都有非常多

android Toast大全五種情形建立屬於你自己的Toast

right 其它 activity make div ins case tco title 搬運而來,如有雷同。絕非意外! Toast用於向用戶顯示一些幫助/提示。以下我做了5中效果,來說明Toast的強大,定義一個屬於你自己的Toast。

Android學習路線二十一運用Fragment構建動態UI——創建一個Fragment

動態 app idt 文檔 部分 roi 現實 調用 android學習 你能夠把fragment看成是activity的模塊化部分。它擁有自己的生命周期,接受它自己的輸入事件,你能夠在activity執行時加入或者刪除它(有點像是一個“子activity”。你

RandomStr實驗報告驗證碼實驗

print 計算 mstr random 生成 args 字母 實驗 http 要求根據RandomStr.java:使用類型轉換生成六位驗證字符串,示例程序每次運行時,都會生成不同的字符串。實現上述用戶輸入驗證碼的功能。 信1603 20163548 馬雯秋 一、程

動手動腦&課後實驗:生成隨機數,函數的重載

input 特殊 程序 pri and new 算法 public ring 一.編寫一個方法,使用純隨機數生成算法生成指定數目(比如1000個)的隨機整數。 1.程序源代碼 import java.util.Scanner; import java.util.Rand

android things samplesample-button-master測試

key 階段 按鈕 但是 tps body post class str android things組件組裝好後,開始運行一下官方的sample。 官方sample地址 https://github.com/androidthings 從最簡單的按鈕控制led燈亮的sam

android things samplesample-tensorflow-imageclassifier測試

googl google button img .com 之前 技術分享 peak 組裝 今天來運行的是tensorflow-imageclassifier的sample。 這個sample的功能是,當led亮的時候,點擊button,進行照相,系統會對圖片進行分析,圖片中

Android開發實戰二十一:淺談android:clipChildren屬性

.cn viewpage port 部分 lap ole 有一個 默認 版本 原文:Android開發實戰(二十一):淺談android:clipChildren屬性實現功能: 1、APP主界面底部模塊欄 2、ViewPager一屏多個界面顯示 3、........

squid代理服務的ACL訪問控制、日誌分析及反向代理4.1版本

運行 部署 安裝 logs com 日誌文件 gcc 客戶端請求 inter squid代理服務的ACL訪問控制、日誌分析及反向代理 squid的ACL訪問控制列表 squid提供了強大的代理控制機制,通過合理的設置ACL(Access Control List,訪問控制列

部署AWStats日誌分析系統與優化附安裝包

服務 移動文件 samb cron 訪問權限控制 lam 環境 tab level 介紹 AWStats是使用Perl語言開發的一款開源日誌分析系統,可以分析apache,samba,vsftpd,iis等服務的日誌信息,結合crond等計劃任務,可以對不斷增長的日誌內

分塊&勢能分析!!!orz Flash!

tro rev 最小 實現 理解 同時 算法 數組 整理 掛個博客表示自己還活著 之後會弄系統總結這個就當是preview好了 分塊 數列分塊入門九題(hzwer) 入門題1,2,3,4,5,7 問題:給一段區間打上標記後單點查詢 解法:主要是每塊維護一些標記,計算答案

Android啟動頁面閃屏頁面的實現

閃屏頁面是指APP剛啟動時的頁面會自動跳轉到主頁面 單單實現閃屏頁面非常簡單。 閃屏介面的作用: 1.展示自己軟體的logo,口號標識語等, 2.作為廣告平臺,獲取利益 3.載入下一頁面(其他Activity或全域性)所需要的資料 4.檢查更新 效果展示 首先目錄

hdu-1147跨立實驗

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=1147 思路:判斷每條線段,如果將要輸入的線段和已經有的線段相交,則這條線段不算。 參考文章:https://blog.csdn.net/hexianhao/article/details/51254487

從0開始的圖形學大師5~

從0開始的圖形學大師 標籤(空格分隔):圖形學 peter Shirley <計算機圖形學> 第5章 線性代數 大學知識。 三維行列式為平行六面體體積,體積為零,共面,線性相關。 特徵向量不相等為正交。對稱矩陣特徵值是實數。 第6章 矩陣變換