Android Crash之Native Crash分析

前言

上一篇給大家介紹了Android Crash中的Java Crash分析狱掂,我們可以知道Java Crash一般會(huì)彈出提示框告訴我們程序崩潰了演痒,通常使用Crash工具都能夠捕獲到;本篇博客來談?wù)勅绾吾槍?duì)Native Crash進(jìn)行分析趋惨,它相對(duì)與Java層面的Crash有什么特點(diǎn)鸟顺?如何判斷程序Crash是因?yàn)镹ative層導(dǎo)致的?我們?cè)趺慈シ治鏊飨海肯旅嫖覀円粋€(gè)一個(gè)解答這些問題讯嫂。

Native Crash在Android上的特點(diǎn)

  • 出錯(cuò)時(shí)界面不會(huì)彈出提示框提醒程序崩潰(Android 5.0以下)
  • 出錯(cuò)時(shí)會(huì)彈出提示框提醒程序崩潰(Android 5.0以上)
  • 程序會(huì)直接閃退到系統(tǒng)桌面
  • 這類錯(cuò)誤一般是由C++層代碼錯(cuò)誤引起的
  • 絕大部分Crash工具不能夠捕獲

我們?cè)趯?shí)際Android開發(fā)的時(shí)候,可能會(huì)引入第三方的一些so庫或者自己開發(fā)相應(yīng)的so庫供程序使用兆沙,然而so庫一般是通過c或者c++開發(fā)的欧芽。Android開發(fā)者通過java層的JNI機(jī)制調(diào)用Native語言寫的函數(shù),然而Natice語言也可以調(diào)用java層的函數(shù)葛圃。 如果有同學(xué)不明白的話千扔,建議先去了解下JNI的相應(yīng)技術(shù),總的來說通過JNI技術(shù)库正,就讓我們讓Java世界跟Native世界可以聯(lián)系在一起曲楚,也因?yàn)檫@個(gè)特性,讓Java具有跨平臺(tái)的特性褥符。

如果想了解如何通過Android Studio制作so庫龙誊,這篇文章可以幫到你:http://blog.csdn.net/wwj_748/article/details/51274580

Native Crash是如何產(chǎn)生的?

上一節(jié)我們談到so庫是同通過Native語言開發(fā)的喷楣,自然在Android中使用so庫的時(shí)候發(fā)生的Crash趟大,就是我們所說的Native Crash鹤树。為了更好的讓大家知道Native Crash是如何產(chǎn)生的,下面筆者舉一個(gè)例子:
Java層定義Native方法

本地方法跟普通的Java方法的區(qū)別在于方法聲明多了native關(guān)鍵字护昧。

JNI層實(shí)現(xiàn)Native方法

這里我們制造一個(gè)Native Crash魂迄,空指針異常。

通過Java調(diào)用Native方法

要調(diào)用Native方法需要先加載我們開發(fā)好的so庫惋耙,通過System.loadLibrary(“so名字”);來調(diào)用捣炬,然后在通過java調(diào)用聲明的native方法。

Native Crash如何分析绽榛?

既然要分析就必須找到可以分析的東西湿酸,我們?cè)诜治鯦ava層Crash的時(shí)候是通過logcat日志找到對(duì)應(yīng)的出錯(cuò)代碼,然而Native層Crash也是可以logcat日志來進(jìn)行分析的灭美。

這里我們截取上面制造的crash在logcat顯示的日志:

這個(gè)是什么鬼推溃,看不懂啊有木有。這個(gè)出錯(cuò)信息是我們調(diào)用native函數(shù)時(shí)打印出來的日志届腐,只是簡(jiǎn)單的描述出錯(cuò)信號(hào)铁坎,出錯(cuò)地址還有進(jìn)程號(hào),看這個(gè)是完全摸不著調(diào)的犁苏。不過系統(tǒng)還是會(huì)提供相關(guān)有用的日志硬萍,我們?cè)贏ndroid Studio查看logcat的時(shí)候需要做一下過濾。

在logcat添加完”DEBUG”的過濾項(xiàng)之后围详,我們就能得到以下log:

這下子可分析的內(nèi)容就多起來了朴乖,我們逐個(gè)來看看:

  • 進(jìn)程信息:pid表示進(jìn)程號(hào),tid表示線程號(hào)助赞,name表示進(jìn)程名
  • 錯(cuò)誤信號(hào):signal 11表示信號(hào)的數(shù)字买羞,SIGSEGV表示信號(hào)的名字,code 1(SEGV_MAPERR)表示出錯(cuò)代碼雹食,fault addr 00000000 表示出錯(cuò)的地址畜普。
  • 寄存器快照:進(jìn)程收到錯(cuò)誤信號(hào)時(shí)保存下來的寄存器快照,一共有15個(gè)寄存器群叶。
  • 堆棧信息:##00表示棧頂漠嵌,##01調(diào)用#00,以此往下都是嵌套的調(diào)用關(guān)系盖呼,直至到棧頂。

這里參考了:
http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=27&extra=page=4

