• GDB常用指令与调试汇总



    前言

    GDB(GNU Debugger)是一个强大的调试工具,用于调试C、C++等编程语言的程序。本文将介绍一些常用的GDB指令,以及通过例子演示如何使用这些指令进行程序调试。

    一、基础

    1. 启动程序调试:
      使用命令 gdb 启动GDB,并加载可执行文件进行调试。

    2. 设置断点:

      • 使用命令 break b 设置断点。 可以是函数名、行号或文件名:行号的组合。例如,break mainmain 函数处设置断点。
      • 使用命令 info breakpointsi b 查看已设置的断点信息。
      • 使用命令 delete 删除指定编号的断点。
    3. 运行程序:

      • 使用命令 runr 运行程序,可以在后面跟上命令行参数。
      • 使用命令 continuec 继续执行程序,直到下一个断点或程序结束。
    4. 单步调试:

      • 使用命令 nextn 执行下一行代码,不会进入函数内部。
      • 使用命令 steps 执行下一行代码,并进入函数内部。
    5. 打印变量值:

      • 使用命令 print p 打印表达式的值。例如,print x 打印变量 x 的值。
      • 使用命令 info locals 显示当前作用域的局部变量。
    6. 调试信息:

      • 使用命令 backtracebt 显示当前调用栈的信息。
      • 使用命令 info registersi r 查看寄存器的值。
    7. 观察点:

      • 使用命令 watch 设置观察点,当表达式的值发生变化时中断程序执行。
    8. 退出GDB:

      • 使用命令 quitq 退出GDB。

    通过以上常用指令,我们可以对程序进行有效的调试。
    在这里插入图片描述

    二、例子

    下面是一个简单的例子,演示如何使用GDB调试程序:

    假设我们有以下C程序,保存为 example.c

    #include 
    
    int main() {
        int num1 = 10;
        int num2 = 5;
        int sum = num1 + num2;
        printf("The sum of %d and %d is %d\n", num1, num2, sum);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    我们希望使用GDB调试这个程序,以查找并解决潜在的问题。

    1. 编译程序时需要添加 -g 参数,以生成可调试的符号表。例如,使用以下命令编译程序:

      gcc -g example.c -o example
      
      • 1
    2. 启动GDB,并加载可执行文件:

      gdb example
      
      • 1
    3. 设置断点:

      break main
      
      • 1

      这将在 main 函数的第一行设置断点。

    4. 运行程序:

      run
      
      • 1

      程序将运行到第一个断点处停止。

    5. 单步调试:

      使用 next 命令逐行执行代码:

      next
      
      • 1

      第一次执行 next 后,程序将执行到第二行 int num2 = 5; 处。此时,我们可以使用 print 命令查看变量的值:

      print num1
      
      • 1

      输出结果为:

      $1 = 10
      
      • 1

      这表示变量 num1 的值为 10。

      继续执行 next 命令,程序将执行到第三行 int sum = num1 + num2; 处。我们可以使用 step 命令进入 + 操作符对应的函数内部:

      step
      
      • 1

      程序将进入 + 函数内部。此时,我们可以使用 print 命令查看参数的值:

      print num1
      print num2
      
      • 1
      • 2

      输出结果为:

      $2 = 10
      $3 = 5
      
      • 1
      • 2

      这表示变量 num1num2 的值分别为 10 和 5。

      继续执行 next 命令,程序将执行到第四行 printf("The sum of %d and %d is %d\n", num1, num2, sum); 处。我们可以使用 print 命令查看变量的值:

      print sum
      
      • 1

      输出结果为:

      $4 = 15
      
      • 1

      这表示变量 sum 的值为 15。

    6. 继续执行程序:

      使用 continue 命令继续执行程序:

      continue
      
      • 1

      程序将执行完毕并退出。

    7. 退出GDB:

      使用 quit 命令退出GDB:

      quit
      
      • 1

    通过以上步骤,我们成功使用GDB调试了这个简单的C程序。在实际的开发中,我们可以使用更多的GDB指令和技巧,以更高效地进行程序调试。

    三、用gdb调试多线程程序

    对这些GDB命令的整理和示例:

    1. info threads:显示当前可调试的所有线程。每个线程都有一个唯一的ID,被调试的线程前面会有一个"*"标记。

      示例输出:

      (gdb) info threads
      * 1 Thread 0x7ffff7fcf700 (LWP 1234) "program" 0x0000555555555163 in worker_thread ()
        2 Thread 0x7ffff77ce700 (LWP 1235) "program" 0x0000555555555163 in worker_thread ()
      
      • 1
      • 2
      • 3
    2. thread ID:切换到指定ID的线程进行调试。

      示例:

      (gdb) thread 2
      [Switching to thread 2 (Thread 0x7ffff77ce700 (LWP 1235))]
      #0  0x0000555555555163 in worker_thread ()
      
      • 1
      • 2
      • 3
    3. set scheduler-locking [off|on|step]:控制调试时其他线程的执行方式。

      • off:不锁定任何线程,即所有线程都可以继续执行(默认值)。
      • on:只有当前被调试的线程会继续执行。
      • step:在单步执行时,只有当前线程会执行。

      示例:

      (gdb) set scheduler-locking on
      Scheduler locking is on.
      
      • 1
      • 2

    这些命令可以帮助您在调试多线程程序时进行线程的切换和控制,以及查看当前可调试的线程信息。通过合理使用这些命令,您可以更好地理解和调试多线程程序的执行过程。

  • 相关阅读:
    k8s基础:kubectl delete --ignore-not-found参数选项作用
    docker 快速上手
    【开发篇】十八、SpringBoot整合ActiveMQ
    学好Linux的必经之路
    浏览器输入网址后发生了什么?
    消息队列&中间件
    SpringCloud基础7——Redis分布式缓存
    [附源码]计算机毕业设计springboot物业管理系统
    SCI一区 | Matlab实现POA-TCN-BiGRU-Attention鹈鹕算法优化时间卷积双向门控循环单元注意力机制多变量时间序列预测
    rabbitMQ:消费者确认模式
  • 原文地址:https://blog.csdn.net/weixin_44545838/article/details/134023004