每天学点GDB(四)

简介: 本文分享如何使用GDB进行多线程调试。

使用GDB进行多线程调试,查看互斥变量。

演示源码如下:

#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

static void* thread_func(void* args);
pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;
int sum = 0;
#define MAX_NUM 10000

int main(int argc, char** argv) {
  int seq = 0;
  pthread_t thread_handle;
  for ( seq = 0; seq < 5; seq++) {
    int* tmp_seq = (int*)malloc(sizeof(int));
    *tmp_seq = seq;
    pthread_create(&thread_handle, NULL, thread_func, tmp_seq);
  }
  while ( 1 ) sleep(20);
  return 0;
}

static void* thread_func(void* args) {
  int thread_seq = *(int*)args;
  free(args);
  
  while ( 1 ) 
    {
      sleep(thread_seq + 2);
      pthread_mutex_lock(&g_mutex);
      if ( sum < MAX_NUM ) 
      sum++;
      else
    sum = 0;
      printf("in thread %d, sum is %d\n", thread_seq, sum);
      pthread_mutex_unlock(&g_mutex);
    }

}

编译

gcc -o demo -g demo.c -lpthread

运行效果如下:

in thread 0, sum is 1
in thread 1, sum is 2
in thread 2, sum is 3
in thread 0, sum is 4
in thread 3, sum is 5
in thread 4, sum is 6
in thread 1, sum is 7
in thread 0, sum is 8
in thread 2, sum is 9

使用GDB进行调试

gdb ./demo
设置断点
gdb) br 32

查看运行的线程

gdb) info threads
 Id   Target Id         Frame 
  6    Thread 0xb5c9eb40 (LWP 914) "demo" 0xb7fdd416 in __kernel_vsyscall ()
  5    Thread 0xb649fb40 (LWP 913) "demo" 0xb7fdd416 in __kernel_vsyscall ()
  4    Thread 0xb6ca0b40 (LWP 912) "demo" 0xb7fdd416 in __kernel_vsyscall ()
  3    Thread 0xb74a1b40 (LWP 911) "demo" 0xb7fdd416 in __kernel_vsyscall ()
* 2    Thread 0xb7ca2b40 (LWP 910) "demo" thread_func (args=0x804a008) at demo.cpp:32
  1    Thread 0xb7ca4700 (LWP 906) "demo" 0xb7fdd416 in __kernel_vsyscall ()

查看当前线程的函数调用堆栈

gdb) bt full

查看哪个线程拥有互斥变量,首先需要知道pthread_mutex_t的具体结构是什么。

gdb) whatis g_mutex
type = pthread_mutex_t
gdb) set print pretty #让GDB输出效果排版的好看一些 gdb) ptype g_mutex type
= union pthread_mutex_t { pthread_mutex_t::__pthread_mutex_s __data; char __size[24]; long __align; }

打印出g_mutex的具体内容:

gdb) p g_mutex
$2 = {
  __data = {
    __lock = 1, 
    __count = 0, 
    __owner = 910, 
    __kind = 0, 
    __nusers = 1, 
    {
      __spins = 0, 
      __list = {
        __next = 0x0
      }
    }
  }, 
  __size = "\001\000\000\000\000\000\000\000\216\003\000\000\000\000\000\000\001\000\000\000\000\000\000", 
  __align = 1
}

各位看官,注意上述输出中,owner表示当前拥有g_mutex的线程。

那么谁是910呢,上面用”info threads"只输出了1,2,3,4,5,6无法对应,ok. 用点top小技巧,

top -H -p 906

906表示demo的进程ID,-H表示打印出所有的线程。

当前拥有g_mutex是910,那么应该是第二号线程,即thread_seq为0的线程。

如果想在程序运行的时候知道当前线程中类似于top输出的pid值,可以通过如下方法。

/*#method 1*/
pid_t gettid(void);

/**************************************
*#method 2 using the following system call 
**************************************/
#include <sys/syscall.h>
pid_t tid = (pid_t) syscall (SYS_gettid);

 最后需要提醒的是,当设定断点停下来的时候,其它线程其实还是可以继续运行的。如果只想让当前线程可以运行,其它的全部停下来的话。请用下列的指令。

gdb) set scheduler-locking on

关于这个内容,可以参考链接http://sourceware.org/gdb/onlinedocs/gdb/All_002dStop-Mode.html

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
3天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
13天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1292 5
|
12天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1319 87
|
2天前
|
弹性计算 安全 数据安全/隐私保护
2025年阿里云域名备案流程(新手图文详细流程)
本文图文详解阿里云账号注册、服务器租赁、域名购买及备案全流程,涵盖企业实名认证、信息模板创建、域名备案提交与管局审核等关键步骤,助您快速完成网站上线前的准备工作。
178 82
2025年阿里云域名备案流程(新手图文详细流程)
|
2天前
|
自然语言处理 前端开发
基于Electron38+Vite7.1+Vue3+Pinia3+ElementPlus电脑端admin后台管理模板
基于最新版跨平台框架Electron38整合Vite7+Vue3+ElementPlus搭建轻量级客户端中后台管理系统解决方案。
163 86