当前位置: 首页 > news >正文

linux C++代码崩溃查询工具及操作说明 , 真正的C++部署工程往往比较多个模块协同运行

linux C++代码崩溃查询工具及操作说明 , 真正的C++部署工程往往比较多个模块协同运行,代码量及代码复杂度都比较大 尤其在产品部署交付后车载边缘端服务器上出现各种问题,此时溯源比较困难 尤其是出现段错误(Segmentation fault (core dumped))时会感觉束手无策,不知如何定位 您可以用我们提供的linux C++代码崩溃查询工具(该工具为指令脚本,非C++工程),执行安装脚本后 ,只要当前系统中的任何C++ 工程出现崩溃都会进行记录,方便您后面进行溯源 本商品提供脚本及说明文档,非常简单不需要提供也不依赖第三方库

谁懂啊?车载边缘端跑着多模块耦合的C++工程,刚交付就突然炸段错误——远程登上去只能看到干巴巴的Segmentation fault (core dumped),连哪行代码崩的都摸不着。模块多、环境偏,本地复现不了,那真是挠破头的崩溃。

直到用上这个纯脚本实现的崩溃监控工具,终于不用再当“无头苍蝇”了。全程不依赖第三方库,装完躺平,系统里任何C++程序崩了,自动给你把溯源信息记下来,省心到爆。

先看怎么装:一键搞定core dump配置

首先得解决核心问题:默认Linux环境大多关了core dump限制,或者生成的core文件没标识、找不着。这个安装脚本直接帮你把这些配置拉满,还把监控服务搭好。

linux C++代码崩溃查询工具及操作说明 , 真正的C++部署工程往往比较多个模块协同运行,代码量及代码复杂度都比较大 尤其在产品部署交付后车载边缘端服务器上出现各种问题,此时溯源比较困难 尤其是出现段错误(Segmentation fault (core dumped))时会感觉束手无策,不知如何定位 您可以用我们提供的linux C++代码崩溃查询工具(该工具为指令脚本,非C++工程),执行安装脚本后 ,只要当前系统中的任何C++ 工程出现崩溃都会进行记录,方便您后面进行溯源 本商品提供脚本及说明文档,非常简单不需要提供也不依赖第三方库

给个安装脚本核心代码段:

#!/bin/bash # 1. 配置core dump生成规则 CORE_SAVE_DIR="/var/crash/core_files" LOG_SAVE_DIR="/var/crash/crash_records" mkdir -p $CORE_SAVE_DIR $LOG_SAVE_DIR # 放开core文件大小限制(默认是0,生成不了core) echo "* soft core unlimited" >> /etc/security/limits.conf echo "* hard core unlimited" >> /etc/security/limits.conf # 配置core文件命名:程序名-PID-时间戳,避免覆盖 sysctl -w kernel.core_pattern="${CORE_SAVE_DIR}/core_%e_%p_%t" echo "kernel.core_pattern = ${CORE_SAVE_DIR}/core_%e_%p_%t" >> /etc/sysctl.conf sysctl -p # 2. 写监控脚本:自动抓崩溃栈 cat > /usr/local/bin/crash_watcher.sh << 'EOF' #!/bin/bash CORE_DIR="/var/crash/core_files" LOG_DIR="/var/crash/crash_records" while true; do # 找3分钟内的新core文件,避免重复处理 find $CORE_DIR -name "core_*" -mmin -3 | while read core_file; do log_name=$(basename $core_file | sed 's/core_/crash_log_/').txt log_path="${LOG_DIR}/${log_name}" if [ ! -f "$log_path" ]; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] 捕获程序崩溃:$(basename $core_file)" >> "${LOG_DIR}/watcher.log" # 用gdb扒栈,输出完整回溯+寄存器信息 gdb -ex "set pagination off" -ex "bt full" -ex "info registers" -ex "quit" --core="$core_file" > "$log_path" 2>&1 # 尝试匹配程序可执行文件,补全更详细信息 prog_name=$(echo $core_file | grep -oP 'core_\K.*?(?=_\d+_)') if [ -n "$prog_name" ] && which "$prog_name" > /dev/null; then gdb -ex "set pagination off" -ex "bt full" -ex "quit" "$(which $prog_name)" "$core_file" >> "${log_path}.full" 2>&1 fi fi done sleep 20 # 每20秒扫一次目录 done EOF chmod +x /usr/local/bin/crash_watcher.sh # 3. 做成systemd服务,开机自启 cat > /etc/systemd/system/crash-watcher.service << 'EOF' [Unit] Description=Crash Monitor Service After=multi-user.target [Service] Type=simple ExecStart=/usr/local/bin/crash_watcher.sh Restart=always User=root [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable --now crash-watcher.service echo "安装完成!崩溃日志存于/var/crash/crash_records"
代码拆解:这几步为啥重要?
  1. core dump开关拉满/etc/security/limits.conf里改unlimited是因为默认用户进程的core文件大小被限制为0,根本生成不了core文件——这是很多人碰过的坑,程序崩了找不到core,以为没开,其实是大小限制没放。
  2. core文件命名规则kernel.core_pattern里的%e(程序名)、%p(PID)、%t(时间戳)是关键,不然所有core文件都叫core,新的会覆盖旧的,查历史崩溃全白搭。
  3. 监控脚本的懒处理:不用复杂的inotify(虽然更实时,但依赖inotify-tools),直接用find扫目录加时间过滤,适合车载这种极简环境。每20秒扫一次足够,也不占资源。
  4. gdb自动扒栈bt full比单纯bt多了局部变量的值,对定位空指针、越界这种问题太有用了;如果能找到程序的可执行文件(带-g调试信息的话),第二次gdb分析还能直接出代码行号。

