要在不使用打印日志的情况下完全使用 GDB 调试程序,可以按照以下步骤进行操作:
1. 编译程序时添加调试信息
确保在编译代码时加入 -g
选项以生成带有调试信息的可执行文件。例如:
bash
g++ -g -o xxxInfo main.cpp xxxInfo.cpp ...
如果你使用的是 qmake
(如 .pro
文件),确保没有禁用调试信息。默认情况下,Qt 的 qmake
在 Debug 模式下会自动添加 -g
。
2. 启动 GDB 并加载程序
运行以下命令启动 GDB 并加载你的程序:
bash
gdb ./xxxinfo
3. 设置断点
在函数上设置断点
-
按函数名设置断点:
gdb
break `function_name`
例如:
gdb
break `xxxInfo::parseXxxData`
-
查看类中的所有函数(用于确定要打断点的函数):
gdb
info functions xxxInfo
在某一行代码设置断点
- 按文件和行号设置断点:
gdb
例如:break filename.cpp:line_number
gdb
break xxxInfo.cpp:45
查看已设置的断点
gdb
info breakpoints
删除或禁用断点
- 删除某个断点:
gdb
delete breakpoint <breakpoint_number>
- 禁用某个断点:
gdb
disable breakpoint <breakpoint_number>
- 启用某个断点:
gdb
enable breakpoint <breakpoint_number>
4. 运行程序并触发断点
在 GDB 中运行程序:
gdb
run
程序会在你设置的断点处暂停。
5. 单步调试
- 逐行执行代码(进入函数):
gdb
step
- 逐行执行代码(跳过函数调用):
gdb
next
- 继续执行直到下一个断点或程序结束:
gdb
continue
6. 查看变量、函数参数和返回值
查看变量值
gdb
print variable_name
例如:
gdb
print xxxId
查看局部变量
gdb
info locals
查看函数参数
当程序停在函数入口时,可以使用:
gdb
info args
查看函数返回值(仅限最近一次函数调用)
如果函数已经返回,可以通过寄存器查看返回值(适用于 x86 架构):
gdb
print $eax
如果是结构体或大对象,可能需要查看多个寄存器或内存地址。
7. 其他常用调试命令
-
查看当前堆栈信息:
gdb
backtrace
-
切换堆栈帧:
gdb
frame <frame_number>
-
查看源代码:
gdb
list
-
查看内存内容:
gdb
x/<format> <address>
例如:
gdb
x/10xw 0x7fffffffe000 # 查看 10 个字(word)的内存内容
示例流程
假设你想调试 xxx
Info.cpp 中的 parsexxxData
函数:
- 设置断点:
gdb
break xxxInfo.cpp:45
- 运行程序:
gdb
run
- 程序停在断点后,查看变量:
gdb
print xxxName
- 单步执行:
gdb
step
- 继续执行到下一个断点:
gdb
continue
通过这些步骤,你可以完全依赖 GDB 调试你的程序,无需插入任何日志输出语句。