gdb多线程调试

gdb多线程调试
1.背景
采用gdb调试代码时,经常遇到多线程的情况,但对gdb在多线程中的切换并不熟悉,导致排查问题很困难,所以整理下多线程调试方法。
2.gdb多线程调试指令及简介
调试代码时先将代码跑起来,然后ctrl+c将代码中断。
bt打印出堆栈时,f 栈编号 可以直接执行该函数
查看线程信息:i threads [id …]
不指定id就查看所以的线程信息。
切换线程:thread id
在多个线程执行指令:thread apply all bt
锁定当前线程,暂停其它线程:set scheduler-locking on,
如果只想n或者s单步调试锁定线程时:set scheduler-locking step
取消锁定set scheduler-locking off
注意:打了断点后,执行到断点会暂停所有线程。
3.代码示例

#include<iostream>
#include<thread>
#include<mutex>
using namespace std;
mutex lock1;
int cnt = 0;
void fun1()
{
	while(1){
		{
			lock_guard<mutex> l(lock1);
			std::cout << "callfun1 cnt:"<< cnt++ << std::endl;
		}
		std::this_thread::sleep_for(std::chrono::milliseconds(500));
	}
}
void fun2()
{
	while(1){
			{
				lock_guard<mutex> l(lock1);
				std::cout << "callfun2 cnt:"<< cnt++ << std::endl;
			}
			std::this_thread::sleep_for(std::chrono::milliseconds(500));
			
			}
}

int main()
{
	thread thd1(fun1);
	thread thd2(fun2);
	thd1.join();
	thd2.join();
	cout << "thread 1 and 2 is end" << endl;
	return 0;
}

查看进程信息
在这里插入图片描述
切换进程
在这里插入图片描述
堆栈打印和进入函数
在这里插入图片描述
线程锁定前效果:
在这里插入图片描述
线程锁定后效果:
在这里插入图片描述

参考文档:
https://github.com/hellogcc/100-gdb-tips
https://www.cnblogs.com/hellokitty2/p/16869185.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值