深度解读Android崩溃日志案例分析2:tombstone日志

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 深度解读Android崩溃日志案例分析2:tombstone日志

这个案例是从tombstone入手,进行了crash日志分析,tombstone一般在开头,都会阐明崩溃的大致问题,一般来说空指针类型的崩溃是最容易通过ida、addr2line、objdump找到相关代码的。

崩溃现场

tombstone墓碑文件日志提示崩溃的地址0x835be0

yaml
复制代码
pid: 3382, tid: 3821, name: dTi  >>> com.xx.xx.xx <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x835be0
    rax 00000000000000e1  rbx 00007fff6ef15d78  rcx 00000000000003d0  rdx 00007fff6ef15d80
    r8  00007fff6ef15d80  r9  00007fff50295a68  r10 00007fff6f16c940  r11 0000000000000055
    r12 000000000000004b  r13 0000000000000e10  r14 0000000000835be0  r15 0000000000836000
    rdi 0000000000835be0  rsi 00000000052a85ec
    rbp 0000000000835000  rsp 00007fff502958d0  rip 00007fff6eb8bb2d

iad加载so文件,然后打开hex dump视图

image.png

在hex dump视图下,我们跳转到0x835be0

image.png

image.png

再按下快捷键F5

image.png

此时就会生成该地址对应的C语言伪代码,提示崩溃的代码是在第11行

image.png

而add2line给出的位置是,基本正确,伪代码和源码只是写法不一样而已,逻辑都一样

image.png

这个函数对应的lua binding逻辑是

c++
复制代码
int lua_register_cocos2dx_studio_VisibleFrame(lua_State* tolua_S)
{
    tolua_usertype(tolua_S,"ccs.VisibleFrame");
    tolua_cclass(tolua_S,"VisibleFrame","ccs.VisibleFrame","ccs.Frame",nullptr);
    tolua_beginmodule(tolua_S,"VisibleFrame");
        tolua_function(tolua_S,"new",lua_cocos2dx_studio_VisibleFrame_constructor);
         // 这个函数
        tolua_function(tolua_S,"isVisible",lua_cocos2dx_studio_VisibleFrame_isVisible); 
        tolua_function(tolua_S,"setVisible",lua_cocos2dx_studio_VisibleFrame_setVisible);
        tolua_function(tolua_S,"create", lua_cocos2dx_studio_VisibleFrame_create);
    tolua_endmodule(tolua_S);
    std::string typeName = typeid(cocostudio::timeline::VisibleFrame).name();
    g_luaType[typeName] = "ccs.VisibleFrame";
    g_typeCast["VisibleFrame"] = "ccs.VisibleFrame";
    return 1;
}

对应的lua代码就是

复制代码

ccs.VisibleFrame.setVisible

rdi和地址一样,那么就是第一个参数的问题

参数

如果能够得到崩溃时的堆栈参数信息,对排查这个问题也非常有帮助。

当参数少于7个时, 参数从左到右放入寄存器:

rdi, rsi, rdx, rcx, r8, r9。

当参数为7个以上时, 前 6 个与前面一样, 但后面的依次从右向左 放入中,即和32位汇编一样。

参数个数大于 7 个的时候

H(a, b, c, d, e, f, g, h);

  • a->%rdi
  • b->%rsi
  • c->%rdx
  • d->%rcx
  • e->%r8
  • f->%r9
  • h->8(%esp)
  • g->(%esp)
  • call H



相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
13天前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
21天前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
46 15
Android 系统缓存扫描与清理方法分析
|
22天前
|
存储 Java Android开发
Android|记一个导致 logback 无法输出日志的问题
在给一个 Android 项目添加 logback 日志框架时,遇到一个导致无法正常输出日志的问题,这里记录一下。
23 2
|
22天前
|
Java 程序员 API
Android|集成 slf4j + logback 作为日志框架
做个简单改造,统一 Android APP 和 Java 后端项目打印日志的体验。
86 1
|
1月前
|
存储 Linux Android开发
Android底层:通熟易懂分析binder:1.binder准备工作
本文详细介绍了Android Binder机制的准备工作,包括打开Binder驱动、内存映射(mmap)、启动Binder主线程等内容。通过分析系统调用和进程与驱动层的通信,解释了Binder如何实现进程间通信。文章还探讨了Binder主线程的启动流程及其在进程通信中的作用,最后总结了Binder准备工作的调用时机和重要性。
Android底层:通熟易懂分析binder:1.binder准备工作
|
1月前
|
存储 数据可视化 安全
一个简单案例,带你看懂GC日志!
一个简单案例,带你看懂GC日志!
一个简单案例,带你看懂GC日志!
|
2月前
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:技术深度分析与实践建议
本文旨在深入探讨并比较Android和iOS两大移动操作系统在安全性方面的不同之处。通过详细的技术分析,揭示两者在架构设计、权限管理、应用生态及更新机制等方面的安全特性。同时,针对这些差异提出针对性的实践建议,旨在为开发者和用户提供增强移动设备安全性的参考。
136 3
|
1月前
|
开发工具 Android开发 Swift
安卓与iOS开发环境的差异性分析
【10月更文挑战第8天】 本文旨在探讨Android和iOS两大移动操作系统在开发环境上的不同,包括开发语言、工具、平台特性等方面。通过对这些差异性的分析,帮助开发者更好地理解两大平台,以便在项目开发中做出更合适的技术选择。
|
2月前
|
安全 Linux Android开发
探索安卓与iOS的安全性差异:技术深度分析
本文深入探讨了安卓(Android)和iOS两个主流操作系统平台在安全性方面的不同之处。通过比较它们在架构设计、系统更新机制、应用程序生态和隐私保护策略等方面的差异,揭示了每个平台独特的安全优势及潜在风险。此外,文章还讨论了用户在使用这些设备时可以采取的一些最佳实践,以增强个人数据的安全。
|
12天前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
119 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板