AI智能摘要
crash是一款基于GDB、专为Linux内核崩溃转储文件分析而设计的开源工具,补足了GDB无法读取内核核心信息的不足。文章详解crash的手动编译安装流程,并重点介绍利用GitHub Action实现自动化编译和发布,极大简化部署环节,高效便捷,适合开发者快速上手与持续集成。
此摘要由AI分析文章内容生成,仅供参考。

crash是什么?

当linux系统内核发生崩溃的时候,可以通过KEXEC+KDUMP等方式收集内核崩溃之前的内存,生成一个转储文件vmcore。内核开发者通过分析该vmcore文件就可以诊断出内核崩溃的原因,从而进行操作系统的代码改进。那么Crash就是一个被广泛使用的内核崩溃转储文件分析工具。 对调试来讲,gdb是非常适合的,但gdb始终是调试native的工具,不支持kernel信息显示,比如task信息之类的。crash补足了这个短板,由Dave Anderson开发和维护的一个内存转储分析工具,是基于GDB开发的 (GDB适用于用户进程的coredump,而Crash扩展了GDB,使其适用于linux kernel coredump)

crash是一个开源软件,github地址:https://github.com/crash-utility/crash

如何安装crash?

下载crash源码

git clone git@github.com:miniLQ/crash.git

安装编译工具

sudo apt-get update
sudo apt-get install make gcc g++ bison flex texinfo wget patch tar build-essential libc-dev autoconf automake libncurses-dev

安装交叉编译器

sudo apt-get update
sudo apt-get -q=2 install  gcc-x86-64-linux-gnu g++-x86-64-linux-gnu

安装gmp lib

# 在非crash源码目录下执行,下面用变量${WORKSPACE}代替
mkdir ${WORKSPACE}/libtools
wget https://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.2.1.tar.bz2
tar -jxvf gmp-6.2.1.tar.bz2
cd gmp-6.2.1
./configure --host=aarch64-linux-gnu --prefix=$WORKSPACE/libtools
make -j`nproc`
sudo make install
cd ..

安装mpfr lib

cd ${WORKSPACE}/libtools
wget https://gcc.gnu.org/pub/gcc/infrastructure/mpfr-4.1.0.tar.bz2
tar -jxvf mpfr-4.1.0.tar.bz2
cd mpfr-4.1.0
./configure --host=aarch64-linux-gnu --prefix=$GITHUB_WORKSPACE/libtools --with-gmp=$GITHUB_WORKSPACE/libtools
make -j`nproc`
sudo make install

crash-utility编译

