Linux开发coredump文件分析实战分享

作者: 良知犹存

前言:

coredump 分析是嵌入式linux开发中经常使用的方法,们也可以经常看到相关的使用教程,但是网上很少有一个多线程应用coredump文件的分析过程介绍,今天来分享一下自己实际使用中一些案例,来给大家进行一下分享,受限于代码和篇幅。此处只描述一些认为比较有特色的问题,工作中遇到很多的coredump文件都可以用这些框架思维去解决。

作者:良知犹存

转载授权以及围观:欢迎关注微信公众号:羽林君

或者添加作者个人微信:become_me


情节介绍:

在调试一个功能时候,产生了一些coredump文件 正好出现了不一样的程序报错的情况 ,正好借这个机会给大家分享一下。一般coredump文件产生的原因有空指针、数组越界、多线程多次释放、堆栈溢出等等。这里就是按照自己遇到的情况,找了一些比较有代表性的给大家做一个简单的分享。

首先们对应调试的话 使用gdb调试 先得熟悉一下gdb调试的各个命令,以下两篇文章是之前进行gdb工作的描述,

一文入门Linux下gdb调试(一)

一文入门Linux下gdb调试(二)

所以本文就不多做赘述,只进行对应coredump文件分析时候,们需要进行查看分析的实战。

首先们用带有debug信息的可执行文件进行调试

gdb executable_file coredump_file

示例一:指针初始化失败 {示例一:指针初始化失败}

进入之后第一件事情就是 使用 bt命令查看堆栈信息

在这个coredump文件中,们很容易看到一个函数的传入地址和类成员函数有明显的数据区别。如此明显的部分们就可以直接下定论之后,进行细节查看。

f  n 

通过帧编号来选择帧,帧编号可以通过 bt 命令来查看。

们查看对应的第 17帧的堆栈信息

通过上面截图们可以看到在第17帧中 this这个类实体化的地址出现了问题。

为了对比们又查看了对应20帧的堆栈信息以及对应帧的详细信息

然后们需要确认该指针是什么什么出现问题的,进行第20帧数据的详细查看。其中们用p命令查看该类下面的对应的和17帧this的关系,确认gyro_在这个函数执行的时候,地址是否正确。

从上面来看在此处函数执行的时候,对应的gyro的地址还没有变成错误的0x1388。

从这里们基本可以确认到,函数从 第20帧对应位置执行之后再到17帧的函数的时候,执行函数的地址发生了改变 然后开始进入校对代码的环节。

这个时候校对不是看代码执行的具体情况,因为发生问题的部分已经是被修改了指针地址。所以们需要从全局去看这个实体类被进行实体化和释放操作的地方。

最终找到了一个出现线程调用先后顺序导致变量没有准备好,出现的死机情况。

示例二:另一个指针问题 {示例二:另一个指针问题}

进入之后第一件事情 使用 bt命令查看堆栈信息

这个coredump文件在使用bt命令之后发现 此处的堆栈信息看上去都很正常,无法显示出代码在哪里了出现了问题。

这个时候们就要考虑多线程时候,堆栈信息不一定直接捕获到对应线程,们需要打开所有线程里面的堆栈信息。

thread apply all bt

除了bt大家也可以打印自己需要的其他信息

thread apply all command //所有线程都执行命令

对应打印出所有线程的堆栈信息之后,们就进行一点点查看,但是如果你的代码定义了 信号处理函数,例如使用了 handle_exit进行处理,然后就在所有线程堆栈信息里面去搜索对应最后面信号处理的函数,再往回查看程序执行的过程。

此时们发现led一个实体化类的的初始地址出现了问题,最后校验代码,发现了这个bug。

示例三:内存溢出 {示例三:内存溢出}

进入之后第一件事情 使用 bt命令查看堆栈信息

此时发现当前堆栈信息也无法进行定位到问题。

然后们使用了thread apply all bt 但是第一遍们没有看到对应的hand_exit函数

然后们使用 info locals查看一下保存的本地变量的信息

info f addr打印通过addr指定帧的信息。
info args打印函数变量的值。

info locals 打印本地变量的信息。

info catch打印出当前的函数中的异常处理信息。

本地变量也没有一些明显表示出指针错误、数据越界的一些显示。

所以 们又使用 p 指令打印帧信息里面保存的变量信息。

通过打印这些们认为出错率比较高的变量信息,可以辅助们进行判断。不过本次打印也没办法确认到问题位置。

然后们重新看全部线程的堆栈信息。最终看到了一个异常的参数,这个值很大,有些异常。

紧接着们进行查看对应的源码位置,因为是C++的库,所以们直接看编译位置的代码。

先看 第7 帧 信息显示的stl_algobase.h:465

打开对应的代码位置之后发现__n参数 是进行分配空间的数量的参数。

再次查看执行前后的 stl_vector.h:343

