分析android crash log(記錄未實驗)
-
D/CallStack( 2029): #00 pc 00008156 /system/lib/hw/audio.primary.tf4.so
- D/CallStack( 2029): #01 pc 000089e8 /system/lib/hw/audio.primary.tf4.so (android_audio_legacy::AudioHardware::AudioStreamOutALSA::setParameters(android::String const&)+139)
- D/CallStack( 2029): #02 pc 0000b2ca /system/lib/hw/audio.primary.tf4.so
-
D/CallStack( 2029): #03 pc 0003ac6a /system/lib/libaudioflinger.so (android::AudioFlinger::MixerThread::checkForNewParameters_l()+377)
- D/CallStack( 2029): #04 pc 0003960a /system/lib/libaudioflinger.so (android::AudioFlinger::PlaybackThread::threadLoop()+145)
- D/CallStack( 2029): #05 pc 00011264 /system/lib/libutils.so (android::Thread::_threadLoop(void*)+111)
- D/CallStack( 2029): #06 pc 00010dca /system/lib/libutils.so
-
D/CallStack( 2029): #07 pc 0000e3f8 /system/lib/libc.so (__thread_entry+72)
- D/CallStack( 2029): #08 pc 0000dae4 /system/lib/libc.so (pthread_create+160)
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?- D/CallStack( 2029): #00 pc 00008156 /system/lib/hw/audio.primary.tf4.so
- D/CallStack( 2029): #01 pc 000089e8 /system/lib/hw/audio.primary.tf4.so
- D/CallStack( 2029): #02 pc 0000b2ca /system/lib/hw/audio.primary.tf4.so
- D/CallStack( 2029): #03 pc 0003ac6a /system/lib/libaudioflinger.so
- D/CallStack( 2029): #04 pc 0003960a /system/lib/libaudioflinger.so
- D/CallStack( 2029): #05 pc 00011264 /system/lib/libutils.so
- D/CallStack( 2029): #06 pc 00010dca /system/lib/libutils.so
- D/CallStack( 2029): #07 pc 0000e3f8 /system/lib/libc.so
- D/CallStack( 2029): #08 pc 0000dae4 /system/lib/libc.so
[cpp] view plain copy print?
- [email protected]:/meizu/JellyBean-4.2.1/trunk/out/target/product/tf4$ ./panic.py ./backtrack/setincall_path.txt
- read file ok
- AudioHardware.cpp:829 android_audio_legacy::AudioHardware::setIncallPath_l(unsigned int)
- AudioHardware.cpp:1537 android_audio_legacy::AudioHardware::AudioStreamOutALSA::setParameters(android::String8 const&)
- audio_hw_hal.cpp:197 out_set_parametersAudioFlinger.cpp:3535 android::AudioFlinger::MixerThread::checkForNewParameters_l()
- AudioFlinger.cpp:2586 android::AudioFlinger::PlaybackThread::threadLoop()
- Threads.cpp:793 android::Thread::_threadLoop(void*)
- Threads.cpp:132 thread_data_t::trampoline(thread_data_t const*)
- pthread.c:204 __thread_entry
- pthread.c:348 pthread_create
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?- #!/usr/bin/python
- # stack symbol parser
- import os
- import string
- import sys
- #define android product name
- #ANDROID_PRODUCT_NAME = 'generic'
- ANDROID_PRODUCT_NAME = 'ok'
- ANDROID_WORKSPACE = os.getcwd()+"/"
- # addr2line tool path and symbol path
- addr2line_tool = 'arm-linux-addr2line'
- symbol_dir = ANDROID_WORKSPACE + '/symbols'
- symbol_bin = symbol_dir + '/system/bin/'
- symbol_lib = symbol_dir + '/system/lib/'
- class ReadLog:
- def __init__(self,filename):
- self.logname = filename
- def parse(self):
- f = file(self.logname,'r')
- lines = f.readlines()
- if lines != []:
- print'read file ok'
- else:
- print'read file failed'
- result =[]
- for line in lines:
- if line.find('stack') != -1:
- print'stop search'
- break
- elif line.find('system') != -1:
- #print 'find one item' + line
- result.append(line)
- return result
- class ParseContent:
- def __init__(self,addr,lib):
- self.address = addr # pc address
- self.exename = lib # executable or shared library
- def addr2line(self):
- cmd = addr2line_tool + " -C -f -s -e " + symbol_dir + self.exename + " " + self.address
- #print cmd
- stream = os.popen(cmd)
- lines = stream.readlines();
- list = map(string.strip,lines)
- return list
- inputarg = sys.argv
- if len(inputarg) < 2:
- print'Please input panic log'
- exit()
- filename = inputarg[1]
- readlog = ReadLog(filename)
- inputlist = readlog.parse()
- for item in inputlist:
- itemsplit = item.split()
- test = ParseContent(itemsplit[-2],itemsplit[-1])
- list = test.addr2line()
- print"%-30s%s" % (list[1],list[0])
3.1 在cpp檔案新增如下資訊
[cpp] view plain copy print?- #include <utils/CallStack.h>
- ...
- status_t AudioHardware::setIncallPath_l(uint32_t device) {
- ...
- #ifdef _ARM_
- android::CallStack stack;
- stack.update(1, 100);
- stack.dump("");
- #endif
- ...
- }
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 sample(sample-button-master)測試
key 階段 按鈕 但是 tps body post class str android things組件組裝好後,開始運行一下官方的sample。 官方sample地址 https://github.com/androidthings 從最簡單的按鈕控制led燈亮的sam
android things sample(sample-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章 矩陣變換