sudo cp $WORKSPACE/libtools/include/* /usr/include/
sudo cp -r $WORKSPACE/libtools/lib/* /usr/lib/
make target=x86_64 CROSS_COMPILE=x86_64-linux-gnu- -j`nproc` warn

依赖github action自动化编译

这几天看crash的github提交,发现官方现在已经适配了ci-build.yml,可以利用github action自动化编译,不再需要本地配置环境!这大大的方便了我们,但是官方的yml没有导出输出产物的步骤,所以我做了一些定制化修改!

https://github.com/miniLQ/crash

  1. 先fork官方的仓库到自己的仓库内

  2. 修改或新增新的yml文件

name: Build

on:
  push:
    branches: [ "master" ]

jobs:
  build:
    name: Build
    runs-on: ubuntu-24.04
    strategy:
      matrix:
        arch:
        - x86_64
 #       - aarch64
 #       - s390x
 #       - powerpc64
 #       - x86
 #       - riscv64
 #       - mips
 #       - alpha
 #       - sparc64

    steps:
    - name: Checkout
      uses: actions/checkout@v4

    - name: Set Environment
      env:
        ARCH: ${{ matrix.arch }}
      run: |
        case $ARCH in
          x86)         GNU_ARCH="i686-linux-gnu" ;;
          x86_64)      CROSS_COMPILER_PKG="gcc-x86-64-linux-gnu"
                       CROSS_COMPILER_PKG+=" g++-x86-64-linux-gnu"
                       GNU_ARCH="$ARCH-linux-gnu" ;;
          *)           GNU_ARCH="$ARCH-linux-gnu" ;;
        esac

        if [ -n "$GNU_ARCH" ]; then
          if [ -z "$CROSS_COMPILER_PKG" ]; then
            CROSS_COMPILER_PKG="gcc-$GNU_ARCH"
            CROSS_COMPILER_PKG+=" g++-$GNU_ARCH"
          fi
          EXTRA_PKGS+=" $CROSS_COMPILER_PKG"
          CROSS_COMPILE="$GNU_ARCH"
        fi

        echo "EXTRA_PKGS=$EXTRA_PKGS" >> $GITHUB_ENV
        echo "CROSS_COMPILE=$CROSS_COMPILE" >> $GITHUB_ENV
        echo "ARCH=$ARCH" >> $GITHUB_ENV

    - name: Compute date string (PST/PDT)
      run: echo "DATE=$(date +%Y%m%d)" >> $GITHUB_ENV

    - name: Install deps for crash-utility building
      run: |
        sudo apt-get update
        sudo apt-get install make gcc g++ bison flex texinfo wget patch tar build-essential libc-dev autoconf automake libncurses-dev

    - name: Install corss compile tool pkgs
      if: env.EXTRA_PKGS != ''
      run: |
        sudo apt-get update
        sudo apt-get -q=2 install ${{ env.EXTRA_PKGS }}

    - name: Cross compile gmp lib
      run: |
        mkdir $GITHUB_WORKSPACE/libtools
        wget https://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.2.1.tar.bz2
        tar -jxvf gmp-6.2.1.tar.bz2
        cd gmp-6.2.1
        ./configure --host=${{ env.CROSS_COMPILE }} --prefix=$GITHUB_WORKSPACE/libtools
        make -j`nproc`
        sudo make install
        cd ..
    - name: Cross compile mpfr lib
      run: |
        wget https://gcc.gnu.org/pub/gcc/infrastructure/mpfr-4.1.0.tar.bz2
        tar -jxvf mpfr-4.1.0.tar.bz2
        cd mpfr-4.1.0
        ./configure --host=${{ env.CROSS_COMPILE }} --prefix=$GITHUB_WORKSPACE/libtools --with-gmp=$GITHUB_WORKSPACE/libtools
        make -j`nproc`
        sudo make install
        cd ..
    - name: Cross compile crash-utility
      run: |
        sudo cp $GITHUB_WORKSPACE/libtools/include/* /usr/include/
        sudo cp -r $GITHUB_WORKSPACE/libtools/lib/* /usr/lib/
        make CROSS_COMPILE=${{ env.CROSS_COMPILE }}- -j`nproc` warn
  
    - name: Compress files
      run: |
        ZIP_NAME="crash_${{ env.ARCH }}-${{ env.DATE }}.zip"
        zip -9 "${ZIP_NAME}" crash
        echo "ZIP_NAME=${ZIP_NAME}" >> $GITHUB_ENV

    - name: Check if tag exists
      id: check_tag
      run: |
        git fetch --tags
        if git rev-parse --verify --quiet "refs/tags/$TAG_NAME" >/dev/null; then
          echo "exists=true" >> $GITHUB_OUTPUT
        else
          echo "exists=false" >> $GITHUB_OUTPUT
        fi
      env:
        TAG_NAME: crash.${{ env.DATE }}

    - name: Create Release
      if: steps.check_tag.outputs.exists == 'false'
      id: create_release
      uses: actions/create-release@v1
      env:
        GITHUB_TOKEN: ${{ secrets.MY_GITHUB_TOKEN }}
      with:
        tag_name: crash.${{ env.DATE }}
        release_name: Release crash.${{ env.DATE }}
        draft: false
        prerelease: false
      
    - name: Upload Release Asset
      uses: actions/upload-release-asset@v1
      env:
        GITHUB_TOKEN: ${{ secrets.MY_GITHUB_TOKEN }}
      with:
        upload_url: ${{ steps.create_release.outputs.upload_url }}
        asset_path: ${{ env.ZIP_NAME }}
        asset_name: ${{ env.ZIP_NAME }}
        asset_content_type: application/zip

    - name: Checking and Clean up
      run: |
        echo "Run command: file crash ..."
        file crash
        echo "Clean up for compiling ..."
        make CROSS_COMPILE=${{ env.CROSS_COMPILE }}- -j`nproc` clean

注意:我这个yml参考里设置了触发条件是push代码到master分支触发编译,可以自行修改

注意:我这个yml参考里设置了触发条件是push代码到master分支触发编译,可以自行修改

注意:我这个yml参考里设置了触发条件是push代码到master分支触发编译,可以自行修改

触发编译后,会在release里生成