而现在传入的__n大约是大于亿的单位值,而代码实际工作的位置是不需要这么大的空间分配的。所以确认是此处有问题,对照代码执行的位置以及对应变量的全局使用情况,最后基本定性为队列在多线程使用中,锁没有使用好,导致多个线程在极端情况下,输出和输入操作会对同一个区域进行,导致了此次代码死机。

结语

这就是分享的项目中分析coredump文件的情况,如果大家有更好的想法和需求,也欢迎大家加好友交流分享哈。

此外除了文中使用的这些命令,大家也可以辅助gbd调试的更多命令来检查们coredump文件。例如查看汇编代码等等。网上关于gdb调试命令的文章还是有很多,大家也可以辅助看其他文章命令使用。


作者:良知犹存,白天努力工作,晚上原创公号号主。公众号内容除了技术还有些人生感悟,一个认真输出内容的职场老司机,也是一个技术之外丰富生活的人,摄影、音乐 and 篮球。关注,与一起同行。

                              ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧  END  ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧

推荐阅读

【1】在球场上向人民币玩家低了头

【2】嵌入式底层开发的软件框架简述

【3】CPU中的程序是怎么运行起来的 必读

【4】cartographer环境建立以及建图测试

【5】设计模式之简单工厂模式、工厂模式、抽象工厂模式的对比

本公众号全部原创干货已整理成一个目录,回复[ 资源 ]即可获得。

原文作者:良知犹存

原文链接:https://www.cnblogs.com/conscience-remain/p/15389727.html

更多推荐

更多
  • Linux二进制-一、Linux 环境及其工具 Linux 工具,有用的设备和文件,与连接器相关的环境点,GDB,Objdump from GNU binutils,Objcopy from GNU binutils,strace,追踪,基本 ltrace 命令,ftrace,rea
    Apache CN

  • Linux二进制-零、前言 这本书的内容,你需要什么来写这本书,这本书是写给谁的,约定,读者反馈,客户支持,示例代码下载,勘误表,盗版,问题, 软件工程是创造一项在微处理器上存在、存在和呼吸的发明。 我们称之为程序。 逆向工程的行为发现这个项目如何生活和呼吸,而且
    Apache CN

  • Linux二进制-二、ELF 二进制格式 ELF 文件类型,ELF 程序头文件,ELF 节标题,精灵符号,ELF 重置,ELF 动态链接,编写 ELF 解析器,pt_load,PT_DYNAMICPhdr 为动态段,pt_note,pt_interp,PT_PHDR,文本部
    Apache CN

  • Linux二进制-五、Linux 二进制程序保护 ELF 二进制封隔器哑保护,存根机制和用户域执行,由保护根执行的其他工作,已有的 ELF 二进制保护,下载 maya 保护的二进制文件,反调试二进制保护,抗仿真,模糊处理方法,保护控制流的完整性,其他资源,保护器的一个例子,DacryF
    Apache CN

  • Linux二进制-九、Linux `/proc/kcore`分析 九、Linux /proc/kcore分析Linux 内核取证和 rootkit,普通 vmlinux 没有符号,/proc/kcore 和 GDB 探索,直接修改 sys_call_table,Kprobe rootkits,VFS
    Apache CN

  • Linux二进制-三、Linux 进程跟踪 ptrace 的重要性,进程寄存器状态和标志,一个简单的基于实践的调试器,一个简单的 ptrace 调试器,具有进程附加功能,高级功能跟踪软件,ptrace 和法医学分析,处理图像重建从内存到可执行文件,简单的例子并不总是那么微不足道,
    Apache CN

  • 四、ELF 病毒技术——Linux/Unix 病毒 ELF 病毒技术,ELF 病毒工程挑战,ELF 病毒寄生虫感染方法,PT_NOTE 到 PT_LOAD 转换感染方法,感染控制流程,ELF 防调试和包装技术,ELF 病毒检测及消毒,寄生代码必须是自包含的,字符串存储的复杂性,寻找存储寄
    Apache CN

  • Linux二进制-七、进程内存取证 流程是什么样子的?,进程内存感染,Linux ELF 核心文件,可执行内存映射,程序堆,共享库映射,堆栈、vdso 和 vsycall,进程感染工具,工艺感染技术,Azazel userland rootkit 检测,进程地址空间的映射
    Apache CN

  • Linux二进制-八、扩展核心文件快照技术 历史,ECFS 理念,ECFS 入门,libecfs 用于解析 ECFS 文件的库,readecfs,使用 ECFS 检查受感染的进程,ECFS 参考指南,使用 ECFS 处理巫术,了解更多有关 ECFS,将 ECFS 插入核心处理器,
    Apache CN

  • Linux二进制-六、Linux 中的 ELF 二进制取证 检测入口点修改的科学,检测其他形式的控制流劫持,寄生虫代码特征识别,识别反向文本填充感染,识别文本段填充感染,标识受保护的二进制文件,IDA Pro,正在修补。ctors/。 init_array 节,检测 PLT/GOT 挂钩,检测蹦
    Apache CN

  • 近期文章

    更多
    文章目录

      推荐作者

      更多