Ubuntu环境下代码调试的常用方法
这是最基础、最快速的调试方式,通过在代码关键位置插入打印语句,输出变量值、函数调用信息或程序状态,帮助定位问题。
print()
函数输出变量值或执行流程。def add(a, b):
print(f"Adding {a} and {b}") # 打印输入参数
result = a + b
print(f"Result: {result}") # 打印计算结果
return result
std::cout
输出信息。#include <iostream>
void add(int a, int b) {
std::cout << "Adding " << a << " and " << b << std::endl; // 打印输入参数
int result = a + b;
std::cout << "Result: " << result << std::endl; // 打印计算结果
}
适用场景:小型项目、快速验证逻辑或临时调试。
import pdb; pdb.set_trace()
设置断点,进入交互式调试模式。常用命令:
n
(next):执行下一行代码;c
(continue):继续执行至下一个断点;s
(step):进入函数内部;p <变量>
:打印变量值;q
(quit):退出调试。pip install ipdb
import ipdb; ipdb.set_trace() # 替换pdb.set_trace()
-g
选项保留调试信息,然后启动调试。常用命令:
break <函数名/行号>
:设置断点;run
:启动程序;next
(单步跳过函数)、step
(单步进入函数);print <变量>
:打印变量值;backtrace
:查看调用堆栈;quit
:退出调试。g++ -g -o my_program my_program.cpp # 编译时添加-g
gdb ./my_program # 启动GDB
(gdb) break main # 设置断点
(gdb) run # 运行程序
适用场景:需要深入分析代码逻辑、变量状态或函数调用流程。
IDE提供图形化界面,简化调试操作,适合大型项目或需要可视化调试的场景。
.vscode/launch.json
配置文件,指定Python解释器和脚本路径,按F5启动调试。{
"version": "0.2.0",
"configurations": [
{
"name": "Python",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal"
}
]
}
.vscode/tasks.json
(编译任务,添加-g
选项)和launch.json
(调试配置,关联tasks),按F5启动调试。通过日志模块记录程序执行过程中的详细信息,便于后续分析问题,比打印调试更灵活、可维护。
logging
模块,设置日志级别(DEBUG/INFO/WARNING/ERROR)和格式。import logging
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(levelname)s - %(message)s'
)
logging.debug("This is a debug message") # 输出调试信息
logging.info("Program started") # 输出普通信息
用于检测内存泄漏、越界访问、非法内存使用等问题,适合C/C++项目。
sudo apt install valgrind
valgrind --leak-check=yes ./my_program # 检测内存泄漏
追踪进程的系统调用和信号,帮助分析文件操作、网络通信等问题。
sudo apt install strace
strace ./my_program # 输出所有系统调用
追踪进程的库函数调用,适合调试依赖外部库的程序。
sudo apt install ltrace
ltrace ./my_program # 输出所有库函数调用
分析程序性能瓶颈(如CPU热点、函数调用耗时),适合优化性能。
sudo apt install linux-tools-common linux-tools-$(uname -r)
sudo perf record ./my_program # 记录性能数据
sudo perf report # 查看性能报告
适用场景:性能优化、内存泄漏检测、系统调用分析。