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死锁调试的更多相关文章

  1. gdb可以调试python的pdb么

    1.如题: gdb可以调试python的pdb么? 答案:可以,实验如下. 2.实验: 生成一个a.py代码文件,代码如下: import pdb a = 1 print "111" ...

  2. Window平台Grmon下如何使用gdb进行调试

    Window平台Grmon下如何使用gdb进行调试 1输入cmd命令,打开其窗口,进入你要执行的文件目录下 2.连接开发板,输入grmon –altjtag –u 3.连上后,输入gdb命令 4.再输 ...

  3. GDB代码调试与使用

    GDB代码调试与使用 Linux下GDB调试代码 源代码 编译生成执行文件 gcc -g test.c -o test 使用GDB调试 启动GDB:gdb test 从第一行列出源代码:list 直接 ...

  4. gdb 多线程调试

    gdb 多线程调试 http://hi.baidu.com/hcq11/blog/item/9f5bfc6e696209d680cb4a25.html  http://hi.baidu.com/lit ...

  5. GDB 进行调试 使用心得

    GDB 进行调试 使用心得 转 1: 对于在应用程序中加入参数进行调试的方法:   直接用 gdb app -p1 -p2 这样进行调试是不行的.   需要像以下这样使用:    #gdb app   ...

  6. GDB+GDBServer调试Linux应用程序

    参考:http://blog.csdn.net/shanghaiqianlun/article/details/7820401 一.gdb+gdbserver总体介绍 远程调试环境由宿主机GDB和目标 ...

  7. GDB 多进程调试

    启动: $gdb <file>  || $gdb 然后(gdb)file <file> 运行: (gdb)run <该程序本身的命令行参数> 查看代码: (gdb) ...

  8. DM368 arm板GDB远程调试

    参考: http://www.erchashu.com/wiki/eclipse-cdt-gdb-arm-app-cross-debug 远程调试环境由宿主机GDB和目标机调试stub共同构成,两者通 ...

  9. gdb 远程调试android进程 -转

    什么是gdb 它是gnu组织开发的一个强大的unix程序调试工具,我们可以用它来调试Android上的C.C++代码. 它主要可以做4件事情: 随心所欲地启动你的程序. 设置断点,程序执行到断点处会停 ...

随机推荐

  1. P1547逆转,然后再见

    描述 上届的高三在这个暑假终于要到各个城市奔向他们的大学生活了.奇怪的是学校这次异常阔气,说要用三台车子去载他们上学.上届高三的师兄们异常兴奋--可惜的是临行的时候,学校终于露出它"狰狞&q ...

  2. 离线版centos8安装docker笔记

    嗨嗨哈哈,已经很久没有坐下来胡编乱造一点笔记了,平时云服务器搞惯了,一个命令就安装好了docker了的,但这次生不逢时的新机房就没那么幸运了,有多不逢时超乎想象,不仅仅服务器没有外网,就连周围方圆一公 ...

  3. Python Revisited Day 09 (调试、测试与Profiling)

    目录 9.1 调试 9.1.1 处理语法错误 9.1.2 处理运行时错误 9.1.3 科学的调试 9.2 单元测试 9.3 Profiling 9.1 调试 定期地进行备份是程序设计中地一个关键环节- ...

  4. 使用 windows bat 脚本命令 一键启动MySQL服务

    @echo off rem Copyright (c) 2019 Moses and/or its affiliates. rem Get Administrator Rights >nul 2 ...

  5. 关于 Spring-WebFlux 的一些想法

    本文是本人在知乎提问 spring webflux现在看来是否成功? 下的回答,其他回答也很精彩,如果感兴趣可以查看 现在基于 spring web 的同步微服务有一个非常大的缺陷就是:相对于基于 s ...

  6. 在pycharm中创建py文件——创建你的第一个项目

    开启编程第一步   创建一个项目 创建项目了xdm,敲黑板了哈 首先打开你的pycharm,点击New Project新建项目 就会进入到配置你这个项目所要用到的环境,这里我们用python列举 在L ...

  7. 过年有燃放烟花爆竹禁令那我们用css写一个仙女棒烟花看看吧

    先是去找了一张简易画的烟花照片,可以看出主要结构为歪曲的线条结构. 方案一: 弯曲的线条第一反应到的就是"圆角边框": width: 200px; height: 200px; b ...

  8. 从Base64编码转换为图片文件

    package luckyclient.utils;import java.io.FileInputStream;import java.io.FileOutputStream;import java ...

  9. BIO、NIO、AIO --- 个人理解

    1.前言 什么是 BIO.NIO.AIO  ,不难看出,都是共同的字符IO , IO的意思是input output  ,即输入输出 , 那么 B . N .A 分别指不同的io模型 ,而io又分为 ...

  10. Java语言学习案例雷霆战机

    1.Java雷霆战机学习笔记(一)-资源加载 https://www.toutiao.com/i6631331313259381255/ 2.Java雷霆战机学习笔记(二)-音乐播放 https:// ...