在Ubuntu系统中调试使用GCC编译的程序,可以采用以下几种方法:
安装GDB
sudo apt update
sudo apt install gdb
编译程序时添加调试信息
gcc -g -o myprogram myprogram.c
-g选项会在生成的可执行文件中包含调试信息。
启动GDB
gdb myprogram
在GDB中进行调试
break main:在main函数处设置断点。run:运行程序。next:单步执行,不进入函数内部。step:单步执行,进入函数内部。continue:继续运行直到下一个断点。print variable_name:打印变量的值。backtrace:查看调用栈。安装LLDB
sudo apt update
sudo apt install lldb
编译程序时添加调试信息
gcc -g -o myprogram myprogram.c
启动LLDB
lldb myprogram
在LLDB中进行调试
breakpoint set --name main:在main函数处设置断点。run:运行程序。step:单步执行,进入函数内部。next:单步执行,不进入函数内部。continue:继续运行直到下一个断点。frame variable:打印当前栈帧的变量值。bt:查看调用栈。安装Visual Studio Code
sudo snap install --classic code
安装C/C++扩展 在VS Code中打开扩展市场,搜索并安装“C/C++”扩展。
配置launch.json
在VS Code的.vscode目录下创建或编辑launch.json文件,配置调试设置。例如:
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "GCC Debug",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/myprogram",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "/usr/bin/gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "gcc build active file"
        }
    ]
}
配置tasks.json
在.vscode目录下创建或编辑tasks.json文件,配置编译任务。例如:
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "gcc build active file",
            "type": "shell",
            "command": "gcc",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "problemMatcher": [
                "$gcc"
            ]
        }
    ]
}
编译程序时启用AddressSanitizer
gcc -fsanitize=address -o myprogram myprogram.c
运行程序
./myprogram
AddressSanitizer会在运行时检测内存错误,如缓冲区溢出、使用未初始化的内存等,并输出详细的错误报告。
通过以上方法,你可以在Ubuntu系统中有效地调试使用GCC编译的程序。选择适合你需求的方法进行调试即可。