[√]android 崩溃排查

769 阅读9分钟

使用雷电模拟器的崩溃日志

06-27 17:33:42.612 3351-3351/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
06-27 17:33:42.612 3351-3351/? A/DEBUG: Build fingerprint: 'samsung/star2qltezh/star2qltechn:9/PQ3B.190801.06161913/G9650ZHU2ARC6:user/release-keys'
06-27 17:33:42.612 3351-3351/? A/DEBUG: Revision: '0'
06-27 17:33:42.612 3351-3351/? A/DEBUG: ABI: 'x86'
06-27 17:33:42.612 3351-3351/? A/DEBUG: pid: 3236, tid: 3260, name: GLThread 41  >>> com.caohua.tank5 <<<
06-27 17:33:42.612 3351-3351/? A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x8
06-27 17:33:42.612 3351-3351/? A/DEBUG: Cause: null pointer dereference
06-27 17:33:42.612 3351-3351/? A/DEBUG:     eax efb90200  ebx 0db56a50  ecx 04cd7198  edx 00000198
06-27 17:33:42.612 3351-3351/? A/DEBUG:     edi 04cd71ac  esi d5f673e4
06-27 17:33:42.612 3351-3351/? A/DEBUG:     ebp d9686000  esp d5f673d8  eip 0db56ac7
06-27 17:33:42.620 3351-3351/? A/DEBUG: backtrace:
06-27 17:33:42.620 3351-3351/? A/DEBUG:     #00 pc 008caac7  [anon:Mem_0x20000000:0d28c000]
06-27 17:33:42.868 1464-1464/? E//system/bin/tombstoned: Tombstone written to: /data/tombstones/tombstone_01

原因是空指针导致的崩溃,backtrace的信息非常少,更详细的日志写在了tombstoned

tombstones

Tombstone(墓碑)是指在Android系统中的应用程序崩溃或发生严重错误时生成的一种日志文件。这个文件包含了导致应用程序崩溃的堆栈跟踪信息以及其他相关调试信息,类似于传统操作系统中的核心转储文件。

当一个应用程序遇到严重错误时,Android系统会自动将应用程序的状态保存到一个特殊的日志文件中,这个文件通常被称为"tombstone"。该文件的命名约定通常是"tombstone_pid",其中"pid"代表进程ID。

Tombstone文件对于开发者和系统维护人员非常有用,因为它们提供了关于应用程序崩溃原因的信息,包括错误栈轨迹、内存状态和寄存器内容等。这些信息可以帮助开发者进行调试和分析,并最终解决应用程序中的问题。

没有root的手机拉取墓碑文件

adb bugreport ./1.zip

root权限

adb root
# 在正式发布(production builds)的Android设备上,adbd(Android Debug Bridge Daemon)无法以root权限运行。
# adbd cannot run as root in production builds


adb shell
suX
# /system/bin/sh: suX: not found # suX" 通常是指用于获取 root 权限的 su 命令的名称。

cocos2dx的Android writablePath

activity.getFilesDir().getAbsolutePath()

/data/user/0/com.caohua.tank5/files/7.png

activity.getFilesDir().getAbsolutePath() 是一种获取应用程序内部文件目录绝对路径的方法。在Android中,每个应用都有一个私有的内部存储区域,用于存储特定于应用的文件。

如果你在Android的Java代码中使用 activity.getFilesDir().getAbsolutePath() 这行代码,它将返回当前活动(Activity)的文件目录的绝对路径。

例如,如果你在MainActivity中调用 getFilesDir().getAbsolutePath(),它将返回类似于 /data/user/0/com.example.myapp/files 的字符串,其中 com.example.myapp 是你的应用程序的包名。

通过这个路径,你可以在应用程序的内部存储目录中创建、读取和写入文件。请注意,这个目录是应用程序私有的,其他应用程序不能直接访问其中的文件。

拉取日志

记得在本地新建一个log.txt文件

adb pull  /data/tombstones/tombstone_01 e:/log.txt
remote open failed: Permission denied # 权限不足

雷电模拟器开启root权限

image.png

Failure [INSTALL_FAILED_TEST_ONLY: installPackageLI]

使用AS自动运行时会在app\build\outputs\apk\debug文件夹下自动生成测试APK:app-debug.apk,

adb -s 192.168.1.33:6666 install -t client_tank2018-debug.apk

如果是debug,tombstone会自动解析符号地址

