• 【C++】linux下的gdb程序调试


    【C++】Linux 下的 GDB 程序调试

    在开发 C++ 程序时,出现 bug 是常见的。调试是找出程序错误的关键步骤之一。在 Linux 环境下,我们可以使用 GDB (GNU Debugger) 工具来帮助我们进行程序调试。本文将介绍如何在 Linux 下使用 GDB 进行 C++ 程序调试的基本步骤和常用命令。

    1. 安装 GDB

    首先,我们需要在 Linux 系统上安装 GDB。在大多数发行版的软件仓库中都可以找到 GDB。在 Ubuntu 上,可以使用以下命令进行安装:

    sudo apt-get install gdb
    
    • 1

    2. 编译程序

    在进行调试之前,我们需要先用调试符号编译你的 C++ 程序。在编译时,使用 -g 参数来生成调试符号信息。例如,假设你的程序文件名为 “program.cpp” ,可以使用以下命令进行编译:

    g++ -g program.cpp -o program
    
    • 1

    这里如果使用的是cmake:

    cmake .. -DCMAKE_BUILD_TYPE=Debug
    
    • 1

    3. 启动 GDB

    通过在终端中输入 gdb 命令即可启动 GDB 调试器,并加载你的程序。例如,假设你的可执行文件名为 “program” ,可以在命令行中输入:

    gdb program
    
    • 1

    4. 设置断点

    断点是 GDB 中调试过程中常用的工具之一。通过设置断点,我们可以在程序执行到特定位置时停下来,以便查看程序状态。在 GDB 命令提示符下,可以使用 breakb 命令来设置断点。

    • 在特定行上设置断点:

      break line_number
      
      • 1

      例如,要在第 10 行设置断点,可以输入:

      break 10
      
      • 1
    • 在特定函数中设置断点:

      break function_name
      
      • 1

      例如,要在名为 “myFunction” 的函数中设置断点,可以输入:

      break myFunction
      
      • 1

    5. 执行程序

    调试器已经加载程序并设置好断点,可以通过 runr 命令来执行程序。

    run
    
    • 1

    执行后,程序将开始运行,直到遇到第一个断点或程序结束。

    6. 调试命令

    在程序执行过程中,可以使用以下命令来进行调试:

    • nextn:单步执行程序,将执行到下一行,但不会进入函数。
    • steps:单步执行程序,将执行到下一行,并进入函数。
    • continuec:继续执行程序,直到遇到下一个断点或程序结束。
    • printp:打印变量的值。例如,p variable_name
    • backtracebt:显示当前调用栈。
    • quitq:退出 GDB 调试器。

    此外,还有其他许多 GDB 命令可用以帮助进行调试和查看程序的状态,可以使用 help 命令获取更多信息。

    7. 调试崩溃

    如果程序发生崩溃,GDB 可以帮助我们确定问题所在。当程序异常终止时,可以使用 backtrace 命令查看调用栈,并使用 print 命令查看相关变量的值,以了解导致崩溃的原因。如果可用,还可以使用 core 文件进行更深入的分析。

    gdb program core
    
    • 1

    8. 结束调试

    当调试完成后,可以使用 quit 命令退出 GDB 调试器。

    以上是在 Linux 环境下使用 GDB 调试 C++ 程序的基本步骤和常用命令。掌握了这些基本技巧,可以更高效地诊断和修复程序中的错误。希望这篇博客对你在 C++ 程序调试方面有所帮助。

    附:如使用vscode的界面化调试,其json为:

    {
        // 使用 IntelliSense 了解相关属性。 
        // 悬停以查看现有属性的描述。
        // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
        "version": "0.2.0",
        "configurations": [
            {
                "name": "(gdb)start",
                "type": "cppdbg",
                "request": "launch",
                "program": "/home/kylin/work/sophon-stream/sophon-stream/samples/arcfaceDemo/build/arcface_demo",
                "args": [],
                "stopAtEntry": false,
                "cwd": "/home/kylin/work/sophon-stream/sophon-stream/samples/arcfaceDemo/build/",
                "environment": [],
                "externalConsole": false,
                "MIMode": "gdb",
                "setupCommands": [
                    {
                        "description": "为 gdb 启用整齐打印",
                        "text": "-enable-pretty-printing",
                        "ignoreFailures": true
                    },
                    {
                        "description": "将反汇编风格设置为 Intel",
                        "text": "-gdb-set disassembly-flavor intel",
                        "ignoreFailures": true
                    }
                ],
                "miDebuggerPath": "/usr/bin/gdb"
            }
    
        ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
  • 相关阅读:
    运筹说 第71期|论文速读之时间背包问题
    defer和async
    c-实用调试技巧-day5
    孙卫琴的《精通Vue.js》读书笔记-自定义指令范例:v-drag指令
    线程面试高频问题
    如何设计一套单点登录系统 ?
    Vite 与 Vue Cli 对比 - 尤雨溪: Vite 会取代 vue-cli 吗?
    hive 之with as 和create view 和create temporary table用法
    操作符知识你会了,那表达式求值呢?
    synchronized 的实现原理以及锁升级详解
  • 原文地址:https://blog.csdn.net/hh1357102/article/details/134538128