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

valgrind与coredump调试

valgrind + gdb 与 coredump + gdb 调试方法详解

本文对比并详述两条常用的 Native Linux 调试流程:一是用 Valgrind 帮助发现内存错误并结合 gdb 进一步定位;二是通过生成 core dump 再用 gdb 离线分析崩溃现场。注意:Valgrind 只在 Linux/WSL 等类 Unix 环境可用;Windows 上请使用 WSL/虚拟机 或等效工具。


准备工作(两者通用)

  • 编译时保留调试信息:gcc/clang 使用 -g(调试),建议调试期去掉过度优化:-Og 或 -O0。
  • 保证可用的符号/源代码路径,若使用分离的 debug 符号包,确保 gdb 能找到它们。

一、Valgrind + gdb(实时发现内存问题并交互调试)

  1. 常用 valgrind 命令(检测内存泄漏与未定义读写):
valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes \--log-file=valgrind.log ./myprog arg1 arg2
  1. 读取 valgrind.log:
  • 搜索 “Invalid read”/“Invalid write”/“Use of uninitialised value” 等关键词;
  • 日志会包含调用栈(如有符号信息则显示源文件行号)。
  1. 用 gdb 把 valgrind 报的地址/行映射回源代码:
  • 若 log 给出地址,可用 addr2line:
addr2line -e ./myprog 0xADDRESS
  • 或在 gdb 中查看:
gdb ./myprog
(gdb) info line *0xADDRESS

在这里插入图片描述

  1. 直接结合 gdb 与 valgrind(vgdb)交互:
  • 启动 valgrind 并等待 gdb 连接:
valgrind --vgdb=yes --vgdb-error=0 ./myprog
  • 在另一终端启动 gdb 并连接 Valgrind 的 vgdb(系统上可能有 vgdb 脚本):
gdb ./myprog
(gdb) target remote | vgdb

(vgdb 的细节依 valgrind 版本而异,参考本地 valgrind 帮助文档)

  1. 调试技巧:
  • 先用 valgrind 定位问题范围,再在 gdb 中设置断点、检查变量、重现错误;
  • 使用 --track-origins=yes 可帮助追溯未初始化值来源,但代价较高。

二、coredump + gdb(崩溃后离线分析完整进程状态)

  1. 启用/配置 core dump:
  • 临时启用当前 shell:
ulimit -c unlimited
  • (可选)设置 core 文件命名:
sudo sysctl -w kernel.core_pattern=core.%e.%p.%t
  • 在 systemd 系统上,崩溃可能由 systemd-coredump 处理,可用 coredumpctl 访问。
  1. 触发并定位 core 文件:
  • 程序崩溃后会在当前目录或由 core_pattern 指定路径生成 core 文件,或由 coredumpctl 管理:
coredumpctl list
coredumpctl dump PID > core.1234
  1. 使用 gdb 打开 core:
gdb ./myprog core.1234
# 常用 gdb 命令:
(gdb) bt full        # 完整栈回溯与局部变量
(gdb) frame 0
(gdb) info locals
(gdb) list
(gdb) print var_name
(gdb) disassemble
  1. 如果 core 来自不同版本/路径的可执行文件,确保 gdb 使用与崩溃时相同的可执行文件和符号。

  2. systemd-coredump 直接调试:

coredumpctl gdb <PID-or-CoreID>

这会自动把合适的可执行文件和 core 加载到 gdb 中。


比较与选用建议

  • Valgrind + gdb:适合内存错误(非法读写、内存泄漏、未初始化读取)的动态检测,能提前发现很多类型的 bug,但运行慢、只在 Linux 可用。先用 valgrind 定位,再用 gdb 深入。
  • Coredump + gdb:适合重现不了的间歇性崩溃或生产环境崩溃后的离线分析。需要事先开启 core 收集或使用 systemd 的 coredumpctl。能完整查看崩溃时寄存器/栈/内存状态。
  • 两者常结合使用:valgrind 发现内存问题并修复;若仍有崩溃,收集 core 用 gdb 做最终定位。

常见问题与快速排查

  • 无符号信息或行号:确保二进制带 -g 或 debug 符号可用。
  • 无 core 文件:检查 ulimit、core_pattern、以及 systemd-coredump 行为。
  • 生产环境不可直接运行 valgrind:可在测试环境或用 sanitizers(ASan)作为替代。

http://www.dtcms.com/a/407281.html

相关文章:

  • 建设网站 创建数据库如何评判一个网站建设的怎么样
  • 【ROS2】Intermediate - 单个进程中组合多个节点
  • Common Go Mistakes
  • 网站良精企业网站系统超级商城系统
  • C++ 数组、字符串详解与 C 的差异
  • 目前顶尖AI所用算法,包含的数学内容,详细列举
  • 北京网站制作公司有哪些做网站需要多少钱平邑
  • 网站开发环境vs2015是什么郑州博大泌尿外科医院
  • Android 网络 - NetworkCapabilities(NetworkCapabilities 概述、传输类型、网络能力、实例实操)
  • iOS 26 软件性能测试全流程,启动渲染资源压力对比与优化策略
  • 05-vue3+ts中axios的封装
  • 升阳广州做网站公司手游传奇发布网站999
  • 企业备案网站名称怎么填做网站策划需要什么技能
  • 智能体(Agent)的记忆架构:深入解析短期记忆与长期记忆
  • Tongweb708命令行脚本使用指引(by lqw)
  • python学智能算法(三十九)|使用PyTorch模块的normal()函数绘制正态分布函数图
  • wordpress the_content() 截取盐城网站优化推广服务
  • (6) tauri之前端框架性能对比
  • 网站收录查询临沂seo网站建设费入什么科目
  • 做电商网站电商公司wordpress添加标签后哪里显示
  • 优化排名推广技术网站个人网站怎样申请
  • golang面经——context模块
  • Go基础:Go语言能用到的常用时间处理
  • ppt网站超链接怎么做网站报备流程
  • HTTP安全响应头--CSP(Content-Security-Policy)
  • 建筑网站排行榜网站界面设计专利
  • 如何开始第一个开源项目?
  • Moviechat论文阅读
  • 做电影网站算侵权吗上海建设安检站网站
  • 品牌网站模板wordpress判断是否登录