2023-06-28 13:40:13.051 958-1037/? D/AAL: DRECurveCalculation: BLKNUM = 16 8
2023-06-28 13:40:13.085 25519-25519/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
2023-06-28 13:40:13.085 25519-25519/? A/DEBUG: Build fingerprint: 'Redmi/begonia/begonia:11/RP1A.200720.011/V12.5.6.0.RGGCNXM:user/release-keys'
2023-06-28 13:40:13.085 25519-25519/? A/DEBUG: Revision: '0'
2023-06-28 13:40:13.085 25519-25519/? A/DEBUG: ABI: 'arm'
2023-06-28 13:40:13.086 25519-25519/? A/DEBUG: Timestamp: 2023-06-28 13:40:13+0800
2023-06-28 13:40:13.086 25519-25519/? A/DEBUG: pid: 24908, tid: 25103, name: GLThread 3970  >>> com.caohua.tank5 <<<
2023-06-28 13:40:13.086 25519-25519/? A/DEBUG: uid: 10683
2023-06-28 13:40:13.086 25519-25519/? A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x8
2023-06-28 13:40:13.086 25519-25519/? A/DEBUG: Cause: null pointer dereference
2023-06-28 13:40:13.086 25519-25519/? A/DEBUG:     r0  d58b0700  r1  b4be9c68  r2  00000000  r3  00000000
2023-06-28 13:40:13.087 25519-25519/? A/DEBUG:     r4  c34ba7b0  r5  c34ba7b0  r6  c58e72cc  r7  c58e7d20
2023-06-28 13:40:13.087 25519-25519/? A/DEBUG:     r8  c58e71c0  r9  b3d795b8  r10 b3d79658  r11 c3fc82f4
2023-06-28 13:40:13.087 25519-25519/? A/DEBUG:     ip  f203cd28  sp  c3fc82e8  lr  c2a303fc  pc  c2a328bc
2023-06-28 13:40:13.110 25519-25519/? A/DEBUG: backtrace:
2023-06-28 13:40:13.110 25519-25519/? A/DEBUG:       #00 pc 01af18bc  /data/app/~~d59rE-S_fPA-H35nINL-Eg==/com.caohua.tank5-UuvUKfjmvb4VWf2JTLZJBQ==/lib/arm/libcocos2dlua.so (cocos2d::TextureCache::updateTex(cocos2d::TexInfo*)+112) (BuildId: 615fea86dbd6026e7ee929f87835acdc828c2773)
2023-06-28 13:40:13.110 25519-25519/? A/DEBUG:       #01 pc 01aef3f8  /data/app/~~d59rE-S_fPA-H35nINL-Eg==/com.caohua.tank5-UuvUKfjmvb4VWf2JTLZJBQ==/lib/arm/libcocos2dlua.so (cocos2d::TextureCache::addImage(std::string const&, bool)+360) (BuildId: 615fea86dbd6026e7ee929f87835acdc828c2773)
2023-06-28 13:40:13.110 25519-25519/? A/DEBUG:       #02 pc 0194ccfc  /data/app/~~d59rE-S_fPA-H35nINL-Eg==/com.caohua.tank5-UuvUKfjmvb4VWf2JTLZJBQ==/lib/arm/libcocos2dlua.so (cocos2d::SpriteFrameCache::addSpriteFramesWithDictionary(std::unordered_map<std::string, cocos2d::Value, std::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<std::string const, cocos2d::Value> > >&, std::string const&)+1608) (BuildId: 615fea86dbd6026e7ee929f87835acdc828c2773)
2023-06-28 13:40:13.110 25519-25519/? A/DEBUG:       #03 pc 0194d304  /data/app/~~d59rE-S_fPA-H35nINL-Eg==/com.caohua.tank5-UuvUKfjmvb4VWf2JTLZJBQ==/lib/arm/libcocos2dlua.so (cocos2d::SpriteFrameCache::addSpriteFramesWithFile(std::string const&, std::string const&)+460) (BuildId: 615fea86dbd6026e7ee929f87835acdc828c2773)
2023-06-28 13:40:13.110 25519-25519/? A/DEBUG:       #04 pc 00deb858  /data/app/~~d59rE-S_fPA-H35nINL-Eg==/com.caohua.tank5-UuvUKfjmvb4VWf2JTLZJBQ==/lib/arm/libcocos2dlua.so (lua_cocos2dx_SpriteFrameCache_addSpriteFramesWithFile(lua_State*)+488) (BuildId: 615fea86dbd6026e7ee929f87835acdc828c2773)
2023-06-28 13:40:13.110 25519-25519/? A/DEBUG:       #05 pc 01348b3c  /data/app/~~d59rE-S_fPA-H35nINL-Eg==/com.caohua.tank5-UuvUKfjmvb4VWf2JTLZJBQ==/lib/arm/libcocos2dlua.so (BuildId: 615fea86dbd6026e7ee929f87835acdc828c2773)
2023-06-28 13:40:13.110 25519-25519/? A/DEBUG:       #06 pc 0133b5c5  /data/app/~~d59rE-S_fPA-H35nINL-Eg==/com.caohua.tank5-UuvUKfjmvb4VWf2JTLZJBQ==/lib/arm/libcocos2dlua.so (lua_pcall+20) (BuildId: 615fea86dbd6026e7ee929f87835acdc828c2773)
2023-06-28 13:40:13.102 958-1037/? I/chatty: uid=1000(system) AALMain identical 3 lines
2023-06-28 13:40:13.118 958-1037/? D/AAL: DRECurveCalc
  • #00:表示当前堆栈帧的索引。这是最顶层的帧,也就是产生错误的位置。
  • pc:表示程序计数器(program counter)寄存器的值,即当前执行的指令地址。
  • 01af18bc:对应的十六进制值,表示代码中的偏移地址。这里是 libcocos2dlua.so 库中 TextureCache::updateTex(cocos2d::TexInfo*) 函数的地址。
  • /data/app/~~u0cw6VTEcvvVwuilHTgrXA==/com.caohua.tank5-oVeVZMdHoyTINDKDKL8N0A==/lib/arm/libcocos2dlua.so:显示出错的动态链接库(Shared Library)的文件路径。在这个例子中,显示的是 libcocos2dlua.so 库的路径。
  • (cocos2d::TextureCache::updateTex(cocos2d::TexInfo*)+112):表明具体发生错误的函数名称,即 TextureCache::updateTex(cocos2d::TexInfo*),并且在该函数内部的偏移量是 112。
  • (BuildId: 615fea86dbd6026e7ee929f87835acdc828c2773):显示库的构建 ID,用于标识特定版本的库。