Android Native Crash分析简介

背景:

支付SDK面向游戏提供支付服务,高效的游戏引擎一般都会C++编写的,通过NDK编译成so文件在Android系统上运行,
但是CP经常会在接入过程中,经常遇到因自身原因会出现NDK层的闪退(backtrace指向他们闪退的so和地址),然后CP经常会说这么一句话:

  •  “不接入你们的SDK,游戏是正常的,可能是哪里冲突了”
    

让我无言以对,好吧,下面简单说一下如何通过backtrace信息定位导致崩溃代码行

介绍:

如果还记得Android系统架构图,你可以发现Android底层是基于Linux内核的,
当 NDK 程序在发生 Crash 时,它会发出一个信号给应用程序处理,下面简单介绍一下Linux的信号机制
Linux 信号机制
信号机制是 Linux 进程间通信的一种重要方式,Linux 信号一方面用于正常的进程间通信和同步,如任务控制(SIGINT, SIGTSTP,SIGKILL, SIGSEGV……);
另一方面,它还负责监控系统异常及中断。 当应用程序运行异常时, Linux 内核将产生错误信号并通知当前进程。 当前进程在接收到该错误信号后,可以有三种不同的处理方式:
忽略该信号。

捕捉该信号并执行对应的信号处理函数(signal handler)。-------比如google的breakpad就是通过一个handler抓取dump然后保存

执行该信号的缺省操作(如 SIGSEGV, 其缺省操作是终止进程)。

当 Linux 应用程序在执行时发生严重错误,就会导致程序 crash。其中,Linux 专门提供了一类 crash 信号,在程序接收到此类信号时,缺省操作是将 crash 的现场信息记录到 core 文件,然后终止进程。
Crash 信号列表:
SIGSEGV
Invalid memory reference.

SIGBUS
Access to an undefined portion of a memory object.

SIGFPE
Arithmetic operation error, like divide by zero.

SIGILL
Illegal instruction, like execute garbage or a privileged instruction

SIGSYS
Bad system call.

SIGXCPU
CPU time limit exceeded.

SIGXFSZ
File size limit exceeded.

什么 Tombstone?

Android Native 程序本质上就是一个 Linux 程序,因此当它在执行时发生严重错误,也会导致程序 crash,然后产生一个记录 crash 的现场信息的文件,而这个文件在 Android 系统中就是 tombstone 文件。
Tombstone 英文的本意是墓碑,我觉得用这个单词来表示程序 Crash 之后产生的现场死亡信息真的再恰当不过了,tombstone 文件的确就像墓碑一样记录了死亡了的进程的基本信息(例如进程的进程号,线程号),
死亡的地址(在哪个地址上发生了 Crash),死亡时的现场是什么样的(记录了一系列的堆栈调用信息)等等。

分析:

获取Crash日志
Logcat输出:在某些手机(google nexus),会在闪退后通过logcat日志输出
tombstone 文件:在Android手机的/data/tombstones目录下,会报存进程死亡的基本信息

