GDB死锁调试
1、测试代码
代码中开启两个线程,加锁后轮流输出数据,其中一个线程误将pthread_mutex_unlock(),写成pthread_mutex_lock()代码如下:
int g_tickets = 100;
pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;
void* thread_fun1(void * arg)
{
while(true)
{
pthread_mutex_lock(&g_mutex);
if(g_tickets>0)
{
cout<<"thread 1 sell tickets:"<<g_tickets--<<endl;
}
else
{
//pthread_mutex_unlock(&g_mutex);
pthread_mutex_lock(&g_mutex);//误将pthread_mutex_unlock写成pthread_mutex_lock
break;
}
//pthread_mutex_unlock(&g_mutex);
pthread_mutex_lock(&g_mutex);//误将pthread_mutex_unlock写成pthread_mutex_lock
}
return (void*)1;
}
void* thread_fun2(void * arg)
{
while(true)
{
pthread_mutex_lock(&g_mutex);
if(g_tickets>0)
{
cout<<"thread 2 sell tickets:"<<g_tickets--<<endl;
}
else
{
pthread_mutex_unlock(&g_mutex);
break;
}
pthread_mutex_unlock(&g_mutex);
}
return (void*)2;
}
int main()
{
pthread_t tid1,tid2;
void *ret1 = nullptr;
void *ret2 = nullptr; pthread_create(&tid1,nullptr,thread_fun1,nullptr);
pthread_create(&tid2,nullptr,thread_fun2,nullptr); pthread_join(tid1,&ret1);
pthread_join(tid2,&ret2); cout<<"ret1:"<<ret1<<endl;
cout<<"ret2:"<<ret2<<endl;
return 0;
}
makefile文件
cc =g++ -g -std=c++2a -fmodules-ts
prom = main
deps = $(shell find ./ -name "*.h")
src = $(shell find ./ -name "*.cpp")
obj = $(src:%.cpp=%.o)
lib = -lboost_thread \
-lboost_system \
-pthread $(prom):$(obj)
$(cc) -o $(prom) $(obj) $(lib)
%.o:%.cpp $(deps)
$(cc) -c $< -o $@ $(lib)
2、编译并运行程序
make
./main
输入结果如下
3、调试
- 查找测试程序进程号
ps aux | grep main
- 通过gdb attach死锁进程。
sudo gdb main 23848
- 使用info threads命令列出所有线程信息
- 切换到线程2 ,并打印调用栈
- 切换到线程3,并打印调用栈
- 打印互斥变量信息,发现锁g_mutex被线程23849获得。而线程23849和23850均在尝试获得锁g_mutex。
- 通过源码分析,发现thread_fun1中g_mutex在获得锁之后,后续并没有释放锁g_mutex,而且在继续申请锁g_mutex。明显不合理。
GDB死锁调试的更多相关文章
- gdb可以调试python的pdb么
1.如题: gdb可以调试python的pdb么? 答案:可以,实验如下. 2.实验: 生成一个a.py代码文件,代码如下: import pdb a = 1 print "111" ...
- Window平台Grmon下如何使用gdb进行调试
Window平台Grmon下如何使用gdb进行调试 1输入cmd命令,打开其窗口,进入你要执行的文件目录下 2.连接开发板,输入grmon –altjtag –u 3.连上后,输入gdb命令 4.再输 ...
- GDB代码调试与使用
GDB代码调试与使用 Linux下GDB调试代码 源代码 编译生成执行文件 gcc -g test.c -o test 使用GDB调试 启动GDB:gdb test 从第一行列出源代码:list 直接 ...
- gdb 多线程调试
gdb 多线程调试 http://hi.baidu.com/hcq11/blog/item/9f5bfc6e696209d680cb4a25.html http://hi.baidu.com/lit ...
- GDB 进行调试 使用心得
GDB 进行调试 使用心得 转 1: 对于在应用程序中加入参数进行调试的方法: 直接用 gdb app -p1 -p2 这样进行调试是不行的. 需要像以下这样使用: #gdb app ...
- GDB+GDBServer调试Linux应用程序
参考:http://blog.csdn.net/shanghaiqianlun/article/details/7820401 一.gdb+gdbserver总体介绍 远程调试环境由宿主机GDB和目标 ...
- GDB 多进程调试
启动: $gdb <file> || $gdb 然后(gdb)file <file> 运行: (gdb)run <该程序本身的命令行参数> 查看代码: (gdb) ...
- DM368 arm板GDB远程调试
参考: http://www.erchashu.com/wiki/eclipse-cdt-gdb-arm-app-cross-debug 远程调试环境由宿主机GDB和目标机调试stub共同构成,两者通 ...
- gdb 远程调试android进程 -转
什么是gdb 它是gnu组织开发的一个强大的unix程序调试工具,我们可以用它来调试Android上的C.C++代码. 它主要可以做4件事情: 随心所欲地启动你的程序. 设置断点,程序执行到断点处会停 ...
随机推荐
- 【LeetCode】200. Number of Islands 岛屿数量
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS BFS 日期 题目地址:https://le ...
- 「实用」打造自我感觉非常漂亮的Mac终端
背景 (今天我是一个美妆博主) 突然发现自己使用的iterm2终端样式有些朴素,为了让她看起来花枝招展的,我决定给她打扮打扮.毕竟每天面对她的时间比对象还多-- 效果对比 因为每个人的喜好都不一样,所 ...
- 一个简单的js时钟
演示地址 代码 <html> <head> <title> Nonove js clock 时钟 </title> <script type=&q ...
- Chapter 3 Observational Studies
目录 概 3.1 3.2 Exchangeability 3.3 Positivity 3.4 Consistency First Second Fine Point 3.1 Identifiabil ...
- Proximal Algorithms 1 介绍
目录 定义 解释 图形解释 梯度解释 一个简单的例子 Proximal Algorithms 定义 令\(f: \mathrm{R}^n \rightarrow \mathrm{R} \cup \{+ ...
- Reflection 基础知识(二)
Proxy 定义 Proxy用于修改对象的某些行为,获取值,设置值等 let p = new Proxy(target, handler); target 用Proxy包装的目标对象(可以是任何类型的 ...
- python 脚本或者flask 注册成为windows服务
分享下脚本注册成为win服务 这个借鉴了其他大佬得 具体是谁忘记了有机会推荐 今天也是找了之前得改出来得 首先安装三个模块 最后一个是定时任务如果不需要可以不装 pip install psutil ...
- Ranger-AdminServer安装Version2.0.0
Ranger-AdminServer安装, 对应的Ranger版本2.0.0. 1.安装规划 RangerAdmin安装依赖如下组件: mysql solr IP/机器名 安装软件 运行进程 dap2 ...
- RSA非对称加密算法实现:Python
RSA是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院工作.RSA ...
- Springboot项目引入druid安装部署使用
一.maven引入依赖,数据库驱动根据项目需求自行引入 <!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot ...