linux设备端breakpad程序崩溃日志的捕获与分析

2023-05-16

linux设备端breakpad程序崩溃日志的捕获与分析

目录

  • linux设备端breakpad程序崩溃日志的捕获与分析
    • 说明
    • 平台介绍
    • breakpad 的编译
      • PC端的编译与安装
      • 交叉编译
    • breakpad 的使用
      • 代码的使用
      • 需要使用的文件
      • 程序崩溃后代码的定位
      • 实际解决问题

说明

本文介绍的linux 嵌入式设备端程序崩溃问题的处理与分析。文章的编写时间与代码的实现时间相隔很多,有些细节文章中不再补充。本文只记录笔记中记载的和能从代码中查到的相关部分内容。

平台介绍

硬件平台:imx6solo
系统:linux

breakpad 的编译

编译breakpad 需要修改源码,怎么修改这里不做说明。

PC端的编译与安装

交叉编译

编译设备端breakpad运行的库时,交叉编译如果按正常的操作方式,是会编译出错的。
正常编译时会source 环境变量

source /opt/fsl-imx-x11/3.14.52-1.1.0/environment-setup-cortexa9hf-vfp-neon-poky-linux-gnueabi

environment-setup-cortexa9hf-vfp-neon-poky-linux-gnueabi 脚本的大致内容如下

export SDKTARGETSYSROOT=/opt/fsl-imx-x11/3.14.52-1.1.0/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi
export PATH=/opt/fsl-imx-x11/3.14.52-1.1.0/sysroots/x86_64-pokysdk-linux/usr/bin:/opt/fsl-imx-x11/3.14.52-1.1.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi:$PATH
export CCACHE_PATH=/opt/fsl-imx-x11/3.14.52-1.1.0/sysroots/x86_64-pokysdk-linux/usr/bin:/opt/fsl-imx-x11/3.14.52-1.1.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi:$CCACHE_PATH
export PKG_CONFIG_SYSROOT_DIR=$SDKTARGETSYSROOT
export PKG_CONFIG_PATH=$SDKTARGETSYSROOT/usr/lib/pkgconfig
export CONFIG_SITE=/opt/fsl-imx-x11/3.14.52-1.1.0/site-config-cortexa9hf-vfp-neon-poky-linux-gnueabi
export OECORE_NATIVE_SYSROOT="/opt/fsl-imx-x11/3.14.52-1.1.0/sysroots/x86_64-pokysdk-linux"
export OECORE_TARGET_SYSROOT="$SDKTARGETSYSROOT"
export OECORE_ACLOCAL_OPTS="-I /opt/fsl-imx-x11/3.14.52-1.1.0/sysroots/x86_64-pokysdk-linux/usr/share/aclocal"
export PYTHONHOME=/opt/fsl-imx-x11/3.14.52-1.1.0/sysroots/x86_64-pokysdk-linux/usr
export CC="arm-poky-linux-gnueabi-gcc  -march=armv7-a -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=$SDKTARGETSYSROOT"
export CXX="arm-poky-linux-gnueabi-g++  -march=armv7-a -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=$SDKTARGETSYSROOT"
export CPP="arm-poky-linux-gnueabi-gcc -E  -march=armv7-a -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=$SDKTARGETSYSROOT"
export AS="arm-poky-linux-gnueabi-as "
export LD="arm-poky-linux-gnueabi-ld  --sysroot=$SDKTARGETSYSROOT"
export GDB=arm-poky-linux-gnueabi-gdb
export STRIP=arm-poky-linux-gnueabi-strip
export RANLIB=arm-poky-linux-gnueabi-ranlib
export OBJCOPY=arm-poky-linux-gnueabi-objcopy
export OBJDUMP=arm-poky-linux-gnueabi-objdump
export AR=arm-poky-linux-gnueabi-ar
export NM=arm-poky-linux-gnueabi-nm
export M4=m4
export TARGET_PREFIX=arm-poky-linux-gnueabi-
export CONFIGURE_FLAGS="--target=arm-poky-linux-gnueabi --host=arm-poky-linux-gnueabi --build=x86_64-linux --with-libtool-sysroot=$SDKTARGETSYSROOT"
export CFLAGS=" -O2 -pipe -g -feliminate-unused-debug-types"
export CXXFLAGS=" -O2 -pipe -g -feliminate-unused-debug-types"
export LDFLAGS="-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed"
export CPPFLAGS=""
export KCFLAGS="--sysroot=$SDKTARGETSYSROOT"
export OECORE_DISTRO_VERSION="3.14.52-1.1.0"
export OECORE_SDK_VERSION="3.14.52-1.1.0"
export ARCH=arm
export CROSS_COMPILE=arm-poky-linux-gnueabi-

# Append environment subscripts
if [ -d "$OECORE_TARGET_SYSROOT/environment-setup.d" ]; then
    for envfile in $OECORE_TARGET_SYSROOT/environment-setup.d/*.sh; do
	    source $envfile
    done
fi
if [ -d "$OECORE_NATIVE_SYSROOT/environment-setup.d" ]; then
    for envfile in $OECORE_NATIVE_SYSROOT/environment-setup.d/*.sh; do
	    source $envfile
    done
fi

然后再make
但这里如果这样交叉编译会有问题,可以交叉编译,但是安装时出问题,提示找不到ranlib

问题原因分析:

因为source 后会暂时修改某些环境变量,导致交叉编译时出问题。

解决方法:

引起这个现象的原因是LDFLAGS 变量发生更改。 source 上述脚本后,执行 unset LDFLAGS

breakpad 的使用

代码的使用

以在qt中的使用为例,在pro中增加 breakpad 编译后成的库 breakpad_client
LIBS +=-L…/lib/breakpad/lib -lbreakpad -lbreakpad_client

在main 函数中增加如下代码

        // 初始化
        google_breakpad::MinidumpDescriptor descriptor(DUMP_FILE_PNAME);
        // minidump文件写入到的目录
        google_breakpad::ExceptionHandler *pHandler =
        new google_breakpad::ExceptionHandler (descriptor, NULL, dumpCallback, NULL, true, -1);
        Q_UNUSED(pHandler);

其中

#define DUMP_FILE_PNAME "../dumpfile"

static bool dumpCallback(const google_breakpad::MinidumpDescriptor& descriptor,
                         void* context, bool succeeded)
{
    //程序崩溃时重启
    Q_UNUSED(context);
    QString crashReporter ;
    crashReporter = QCoreApplication::applicationDirPath() +
                "/../lib/crashReport/armRelease/crashReport";
    qDebug()<<descriptor.path();
    QStringList arg;
    arg<< QCoreApplication::applicationDirPath()+"/" + descriptor.path();
    QProcess::startDetached(crashReporter, arg); //这里另外起动一个进程用于弹窗提示程序出错。arg为崩溃时的文件名。
    return succeeded;
}

需要使用的文件

按上面的操作编译程序后,发布程序时把中间文件 *sym 文件也要保存下来。在程序崩溃时用到。
另外在项目主目录创建 dumpfile文件夹,并在文件夹下创建 symbols 文件夹和外为breakpad.sh的脚本 ,脚本内容如下

#!/bin/bash

# 使用示例:
#第一步,从SVN releaseSymbol 下载对应版本的pft.sym 文件,然后copy到dumpfile下
#第2步 ./breakpad.sh 2020-10-19_15-10-55.dmp project.sym 

# $1 dump 名

symbol_file=$2  # sym 文件

#for symbol_file in *.sym
#do
    file_info=$(head -n1 $symbol_file)
    IFS=' ' read -a splitlist <<< "${file_info}"
    basefilename=${symbol_file:0:${#symbol_file} - 4}
    dest_dir=$basefilename/${splitlist[3]}
    echo "$dest_dir"
    mkdir -p "symbols/"$dest_dir
    mv $symbol_file ./symbols/$dest_dir
    echo "$symbol_file -> ./symbol/$dest_dir/$symbol_file"
    minidump_stackwalk $1 ./symbols > $basefilename.txt
#done

exit 0;

程序崩溃后代码的定位

按上述脚本中注释,执行脚本,会在当前目录下生成project.txt的文件,这个txt文件会详细描述当前崩溃时各个线程的调用情况,排在最前面的线程为出问题的线程。

实际解决问题

实际中用来解决的问题,设备在长时间运行时,接收串口数据绘制波形,在退出运行界面时出现概率性死机的问题,这个出问题概率比较小,当时处理起来非常棘手。 当时用了传统的方法(注册信号,然后触发信号时获取堆栈信息),要不无法感知到程序崩溃,要么崩溃了看不到详细信息。

后面用breakpad发现程序崩在数据接收线程,因为多线程,有一个变量在操作时未加锁。当时就是找到了定位点,也花了一些时间想为什么会出现崩溃。因为问题隐藏的太深了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux设备端breakpad程序崩溃日志的捕获与分析 的相关文章

  • cygwin connection closed by ::1

    Cygwin 1 7 1版本ssh问题 解决办法一 在安装 好Cygwin 1 7 1后 xff0c 进入Cygwin会遇到mkpasswd和mkgroup提示 xff0c 强行做ssh 配置 xff0c 执行sshlocalhost 会报
  • Hadoop错误汇总(更新中)

    2012 05 24 13 40 727人阅读 评论 0 收藏 举报 1 ERROR org apache hadoop hdfs server datanode DataNode java io IOException Incompati
  • 在VMWare Workstation8.0上使用ubuntu11安装和配置Hadoop群集环境03_hadoop的安装

    将hadoop 0 21 0 tar gz通过SSH Secure File Transfer Client上传到usr目录下 1 修改 usr hadoop 0 21 0 conf 目录下的master文件 xff0c 内容如下 xff1
  • 在VMWare Workstation8.0上使用ubuntu11安装和配置Hadoop群集环境04_WordCount示例

    运行框架自带的wordcount示例 在192 168 1 61虚拟机中建立两个输入文件input1和input2 HDFS中建立一个目录input 拷贝input1和input2两个文件到HDFS的input目录中 运行wordcount
  • EVE-NG模拟器教程(四)——常用镜像导入和使用

    网络模拟器的镜像文件是指一个模拟真实设备功能和特性的操作系统 xff0c 我们可以通过在模拟器上导入并启动一个镜像系统 xff0c 来体验真实网络设备的部分功能和特性 这些镜像文件有些是由设备厂商 官方 开发和发布 xff0c 有些则是有一
  • 关于函数strtok和strtok_r的使用要点和实现原理(一)

    strtok函数的使用是一个老生常谈的问题了 该函数的作用很大 xff0c 争议也很大 以下的表述可能与一些资料有区别或者说与你原来的认识有差异 xff0c 因此 xff0c 我尽量以实验为证 交代一下实验环境是必要的 xff0c winx
  • vncserver too many security failures

    在服务器上开了几个虚拟机 xff0c 装了VNC之后 xff0c 经常遇到报错too many security failures 查了下相关资料 xff0c 原来是有人在暴力破解 xff0c 触发了VNC的黑名单机制 重置黑名单 xff0
  • Centos7 官方安装方法(略有修改),nextcloud-20.0.1版本亲测

    Centos7 官方安装方法 略有修改 nextcloud 20 0 1版本亲测 执行第一个脚本文件 文件内容如下 bin bash systemctl stop firewalld systemctl disable firewalld
  • SecureCRT_Python笔记

    文章目录 说明常用语法python脚本开头格式Sleep睡眠发送命令或文本弹出消息框 常用对象操作Application 应用程序对象属性ActivePrinter 活动打印机ScriptFullName 脚本名称Version 版本 方法
  • 常用Docker项目合集

    文章目录 使用说明docker官方一键安装脚本使普通用户可以使用Docker使用国内加速器Portainer 容器管理Portainer 官方 常用服务器备份同步使用docker部署backuppc文件备份adferrand backupp
  • Python习题(第2课)

    一 天天向上的力量 C 一年365天 xff0c 以第1天的能力值为基数 xff0c 记为1 0 当好好学习时 xff0c 能力值相比前一天提高N xff1b 当没有学习时 xff0c 由于遗忘等原因能力值相比前一天下降N 每天努力或放任
  • Openpyxl笔记

    文章目录 介绍工作薄操作创建工作薄对象打开工作薄工作薄属性工作薄方法遍历工作薄中的工作表 工作表操作创建工作表指定工作表删除工作表复制工作表获取工作表的总行数和总列数工作表的Table创建Table删除Table 工作表属性工作表方法获取工
  • xlwings笔记

    文章目录 介绍xlwings 常用实例读取 写入单元格将列表写入某个范围 xlwings 安装顶级函数顶级函数xlwings load顶级函数xlwings view appsapps 介绍apps属性查看Apps包含的所有App返回App
  • NextCloud 最新官方源代码安装包及客户端下载

    官方搬运 服务端 源代码安装包 大版本小版本V13V13 0 5下载V14V14 0 1下载V15V15 0 4下载V15V15 0 5下载V15V15 0 7下载V16V16 0 0下载V16V16 0 1下载V16V16 0 2下载V1
  • 河北保定电信家庭宽带获取原生IPv6地址,中兴F650光猫加MikroTik路由器

    先用电脑接光猫输入192 168 1 1 用户名 xff1a telecomadmin 密码 xff1a nE7jA 5mROS路由器设置
  • [翻译]Learning Deep Features for Discriminative Localization

    英文原文请点这里 摘要 在这项工作中 xff0c 我们重新审视了 Network in network 中提出的全局平均 池化层 xff08 global average pooling xff09 xff0c 并阐明了它是如何通过图片标签
  • 2. 嵌入式OpenWRT入门基础篇-----OpenWRT固件烧录

    OpenWRT固件烧录方式有很多种 xff0c 会逐渐更新烧录方法 一 此方法适用于OpenWRT 系统可以正常启动的情况 xff0c 用于OpenWRT 固件的升级 1 xff09 开发板上电 xff0c 至启动完成 2 xff09 登录
  • OpenCV源码中Haar训练及提取特征的代码

    我想计算Haar特征 xff0c 自己手动计算感觉挺麻烦 xff08 主要在取各个不同位置 不同scale的特征 xff09 xff0c 而且可能速度不够 OpenCV 的这个把所有东西都封装起来了 xff0c 由于我的online boo
  • 梯度向量、Jacobian矩阵、Hessian矩阵

    这里 xff0c 讨论三个概念 xff1a 梯度向量 Jacobian矩阵 Hessian矩阵 xff1b 由自变量x 61 x1 x2 xn T 因变量 xff1a 为一维f x 时 xff0c 此时其一阶导数构成的向量为梯度向量g x
  • linux查看当前加载的所有动态库

    在我们做Linux开发的时候 xff0c 往往会出现 某些库 can not found 的情况 xff0c 在我们添加了这些库之后 xff0c 如何查看这些库的路径是否被识别了呢 xff1f 下面介绍一个命令 xff1a ldconfig

随机推荐