比如,《火柴人》Crash的时候我这边Logcat抓到的日志:
02-23 16:10:15.173: I/DEBUG(130): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0000000802-23 16:10:15.181: I/OMXCodec(135): [OMX.google.mp3.decoder] allocated buffer 0x410afee8 on input port02-23 16:10:15.181: I/OMXCodec(135): [OMX.google.mp3.decoder] allocated buffer 0x410d0768 on input port02-23 16:10:15.181: I/OMXCodec(135): [OMX.google.mp3.decoder] allocated buffer 0x410d0808 on input port02-23 16:10:15.181: I/OMXCodec(135): [OMX.google.mp3.decoder] allocated buffer 0x410d08c0 on input port02-23 16:10:15.181: I/OMXCodec(135): [OMX.google.mp3.decoder] allocating 4 buffers of size 9216 on output port02-23 16:10:15.181: I/OMXCodec(135): [OMX.google.mp3.decoder] allocated buffer 0x410d0a48 on output port02-23 16:10:15.181: I/OMXCodec(135): [OMX.google.mp3.decoder] allocated buffer 0x40061890 on output port02-23 16:10:15.181: I/OMXCodec(135): [OMX.google.mp3.decoder] allocated buffer 0x400619b0 on output port02-23 16:10:15.189: I/OMXCodec(135): [OMX.google.mp3.decoder] allocated buffer 0x40061ad8 on output port02-23 16:10:15.189: D/AudioPlayer(135): start of Playback, useOffload 002-23 16:10:16.736: I/DEBUG(130): r0 00000000 r1 65976834 r2 65976834 r3 0044256002-23 16:10:16.736: I/DEBUG(130): r4 65979cc8 r5 659cb7b0 r6 66b1d620 r7 659b96b002-23 16:10:16.736: I/DEBUG(130): r8 66b1dae8 r9 66a1ff24 sl 659d1ac0 fp 66b1dafc02-23 16:10:16.736: I/DEBUG(130): ip 00000075 sp 66b1d5c0 lr 64fdfb9b pc 6527cd76 cpsr 000f003002-23 16:10:16.736: I/DEBUG(130): d0 7275676e6265646c d1 000000000000000002-23 16:10:16.736: I/DEBUG(130): d2 0000000000000000 d3 000000000000000002-23 16:10:16.736: I/DEBUG(130): d4 ef87a4e585a3e8b2 d5 9ebfe8818de58cbc02-23 16:10:16.736: I/DEBUG(130): d6 bee585bfe5bd8ae6 d7 3f80000094bae49702-23 16:10:16.736: I/DEBUG(130): d8 0000000000000000 d9 000000000000000002-23 16:10:16.736: I/DEBUG(130): d10 0000000000000000 d11 000000000000000002-23 16:10:16.736: I/DEBUG(130): d12 0000000000000000 d13 000000000000000002-23 16:10:16.736: I/DEBUG(130): d14 0000000000000000 d15 000000000000000002-23 16:10:16.736: I/DEBUG(130): d16 3ff0000000000000 d17 3f03d92d4000000002-23 16:10:16.736: I/DEBUG(130): d18 42374876e8000000 d19 402400000000000002-23 16:10:16.736: I/DEBUG(130): d20 4023fffeb074a772 d21 412e847e0000000002-23 16:10:16.736: I/DEBUG(130): d22 3f11565ab512bf53 d23 4000ccccc400000002-23 16:10:16.736: I/DEBUG(130): d24 408f400000000000 d25 3ff000000000000002-23 16:10:16.736: I/DEBUG(130): d26 412e847e00000000 d27 4000ccccc400000002-23 16:10:16.736: I/DEBUG(130): d28 3ff0000000000000 d29 3e2d38fc57f240cc02-23 16:10:16.736: I/DEBUG(130): d30 bf984923ecc28000 d31 400000000000000002-23 16:10:16.736: I/DEBUG(130): scr 6800001002-23 16:10:16.736: I/DEBUG(130): backtrace:02-23 16:10:16.736: I/DEBUG(130): #00 pc 006cad76 /data/app-lib/com.DBGame.DiabloLOL-1/libcocos2dcpp.so (cocos2d::extension::Json_getItem(cocos2d::extension::Json, char const)+5)02-23 16:10:16.736: I/DEBUG(130): #01 pc 0042db97 /data/app-lib/com.DBGame.DiabloLOL-1/libcocos2dcpp.so (DebugLocalSys::getJsonIntById(std::string)+6)02-23 16:10:16.744: I/DEBUG(130): #02 pc 00431291 /data/app-lib/com.DBGame.DiabloLOL-1/libcocos2dcpp.so (StringJsonManager::getStringUrlWithKey(std::string const&)+96)02-23 16:10:16.744: I/DEBUG(130): stack:02-23 16:10:16.744: I/DEBUG(130): 66b1d580 655a57ab /data/app-lib/com.DBGame.DiabloLOL-1/libcocos2dcpp.so(以下省略...)

定位问题

有了日志,libcocos2dcpp.so是他们的游戏核心so,本来给到他们就可以了,但是他们又说“不接你们的SDK,游戏是正常的”,那么就来分析一下。当然,要CP提供带调试信息的so文件,即obj/local/[abi] 下面的文件。Google 在 NDK 包中为我们提供了一系列的调试工具,例如 addr2line、ndk-stack。
下面介绍一下对addr2line这个工具的用法:

  •  addr2line -e [.../obj/local/{ABI类型}/带调试信息的so文件]  [pc指针地址]  
    

这个命令会找到导致崩溃的代码行数,把导致闪退的代码行数告诉CP后,CP得到后就能比较快速的解决了。
ndk-stack的用法也十分简单:

  •  ndk-stack -sym  [.../obj/local/{ABI类型}/]   -dump crash.log 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • 所谓的界限,时间点,最后期限,珍惜当下,都是教你,生活里,学会过时不候。 朋友最近说到买一些家居用品,我一...
    娜姆阅读 528评论 0 0