一、看变量值什么时候变了
// 一个典型的 Bug:某个全局变量被意外修改
int g_counter = 0;
void thread_a() {
for (int i = 0; i < 100; i++) {
g_counter++; // 正常递增
}
}
void thread_b() {
// 某个地方错误地重置了 g_counter
if (some_condition) {
g_counter = 0; // ⚠️ 不该在这重置
}
}
(gdb) watch g_counter # g_counter 的值变化时停下
(gdb) continue
...
# 第一次触发:
Hardware watchpoint 1: g_counter
Old value = 42
New value = 0
# 线程 2 把 g_counter 从 42 改成了 0
(gdb) bt # 看调用栈,找到重置的代码位置
#0 thread_b() at bug.cpp:15 # 第 15 行就是罪魁祸首
其他观察点:
watch expr # 写时暂停(最常用)
rwatch expr # 读时暂停(找谁在读未初始化变量)
awatch expr # 读写都暂停(会大幅拖慢执行速度)