目录标题

  • 前言
  • core dump
    • 开启core dump
  • backtrace
    • 静态库
    • 动态库
  • 最后补充几句

前言

linux 程序崩溃,如果能根据已有的插桩日志能排查出来自然好,但是往往日志未全覆盖,这时候大海捞针排查起来还是比较麻烦的。
一般来说有以下这几种方法获取崩溃现场数据。

core dump

core dump是linux原生自带的一个异常分析工具,当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中。注意程序编译 需要带 -g。

开启core dump

linux 默认是关闭的。

开启

ulimit -c unlimited

此时,运行程序发生sigsegv之类的异常时,自动生成core文件在执行文件目录下。

随便写一个简单错误代码,做测试

957: int *a = NULL;
958:    *a = 6; //非法,段错误

生成core文件后,执行

gdb <可执行程序> core

随后你就可以看到,如下提示,指名在那个文件那个函数的那一行触发异常,如上为958行

warning: Could not load shared library symbols for linux-vdso.so.1.
Do you need "set solib-search-path" or "set sysroot"?
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/a7_softfp_neon-vfpv4/libthread_db.so.1".
Core was generated by `./JanusFace'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0xacdd0d0c in test::testFunc (this=0x877f8550, stInfo=...) at testServer.cpp:958
958 testServer.cpp: No such file or directory.

这里的测试代码比较简单,如果是具体业务中的可能就要利用上gdb的那些功能,bt full 、查看栈帧,查看局部变量值之类的,方便具体问题具体分析。

(gdb) bt full
#0  0xacdd0d0c in test::testFunc (this=0x877f8550, stVideoViewReqInfo=...) at testServer.cpp:958iRet = -1a = 0x0__PRETTY_FUNCTION__ = "void test::testFunc(VIDEO_VIEW_REQ_INFO&)"

如上所示,局部变量a = 0 为空指针 。

backtrace

有时候不方便gdb的时候,那就只能用backtrace之类的函数来辅助分析排查了
注册如sigsegv之类异常信号的异常处理函数,在处理函数中用backtrace查看调用堆栈。

      void SigSegv_handler(int signo){int j, nptrs;void *buffer[BT_BUF_SIZE];char **strings;nptrs = backtrace(buffer, BT_BUF_SIZE);printf("backtrace() returned %d addresses\n", nptrs);/* The call backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO)would produce similar output to the following: */strings = backtrace_symbols(buffer, nptrs);if (strings == NULL) {perror("backtrace_symbols");exit(EXIT_FAILURE);}for (j = 0; j < nptrs; j++)printf("%s\n", strings[j]);free(strings);exit(-1);}

如上即可获取调用堆栈

静态库

静态库打印的信息大致如下

Dump stack start...
backtrace() returned 8 addresses[00] ./backtrace(dump+0x1f) [0x400a9b][01] ./backtrace(signal_handler+0x31) [0x400b63][02] /lib/x86_64-linux-gnu/libc.so.6(+0x36150) [0x7f86afc7e150][03] ./backtrace(testFunc+0x1a) [0x400a3e]
Dump stack end...

比较简单,根据addr2line命令

addr2line -e backtrace 0x400a3e
testServer.cpp:958

动态库

动态库则略微麻烦,动态库每次加载的内存地址都不一样,所以不能跟静态库一样,不过可以根据根据map文件找到对应实际地址,编译的时候加上-Wl,-Map,entry.map。即可生成map文件。需要带 -g

动态库backtrace 打印如下。

Dump stack start...
backtrace() returned 8 addresses[00] ./backtrace(dump+0x1f) [0x400a53][01] ./backtrace(signal_handler+0x31) [0x400b1b][02] /lib/x86_64-linux-gnu/libc.so.6(+0x36150) [0x7f8583672150][03]./libTest.so(_ZN13Testt11testFuncER20_VIDEO_VIEW_REQ_INFO+**0x44**) [0xace45d0c]
Dump stack end...
段错误 (核心已转储)

在map文件中搜索testFunc

  0x0007fcc8                test::testFunc(_VIDEO_VIEW_REQ_INFO&)

可知在代码 0x0x0007fcc8 + 0x44处发生异常。

addr2line -e libTest.so 0x7FD0C
testServer.cpp:958

最后补充几句

mcu和linux这些处理crash基本思路都是一样的,linux里面的sigsegv这些诸如此类的异常,基本等同于mcu里面的那些hardfault,只不过handler在linux里面需要程序取做注册挂载,mcu里面只需要按照启动文件提供函数实现即可。处理逻辑也大同小异,mcu里面根据发生hardfault时的寄存器获取当时fault的现场环境数据,然后再根据ide生成的map获取现场环境做分析,linux只不过工具上更多样复杂了,gdb 、core dump 、addr2line 和backtrace这些,提供了比mcu更高级的crash现场分析。

linux 程序crash 调试、原因分析及问题定位相关推荐

  1. RV1108 EMMC 程序下载失败原因分析

    RV1108 EMMC 程序下载失败原因分析 目录 RV1108 EMMC 程序下载失败原因分析 1. 出现的现象 硬件环境 表现出的问题 2. 原因查找 检查硬件 3. rv1108 bootloa ...

  2. 高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析

    文章目录 概述 jstack或者可视化工具检测是否死锁(没有) 原因分析 概述 高并发编程-线程通信_使用wait和notify进行线程间的通信 - 遗留问题 我们看到了 应用卡住了 .... 怀疑是 ...

  3. Windows程序crash该怎么分析?

    一.crash率 1.计算公式 日crash率 = 每日上报crash设备数 / 每日联网设备数 crash率 = 统计周期内每日crash率的平均值 统计周期:默认BSC统计周期默认是按月统计 2. ...

  4. linux 程序退出 调试,Linux程序调试 - nbspnbspnbspC++nbsp技术中心 - C++博客

    Linux下的段错误产生的原因及调试方法 简而言之,产生段错误就是访问了错误的内存段,一般是你没有权限,或者根本就不存在对应的物理内存,尤其常见的是访问0地址. 一般来说,段错误就是指访问的内存超出了 ...

  5. linux 程序退出 调试,linux驱动程序调试常用方法(printk,OOP,strace,hacking,ioctl,/proc,kgdb)...

    驱动程序开发的一个重大难点就是不易调试.本文目的就是介绍驱动开发中常用的几种直接和间接的调试手段,它们是: 利用printk 查看OOP消息 利用strace 利用内核内置的hacking选项 利用i ...

  6. android app程序闪退原因分析

    1.xml布局不合理,导致程序难以绘制界面,从而闪退,例如:<fragment>中放入<constraint>导致布局不合理 2.activity没有在manifest中申明 ...

  7. linux进程退出没有log,Linux下应用进程消失原因分析-Go语言中文社区

    应用部署在Linux环境下,如果出现未知原因导致应用进程被杀(应用日志中没有任何异常现象,日志出现中断现象),如果对于进程消失原因没有特别明确的方向,可以考虑从系统日志(/var/log/messag ...

  8. Linux下应用进程消失原因分析

    应用部署在Linux环境下,如果出现未知原因导致应用进程被杀(应用日志中没有任何异常现象,日志出现中断现象),如果对于进程消失原因没有特别明确的方向,可以考虑从系统日志方面查找原因. 命令参考 dme ...

  9. iOS平台的应用程序调试与分析

    本文阐述如何在iOS平台上对应用程序进行调试与分析,旨在指导新手分析iOS程序,高手请无视.内容包括软件硬件的准备.代码的解密.符号信息的获取.用gdb调试等,最后以京东LeBook为例子进行演示. ...

最新文章

  1. 静态方法多次调用内存_java虚拟机的内存分析
  2. Docker与LXC、虚拟化技术的区别——虚拟化技术本质上是在模拟硬件,Docker底层是LXC,本质都是cgroups是在直接操作硬件...
  3. 云炬Android开发笔记 5-9,10拦截器功能设计与实现
  4. Linux -sed
  5. css degrees_带有Python示例的math.degrees()方法
  6. 信息学奥赛C++语言:优惠购物
  7. ASP.NET GridView中使用搜索框(SearchableGridView)
  8. idea调试怎么跳出循环_Intellij IDEA调试功能使用总结
  9. WORD的POI处理与原理
  10. 未能打开组策略对象 您可能没有合适的权限
  11. QAM调制原理_QAM调制:4/5G中各种调制方式基础,均由两条正弦波变化并勾勒出...
  12. linux下命令行安装oracle 11g数据库
  13. [Cydia] 使用Cydia安装iPA破解补丁教程
  14. java根据经纬度获取地址
  15. matlab绘制世界地图代码
  16. transformer--ViT
  17. 流程配置中,什么是会签/或签(竞签)
  18. 定义Mat类型显示未定义
  19. 洛谷T156530 儒略历详解
  20. ssm毕设项目丢失宠物发布找寻平台7nk4i(java+VUE+Mybatis+Maven+Mysql+sprnig)

热门文章

  1. struts使用下拉列表框[LabelValueBean的使用]
  2. 我国计算机的最新进展,我国计算机最新进展
  3. Howdoo欢迎Mitel成为内容发布支持者
  4. CSDN读书频道也豆瓣了?
  5. Django框架学习——1—(虚拟环境搭建、MVC思想与Django的MVT区别、Django项目的创建、运行Django项目、项目结构介绍)
  6. 2018年吉林大学软件学院软件工程专硕复试题目回忆
  7. Windows Server系统使用Windows图片查看器
  8. tomcat配置pid文件
  9. 云南省初中计算机说课稿,云南省实验教材《信息技术》说课稿范文(9页)-原创力文档...
  10. linux学习:解决Ubuntu运行时CPU温度过高导致自动关机保护