博客
关于我
Linux下gdb调试器的简单使用方法
阅读量:612 次
发布时间:2019-03-13

本文共 1716 字,大约阅读时间需要 5 分钟。

GDB(GNU Symbolic Debugger)手册

GDB 是 GNU 项目中的一个调试器,它允许你在程序运行期间观察正在执行的操作,或在程序崩溃时查看崩溃时的状态。GDB 主要用于调试可执行程序以及分析核心转储文件(Coredump)。


GDB 的主要功能

GDB 可以执行以下主要操作:

  • 启动你的程序,并指定可能影响其行为的所有内容。
  • 在指定条件下使程序停止。
  • 检查程序在停止时发生的情况。
  • 修改程序内容,以便尝试纠正错误,并继续分析其他错误。

在 Linux 下使用 GDB 准备调试版本

在 Linux 下,gcc 或 g++ 编译的二进制程序默认是发布版本(release),即不包含调试信息。如果你想使用 GDB调试,请在编译时添加以下选项:

gcc -g -o Feb5 fib.o

这样,生成的二进制文件“Feb5”将包含调试信息,适合用 GDB 调试。


##步骤说明:使用 GDB 调试可执行程序

  • 编译准备阶段

    编译阶段不需要特别的处理,只需确保使用了 -g 选项以生成调试版本。如果你使用的是现有的二进制文件,可以通过下述方式启动调试:

  • 启动调试

    在终端中启动 GDB:

    gdb Feb5
  • 浏览代码

    使用 list 或 l 命令浏览代码:

    • 显示某一行及其后续 10 行代码:

      list /l 5
    • 显示某个函数的代码:

      list /l fib
  • 运行程序

    使用 run 或 r 命令运行程序:

    run /r

    这将执行程序并输出结果(如斐波那契数的第五项为 "5")。

  • 设置断点

    断点是调试中的重要工具,可以帮助你定位程序的执行路径。

    • 在某一行设置断点:

      break /b 5
    • 在某个函数的开头设置断点:

      break /b fib
    • 查看断点详情:

      info break
  • 执行控制命令

    • 逐步执行当前行:

      next /n
    • 逐行执行代码(等同于 Visual Studio 的 F11):

      step /s
    • 打印变量或表达式的值:

      print /p var_name
    • 继续执行当前断点后的代码:

      continue /c
  • 删除和启用/禁用断点

    操作断点的方法:

    delete /d 1enable /e 2disable /d 2
  • 退出 GDB

    当调试完成后,输入以下命令退出:

    quit /q

  • 调试核心转储文件

    如果程序在崩溃时生成了内存镜像文件(core),你可以用 GDB 分析 crashes。

    样本场景:内存越界错误

    假设你的程序中有如下错误:

    int* p = 0;*p = 10;

    这种情况会导致 segment fault 错误(内存越界)。

    生成核心转储文件的条件

    确保以下条件:

    • Linux 环境:修改 ulimit 设置:

      ulimit -c unlimited

      这将允许较大的核心转储文件生成。

    • 磁盘空间:必须有足够的磁盘空间来存储 core 文件。

    生成核心转储文件

    运行程序时,确保程序会崩溃:

    ./Feb5

    这将生成一个名为 Feb5.core 的核心转储文件。

    使用 GDB 调试核心文件

    完成后,启动 GDB,并指定核心文件:

    gdb Feb5 Feb5.core

    分析 crash 情况

    GDB 会自动进入崩溃模式,并显示相关信息。例如:

    _program received signal 11, stopped at 0x0 in _some_function ()from /absolute/path/to/Feb5()ギ多少.backtrace[l000x0000000.0 0  1  2  3]

    你可以使用 backtrace 命令查看调用栈:

    backtrace /bt

    导致崩溃的代码行

    GDB 会显示导致程序崩溃的具体代码行。例如:

    0x004d3b0 in _some_function () at Feb5.c:6: ,pointers:( cabelonedefault */

    此外,使用 print 命令分析错误信息:

    print /p *p

    通过以上步骤,你可以使用 GDB 进行程序调试和核心文件分析。如果有任何问题,可以参考 GDB 在线文档或社区求助。

    转载地址:http://vjzaz.baihongyu.com/

    你可能感兴趣的文章
    Python:字典思维
    查看>>
    Python:将 HEX 字符串转换为字节
    查看>>
    Python:将列表与范围列表合并
    查看>>
    Python:将列表列表初始化为一定大小,
    查看>>
    Python:带有生成器的给定集合的幂集
    查看>>
    Python:按字符的位置拆分字符串
    查看>>
    Python:替换嵌套字典中的值
    查看>>
    Python:爬取数据出现response.status_code为403解决方法
    查看>>
    Python:爬取数据出现response.status_code为418解决方法
    查看>>
    Python:生成“元组集“;来自“元组列表“;不考虑顺序
    查看>>
    Python:生成具有趋势的随机时间序列数据(例如周期性、指数衰减等)
    查看>>
    Python:用渐进式数字重命名列表中的重复项而不对列表进行排序
    查看>>
    Python:矩形参数无效
    查看>>
    Python:语法进阶
    查看>>
    Python:调用复制函数时调用 Python 对象时超出了最大递归深度
    查看>>
    Python:这两个 import 语句有什么区别?
    查看>>
    Python:通过串口从 Velleman k8090 读取数据
    查看>>
    python:遍历具有列表值的字典
    查看>>
    Python:降低精度 pandas 时间戳数据帧
    查看>>
    python:非阻塞子进程,检查标准输出
    查看>>