设置观察点

发布时间 2024-01-05 19:04:01作者: 橙皮^-^

测试代码

#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) 命令来设置读写观察点,当变量发生读取和改变时,程序停下。
    以上俩个命令用法跟写观察点一致。