在开发 C++ 程序时,出现 bug 是常见的。调试是找出程序错误的关键步骤之一。在 Linux 环境下,我们可以使用 GDB (GNU Debugger) 工具来帮助我们进行程序调试。本文将介绍如何在 Linux 下使用 GDB 进行 C++ 程序调试的基本步骤和常用命令。
首先,我们需要在 Linux 系统上安装 GDB。在大多数发行版的软件仓库中都可以找到 GDB。在 Ubuntu 上,可以使用以下命令进行安装:
sudo apt-get install gdb
在进行调试之前,我们需要先用调试符号编译你的 C++ 程序。在编译时,使用 -g
参数来生成调试符号信息。例如,假设你的程序文件名为 “program.cpp” ,可以使用以下命令进行编译:
g++ -g program.cpp -o program
这里如果使用的是cmake:
cmake .. -DCMAKE_BUILD_TYPE=Debug
通过在终端中输入 gdb
命令即可启动 GDB 调试器,并加载你的程序。例如,假设你的可执行文件名为 “program” ,可以在命令行中输入:
gdb program
断点是 GDB 中调试过程中常用的工具之一。通过设置断点,我们可以在程序执行到特定位置时停下来,以便查看程序状态。在 GDB 命令提示符下,可以使用 break
或 b
命令来设置断点。
在特定行上设置断点:
break line_number
例如,要在第 10 行设置断点,可以输入:
break 10
在特定函数中设置断点:
break function_name
例如,要在名为 “myFunction” 的函数中设置断点,可以输入:
break myFunction
调试器已经加载程序并设置好断点,可以通过 run
或 r
命令来执行程序。
run
执行后,程序将开始运行,直到遇到第一个断点或程序结束。
在程序执行过程中,可以使用以下命令来进行调试:
next
或 n
:单步执行程序,将执行到下一行,但不会进入函数。step
或 s
:单步执行程序,将执行到下一行,并进入函数。continue
或 c
:继续执行程序,直到遇到下一个断点或程序结束。print
或 p
:打印变量的值。例如,p variable_name
。backtrace
或 bt
:显示当前调用栈。quit
或 q
:退出 GDB 调试器。此外,还有其他许多 GDB 命令可用以帮助进行调试和查看程序的状态,可以使用 help
命令获取更多信息。
如果程序发生崩溃,GDB 可以帮助我们确定问题所在。当程序异常终止时,可以使用 backtrace
命令查看调用栈,并使用 print
命令查看相关变量的值,以了解导致崩溃的原因。如果可用,还可以使用 core
文件进行更深入的分析。
gdb program core
当调试完成后,可以使用 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"
}
]
}