深度解读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虚拟机出现了异常,不是非常好确定。

相关推荐
Shi_haoliu6 小时前
openClaw源码部署-linux
前端·python·ai·openclaw
程序员小寒7 小时前
前端性能优化之白屏、卡顿指标和网络环境采集篇
前端·javascript·网络·性能优化
烛阴7 小时前
Claude CLI AskUserQuestion 工具详解:让 AI 开口问你
前端·claude
wal13145207 小时前
OpenClaw教程(九)—— 彻底告别!OpenClaw 卸载不残留指南
前端·网络·人工智能·chrome·安全·openclaw
mon_star°8 小时前
在TypeScript中,接口MenuItem定义中,为什么有的属性带问号?,有的不带呢?
前端
牛奶8 小时前
分享一个开源项目,让 AI 辅助开发真正高效起来
前端·人工智能·全栈
次顶级8 小时前
表单多文件上传和其他参数处理
前端·javascript·html
why技术9 小时前
我拿到了腾讯QClaw的内测码,然后沉默了。
前端·后端
谪星·阿凯10 小时前
XSS漏洞解析博客
前端·web安全·xss