我們?cè)跅m斁鸵呀?jīng)看到我們出錯(cuò)的地方了:

#00 pc 00000730 /data/app-lib/com.devilwwj.jnidemo-1/libJNIDemo.so (Java_com_devilwwj_jnidemo_TestJNI_createANativeCrash)

pc 00000730 表示出錯(cuò)的地址化撕,后面可以看到我加載了libJNIDemo.so庫几晤,接著是我們前面聲明的Native方法,通過這種方法我們就能準(zhǔn)確的找到出錯(cuò)的地方植阴。

從上面的分析我們可以看到蟹瘾,so庫崩潰時(shí)會(huì)產(chǎn)生信號(hào)異常圾浅,如果我們能夠捕獲到信號(hào)異常,相當(dāng)于我們也能夠顧捕獲到Android Native崩潰了憾朴。

總結(jié)

關(guān)于Native Crash的特點(diǎn)狸捕、產(chǎn)生原因、分析過程已經(jīng)給大家做了簡(jiǎn)單的分析众雷,這一塊內(nèi)容是初學(xué)者在分析錯(cuò)誤的時(shí)候最頭痛的地方灸拍,因?yàn)樗恢廊绾蜗率郑蚕Mㄟ^這篇文章能幫助到大家對(duì)Native Crash分析有個(gè)初步的認(rèn)識(shí)砾省,關(guān)于這一塊還有很多東西可以講鸡岗,比如具體的signal有哪些,Linux下的信號(hào)機(jī)制是怎樣的编兄,怎樣才能夠捕獲到信號(hào)等等轩性,關(guān)于Native層的Crash捕獲,我們有沒有第三方的開發(fā)工具能幫助到我們狠鸳,這里就要隆重推薦大家使用Bugly揣苏,可以說是業(yè)內(nèi)領(lǐng)先的崩潰捕獲工具,不僅能夠幫助我們獲取到完整的錯(cuò)誤堆棧件舵,還能夠?qū)⒊鲥e(cuò)的上下文環(huán)境參數(shù)(比如系統(tǒng)版本卸察、設(shè)備信息、內(nèi)存信息等)詳細(xì)的展現(xiàn)出來芦圾,大家不妨可以嘗試下蛾派。最后,感謝大家的閱讀个少。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末洪乍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子夜焦,更是在濱河造成了極大的恐慌壳澳,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茫经,死亡現(xiàn)場(chǎng)離奇詭異巷波,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)卸伞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門抹镊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人荤傲,你說我怎么就攤上這事垮耳。” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵终佛,是天一觀的道長俊嗽。 經(jīng)常有香客問我,道長铃彰,這世上最難降的妖魔是什么绍豁? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮牙捉,結(jié)果婚禮上竹揍,老公的妹妹穿的比我還像新娘。我一直安慰自己鹃共,他們只是感情好鬼佣,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著霜浴,像睡著了一般晶衷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上阴孟,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天晌纫,我揣著相機(jī)與錄音,去河邊找鬼永丝。 笑死锹漱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的慕嚷。 我是一名探鬼主播哥牍,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼喝检!你這毒婦竟也來了嗅辣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤挠说,失蹤者是張志新(化名)和其女友劉穎澡谭,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體损俭,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蛙奖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了杆兵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雁仲。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖琐脏,靈堂內(nèi)的尸體忽然破棺而出攒砖,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布祭衩,位于F島的核電站,受9級(jí)特大地震影響阅签,放射性物質(zhì)發(fā)生泄漏掐暮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一政钟、第九天 我趴在偏房一處隱蔽的房頂上張望路克。 院中可真熱鬧,春花似錦养交、人聲如沸精算。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽灰羽。三九已至,卻和暖如春鱼辙,著一層夾襖步出監(jiān)牢的瞬間廉嚼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來泰國打工倒戏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留怠噪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓杜跷,卻偏偏與公主長得像傍念,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子葛闷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 前言 上一篇給大家介紹了Android Crash中的Java Crash分析憋槐,我們可以知道Java Crash一...
    IT_xiao小巫閱讀 11,354評(píng)論 2 25
  • 前言 小巫最近由于工作原因面臨技術(shù)轉(zhuǎn)型,從一個(gè)App開發(fā)者轉(zhuǎn)變?yōu)镾DK開發(fā)者孵运,這兩者的區(qū)別是非常明顯的秦陋,從用戶角度...
    IT_xiao小巫閱讀 6,473評(píng)論 2 7
  • 什么是Crash? 想必這個(gè)只要從事過編程工作的同學(xué)一定知道是什么治笨?這里我們進(jìn)行一些概念上的普及: Android...
    愛情小傻蛋閱讀 845評(píng)論 0 0
  • 用兩張圖告訴你驳概,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 12,704評(píng)論 2 59
  • 一般應(yīng)用在運(yùn)行時(shí)旷赖,不可避免的會(huì)發(fā)生crash顺又。一般應(yīng)用crash分為三種:未捕獲的異常、ANR(Applicati...
    瀟瀟鳳兒閱讀 25,869評(píng)論 1 25