测试代码
#include <cstdint>
#include <thread>
int g_v = 0;
void thread_func1()
{
for(int i = 1; i < 100; ++i)
{
if(i % 4 == 0) ++g_v;
}
}
void thread_func2()
{
for(int i = 1; i < 100; ++i)
{
if(i % 2 == 0) g_v++;
}
}
int main(int argc, char*argv[])
{
std::thread t1(thread_func1);
std::thread t2(thread_func2);
t1.join();
t2.join();
}
上面的代码,全局变量g_v在不同线程thread_func1和thread_func2进行修改,显而易见在thread_func1中i是4的倍数时g_v+1,在thread_func2中i是2的倍数是g_v+1,而在复杂的项目中当变量的值出现不在设计范围之内时,那么需要追踪变量值的变化过程,可以使用gdb watch命令来进行排查。
一、设置写观察点
-
watch a //追踪变量的a的值,当a发生改变时程序停下
测试观察上面程序g_v的修改 watch 可以缩写为wa
-
删除观察点或控制观察点
info watch 打印所有观察点
可以根据del 对应编号删除观察点 或 使用disable 和 enable 使观察点失效或生效
-
watch a thread id // 只指针特定线程id生效
可以通过添加thread参数,来指定观察某一线程的修改变化。下面测试只在执行thread_func2线程进行观察g_v的变化。先通过 i thread 打印程序的线程信息获取thread编号,再通过编号设置观察点
二、读观察点和读写观察点
- 读观察点, rwatch(缩写 rw) 命令来设置读观察点,当发生读取指定变量时,程序停下。
- 读写观察点 awatch(缩写 aw) 命令来设置读写观察点,当变量发生读取和改变时,程序停下。
以上俩个命令用法跟写观察点一致。