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 installcrash-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
先fork官方的仓库到自己的仓库内
修改或新增新的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里生成
