文档目录

一、看变量值什么时候变了

// 一个典型的 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         # 读写都暂停(会大幅拖慢执行速度)