在 Linux 上调试核心转储文件 - 详细指南

主要观点:核心转储在调试异常退出的程序中起关键作用,可保存程序失败时的状态以帮助程序员查看和识别失败原因,文中通过在 Linux 中逐步演示启用、创建和检查核心转储的过程,并涉及高端调试工具和技术。
关键信息

  • 可在/etc/security/limits.conf/etc/sysctl.conf中设置使核心转储持久化,配置转储位置等。
  • 可通过创建导致段错误的 C 程序来生成测试用的核心转储,如gcc -g -o crash_test crash_test.c
  • 利用 GDB 可加载和分析核心转储,进行回溯、检查变量、反汇编代码、查看寄存器等操作。
  • 对于多线程应用,可使用info threads等命令进行线程相关操作。
  • 还可使用 Valgrind 分析内存问题,ELFutils 进行符号检查,Crash Utility 处理内核转储等高级工具。
  • 给出了调试特定问题如段错误、堆损坏、共享库不匹配等的方法。
  • 总结了核心转储调试的最佳实践,包括保存符号、自动化转储、分析日志等。
    重要细节
  • 启用核心转储时,ulimit -c unlimited可临时启用,* soft core unlimited等可使其持久化,sudo sysctl -w kernel.core_pattern=/var/dumps/core.%e.%p可配置转储位置。
  • 生成核心转储后,可通过ls /var/dumps查看其位置,如core.crash_test.12345
  • 在 GDB 中,bt可获取回溯,info locals可检查变量,disassemble main可反汇编代码,info registers可查看寄存器等。
  • 调试多线程应用时,info threads可查看线程,thread <ID>可切换线程,thread apply all bt可获取所有线程的回溯。
  • Valgrind 可检测无效内存访问等问题,eu-readelf可检查核心文件的符号信息等。
  • 最佳实践包括独立保存符号、自动化转储、分析日志、去除敏感信息、使用调试构建等。
阅读 12
0 条评论