崩溃后怎么溯源?看日志就行

比如车载的carsensormodule崩了,日志里会生成crashlogcarsensormodule12341698765432.txt,打开直接看栈回溯:

#0 0x00007f9d12345678 in SensorParser::parseCanData(CanFrame*) () from /usr/lib/libcar_sensor.so #1 0x0000560a98765432 in SensorUpdateThread::run() () at src/sensor_thread.cpp:89 #2 0x00007f9d11abcdef in std::thread::_Impl<std::_Bind_simple<SensorUpdateThread::*()(SensorUpdateThread*)> >::_M_run() () from /usr/lib/libstdc++.so.6 ...

如果编译时加了-g参数(一定要加!不然只有内存地址),还能看到src/sensor_thread.cpp:89——直接定位到线程里调用SensorParser::parseCanData的时候崩了,大概率是CanFrame指针为空,或者解析时数组越界。

要是日志里还有.full后缀的文件,里面的信息更全,连程序加载的动态库版本、寄存器状态都有,够你把问题拆得明明白白。

最后提俩注意事项

  1. 车载编译必加-g:别为了减小包体积把调试信息扒干净,不然gdb只能给你输出内存地址,找不到具体函数和行号,溯源效率直接砍半。
  2. 权限问题:必须用root装,因为要改系统配置和systemd服务,车载边缘端一般都是root权限跑程序,不用怕权限不够生成不了core。

说白了,这个工具就是把“开core dump+监控core文件+自动gdb分析”这一套流程自动化了,纯脚本实现,没有花里胡哨的依赖,车载边缘端这种资源有限、环境封闭的场景,越简单的工具越好用。以后再遇到段错误,直接去日志目录扒记录就行,再也不用远程瞎折腾了。

http://www.jsqmd.com/news/591931/

相关文章:

  • 保姆级教程:在IsaacGym 2022.1中为Franka机械臂添加力传感器(附完整代码)
  • 手机录制视频+云盘自动备份视频=安全监控
  • 百考通:汇聚了大量高质量实战项目,精准匹配当前主流技术方向与行业需求
  • 新手福音:在快马平台零配置体验matlab核心计算与绘图功能
  • Pixel Aurora Engine应用场景:复古风品牌VI系统像素化延展设计案例
  • AMD显卡本地AI部署终极指南:三步解锁免费大模型运行能力
  • PointNet实战:从零开始搭建3D点云分类模型(附TensorFlow代码解析)
  • ComfyUI-FramePackWrapper模型加载策略:从问题诊断到决策落地的全流程指南
  • UndertaleModTool:GameMaker游戏解包与深度修改的完整解决方案
  • 用iTwin.js构建下一代工程协作平台:从核心功能到实践落地
  • OpCore-Simplify:智能自动化EFI构建的技术突破实践
  • GLM-4-9B-Chat-1M完整指南:支持中文长文本、代码、多轮对话的本地LLM
  • GetSub终极指南:5分钟掌握智能字幕下载,从此告别找字幕的烦恼!
  • 如何3分钟完成PDF文档比对:开源工具的终极解决方案
  • OneDrive彻底卸载方法论:从系统残留清除到性能优化的完整策略
  • BiliTools哔哩哔哩工具箱:5分钟掌握跨平台B站资源管理终极方案
  • Win10 22H2 Oct版安装全攻略:DISM++ vs 传统ISO安装,哪种更适合你?
  • AI辅助开发:让openclaw听懂人话,基于快马AI打造智能自然语言命令行工具
  • 百考通:AI精准赋能,让每一份调研与设计更高效、更专业
  • 使用VS Code远程开发调试SDMatte服务:高效开发工作流搭建
  • androidx+previewView手机摄像头示例代码---常用版---最方便
  • 保姆级教程:在Ubuntu 16.04上搞定Matlab 2021b安装与破解(附一键启动脚本)
  • OpCore-Simplify:零代码自动化配置黑苹果的解决方案
  • Qwen2.5-1.5B轻量AI助手实战:自媒体选题策划+爆款标题生成效果分析
  • 从Gridworld到吃豆人:用Python拆解强化学习核心算法(附CS188项目代码解析)
  • 效率倍增:基于快马AI一键生成整合openclaw命令的自动化脚本
  • 物理层安全渗透测试:3个鲜为人知的漏洞+5步防御指南
  • 复合材料abaqus umat子程序 基于puck准则,内附inp文件及使用文档,可提供参考文...
  • 基于Matlab的裂缝及长度检测——“算法实现与应用”
  • JavaWeb 笔记 04 (46 - 49)