深度解读Android崩溃日志案例分析1:so崩溃

crash log

bugly上报的日志如下,方便观察我换行整理了下:

通过addr2line/objdump定位函数基址

提示是_Z26lua_cocos2dx_Node_addChildP9lua_State函数的问题,通过addr2line,可以得到0x7577cc对应的地方的确是addChild逻辑

从objdump的反汇编中找到addChild的相关调用,注意这里都是基址+偏移,类似if/goto/break/continue反汇编之后会变成这样的反汇编代码

所以我们可以通过左边减右边就是addChild的基址

实际计算也验证了这个逻辑:

7698040=0x757678,就是addChild的基址。

通过ida定位函数基址

这种方式需要我们知道函数的签名,才能定位。

_Z26lua_cocos2dx_Node_addChildP9lua_State这个是编译器对函数的签名。

在ida的Disassemyly窗口中

我们使用jump to address

当然你也可以使用快捷键G打开下边的面板

这里我们输入_Z26lua_cocos2dx_Node_addChildP9lua_State,如果成功,ida会跳转到这个函数定义的位置

注意左侧的地址,ida会详细的展示这个函数的细节信息。

函数基址为0x757678,和我们通过objdump算出来的基址是一致的。

通过偏移精确定位代码位置

看到bugly提示偏移为340

通过手动计算0x757678+0x340=0x7579b8,从objdump的结果中也能看到对应的反汇编代码,执行到str处崩溃的

在ida中更方便,我们可以直接输入

ida会自动跳转到计算后的位置

这两种方式结果是一致的,在ida中按下F5

得到的对应反汇编代码为:

观察反汇编,所以问题应该出在4364行,比addr2line的结果更加精细

c++ 复制代码
template <class T>
bool luaval_to_object(lua_State* L, int lo, const char* type, T** ret, const char* funcName = "")
{
    if(nullptr == L || lua_gettop(L) < lo) // 对应的源码
        return false;

    if (!luaval_is_usertype(L, lo, type, 0))
        return false;

    *ret = static_cast<T*>(tolua_tousertype(L, lo, 0));

    if (nullptr == *ret){
        CCLOG("Warning: %s argument %d is invalid native object(nullptr)", funcName, lo);
        logLuaCallStack(L);
    }

    return true;
}

至此这个问题追查到这里,都是一些非常基础的底层实现,如果还没有答案,那么这个问题多半就不太好解决了,有可能跟多线程有关系,也有可能lua虚拟机出现了异常,不是非常好确定。

相关推荐
a努力。6 小时前
Context-State-Memory三重信息架构揭秘
java·服务器·前端
颜进强6 小时前
23 · NestJs ModuleRef 模块引用:容器递给你的"取货窗口",四个 API 四种语义
前端·后端·ai编程
码林鼠6 小时前
dart语言教学
前端
光影少年6 小时前
如果 React 组件的属性没有传值,它的默认值是什么?
前端·javascript·react.js
风骏时光牛马7 小时前
AI_Coding:智能代码生成与工程实践
前端
颜进强7 小时前
22 · NestJs InjectionScopes 注入作用域:默认单例不是偷懒,是最优——以及何时才该打破
前端·后端·ai编程
liangshanbo12157 小时前
Web Worker 在 AI 前端应用中有什么具体使用场景?
前端·人工智能
拖孩7 小时前
一个全程 AI 写的小程序「厨菜记」,上线 20 天跑通流量主,收入几块钱,开心得不行
前端·后端·微信小程序
颜进强7 小时前
21 · NestJs AsyncProviders 异步提供者:useFactory 返回 Promise 之后,容器发生了什么
前端·后端·ai编程
莪_幻尘8 小时前
Agent 体检:乱编、连锁、失忆,给 Agent 做一次五维体检
前端·人工智能·agent