linux线程命名和得到线程名

news2024/11/26 13:04:16

思考了一下,决定单独记录一下这个话题。
因为这里我花费了许多时间来知道,原来线程名是有长度限制的。
也是为了以后来完善。

线程命名的重要性

作为系统工程师,我们的任务,不仅是调优,实际上更多时修是在面对系统性的bug,责任的界定是吃力不讨好的事。
所以,我们往往不得不采取守势,也是我给起的名字:划格子。
这个容易理解,程序员,大多喜欢格子衫。。。

当然我的意思是,划清边界。
线程是很重要一种边界。所以,给线程起名,是第一件我们要做的事。
一方面,当然要指出哪些没有命名,另一方面,最好制定Policy,要求所有的主动对象,必须继承自我们自己的线程框架的类。

如果这样的情况,线程无名,则你可以直接拒绝启动。

线程名的合法性检查

除了空名称,线程名,不能超过15个字符。

那么,这里的成员函数,原来写的就不是很严谨:

void Thread::setName(const std::string& name_in)
{
    name = name_in;
}
void Thread::start()
{
    pthread_setname_np(thread.native_handle(), name.c_str());
}

正确的应当如下。

void Thread::setName(const std::string& name_in)
{
    //If thread name>15 characters, will be truncated
    if (name_in.length() > 15) {
        name = name_in.substr(0, 15);
    } else {
        name = name_in;
    }
}
void Thread::start()
{
    int rc = pthread_setname_np(thread.native_handle(), name.c_str());
    if (0!=rc) {
        std::cerr << "ERROR: Set thread name failed for thread " << name << ": " << std::strerror(errno) << std::endl;
    }
}

错误捕获中,得到线程名

pthread_getname_np

 void ExceptionHandler::SignalHandler(int sig, siginfo_t* info, void* uc) 
 {
    printf("Breakpad: Receive signo: %u, pid: %d, tid: %ld, sender pid: %d, sender uid: %d, fault addr: %p\n",
            info->si_signo, getpid(), syscall(SYS_gettid), info->si_pid, info->si_uid, info->si_addr);
     if (info->si_signo == SIGINT)     {
         printf("Breakpad: Do not deal user int!\n");         return;
     }
      char thread_name[16];
      int ret = pthread_getname_np(pthread_self(), thread_name, sizeof(thread_name));
      if (ret == 0) {
          printf("[SignalHandler]Current thread name: %s\n", thread_name);
      } else {
          printf("[SignalHandler]Failed to get thread name, error: %d\n", ret);
      }
  }

得到线程pid

注意前述代码中,得到线程pid的位置:
syscall(SYS_gettid)

而不是使用C++的threadid:
std::thread thread;
thread = std::move(std::thread(f));
std::thread::id threadid = thread.get_id();

综合

代码这样修改后,在 htop中,能看到所有的线程的名称和pid,如果这里再结合perf或lttng,就可以将这些信息关联起来。
如果某个线程崩溃,在错误捕获中,一般能得到该线程的 pid,当然可以将这个pid也写入到日志中。
当然,这不是万能的,OS的错误捕获,一般的确是在出错的线程,但如果该线程处理Z或T或其它特殊的异常状态,OS会接管,然后复制出一个一模一样的新的线程栈,这里虽然我们得到的还是该线程的名字,调用栈也类似,但并不是真正的出错的第一现场。这里要稍加注意。
但一般的情况,还是可以基本达到目标的。

例如,这时,可以在程序,进入所谓的巡航状态后,
先用
ps -eo pid,tid,pri,rtprio,comm -L
将当时的所有的线程的信息存盘。
在崩溃时,就能知道,是哪个线程出的错。如果这个线程ID是凭空出现的,并且与之有重名的,那么这个可能就是OS干预,导致的转世重生的那个线程。
当然,这时,也能得到一些信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2247858.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

H.264/H.265播放器EasyPlayer.js网页全终端安防视频流媒体播放器关于iOS不能系统全屏

在数字化时代&#xff0c;流媒体播放器已成为信息传播和娱乐消遣的主流载体。随着技术的进步&#xff0c;流媒体播放器的核心技术和发展趋势不断演变&#xff0c;影响着整个行业的发展方向。 EasyPlayer播放器属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持…

【数据结构】二叉树的建立与遍历

1.二叉树 1.1 二叉树的定义 首先先来回顾一下什么是二叉树&#xff1a; 二叉树&#xff08;binary tree&#xff09;是指树中节点的度不大于2的有序树&#xff0c;它是一种最简单且最重要的树。二叉树的递归定义为&#xff1a;二叉树是一棵空树&#xff0c;或者是一棵由一个根…

51单片机基础 06 串口通信与串口中断

目录 一、串口通信 二、串口协议 三、原理图 四、串口通信配置参数 1、常用的串行口工作方式1 2、数据发送 3、数据接收 4、波特率计算 5、轮询接收 6、中断接收 一、串口通信 串口通信是一种常见的数据传输方式&#xff0c;广泛用于计算机与外部设备或嵌入式系统之间…

智慧环保大数据解决方案

1. 智慧环保概述 智慧环保是“数字环保”的延伸&#xff0c;借助物联网技术整合环境监控对象&#xff0c;通过云计算实现环境管理与决策的智能化。其核心在于快速感知城市环境指标&#xff0c;保障人体健康与生命安全。 2. 智慧环保总体目标 智慧环保的总体目标是建立全面感…

如何使用identify_debugger去抓取信号

含有identify抓取信号的fpga版本做好了&#xff0c;那如何使用他去抓取信号呢&#xff1f; 1.terminal打开identify_debugger&#xff0c;直接这个命令identify_debugger&#xff0c;前提是你安装了synopsys的synaplify的软件&#xff0c;一般做芯片的都会有的哈。 2.打开界面后…

从 Llama 1 到 3.1:Llama 模型架构演进详解

编者按&#xff1a; 面对 Llama 模型家族的持续更新&#xff0c;您是否想要了解它们之间的关键区别和实际性能表现&#xff1f;本文将探讨 Llama 系列模型的架构演变&#xff0c;梳理了 Llama 模型从 1.0 到 3.1 的完整演进历程&#xff0c;深入剖析了每个版本的技术创新&#…

windows基础

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…

Jmeter中的配置原件

2&#xff09;配置原件 1--CSV Data Set Config 用途 参数化测试&#xff1a;从CSV文件中读取数据&#xff0c;为每个请求提供不同的参数值。数据驱动测试&#xff1a;使用外部数据文件来驱动测试&#xff0c;使测试更加灵活和可扩展。 配置步骤 准备CSV文件 创建一个CSV文…

c++基础知识复习(2)

1. 多态的虚函数的意义 1 案例&#xff1a;父类和子类有同名函数&#xff0c;但是功能不一样&#xff0c;但是同时&#xff0c;子类又继承了父类&#xff0c;就会导致调用的错误&#xff0c;想调用子类的同名函数&#xff0c; 但是在某些情况下&#xff0c;会错误调用父类的同…

NVR管理平台EasyNVR多个NVR同时管理:全方位安防监控视频融合云平台方案

EasyNVR是基于端-边-云一体化架构的安防监控视频融合云平台&#xff0c;具有简单轻量的部署方式与多样的功能&#xff0c;支持多种协议&#xff08;如GB28181、RTSP、Onvif、RTMP&#xff09;和设备类型&#xff08;IPC、NVR等&#xff09;&#xff0c;提供视频直播、录像、回放…

SpringBoot3+Jasypt如何在配置文件中对数据库的密码进行加密以防止密码泄露

在 Spring Boot 3 中&#xff0c;可以通过jasypt-spring-boot-starter对配置文件中的数据库密码或者其他重要密码进行加密&#xff0c;操作非常简单&#xff0c;可以有效防止密码泄露&#xff1a; 1. 使用 Jasypt 加密 添加依赖 在 pom.xml 中添加 Jasypt 依赖&#xff1a; …

ARM(安谋) China处理器

0 Preface/Foreword 0.1 参考博客 Cortex-M23/M33与STAR-MC1星辰处理器 ARM China&#xff0c;2018年4月established&#xff0c;独立运行。 1 处理器类型 1.1 周易AIPU 1.2 STAR-MC1&#xff08;星辰处理器&#xff09; STAT-MC1&#xff0c;主要为满足AIOT应用性能、功…

Adobe Illustrator 2024 安装教程与下载分享

介绍一下 下载直接看文章末尾 Adobe Illustrator 是一款由Adobe Systems开发的矢量图形编辑软件。它广泛应用于创建和编辑矢量图形、插图、徽标、图标、排版和广告等领域。以下是Adobe Illustrator的一些主要特点和功能&#xff1a; 矢量绘图&#xff1a;Illustrator使用矢量…

CVE-2022-26201

打开是这么个页面 左上角找到Admin访问 里面有个Add Users&#xff0c;访问一下&#xff0c;能创建用户&#xff0c;有个能上传图片的地方 普通的一句话木马无法访问flag&#xff0c;需要创建一个权限马 <?php system($_GET[1]);phpinfo();?> 因为只能上传jpg形式的文…

使用 OpenCV 进行视频中的行人检测

在计算机视觉领域&#xff0c;行人检测是一个重要的研究方向&#xff0c;它在视频监控、自动驾驶、人机交互等领域都有着广泛的应用。本文将介绍如何使用 OpenCV 库来实现视频中的行人检测。 环境准备 首先&#xff0c;我们需要安装 OpenCV 库。可以通过以下命令来安装&#…

【K8s】专题十五(4):Kubernetes 网络之 Calico 插件安装、切换网络模式、卸载

本文内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01; 如果对您有帮助&#xff0c;烦请点赞、关注、转发、订阅专栏&#xff01; 专栏订阅入口 | 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 | 往期精彩文章 【Docker】&#xff08;全…

鸿蒙面试题-某迈-2024年11月22日

某迈-2024年11月22日 1. 自我介绍 2. 鸿蒙中地图功能如何实现&#xff0c;申请流程是什么样的 主要通过 集成 Map Kit 的功能来实现Map Kit 功能很强大&#xff0c;比如有 创建地图&#xff1a;呈现内容包括建筑、道路、水系等。地图交互&#xff1a;控制地图的交互手势和交…

微软要求 Windows Insider 用户试用备受争议的召回功能

拥有搭载 Qualcomm Snapdragon 处理器的 Copilot PC 的 Windows Insider 计划参与者现在可以试用 Recall&#xff0c;这是一项臭名昭著的快照拍摄 AI 功能&#xff0c;在今年早些时候推出时受到了很多批评。 Windows 营销高级总监 Melissa Grant 上周表示&#xff1a;“我们听…

【Android】静态广播接收不到问题分析思路

参考资料&#xff1a; Android 静态广播注册流程(广播2)-CSDN博客 Android广播发送流程(广播3)_android 发送广播-CSDN博客 https://zhuanlan.zhihu.com/p/347227068 在Android中&#xff0c;静态广播如果静态广播不能接收&#xff0c;我们可以从整个流程中去分析&#xff…

非递归遍历二叉树(数据结构)

我的博客主页 非递归遍历二叉树 前序遍历&#xff08;迭代&#xff09;中序遍历&#xff08;迭代&#xff09;后续遍历&#xff08;迭代&#xff09; 二叉树的遍历方式有&#xff1a;前序遍历、中序遍历、后续遍历&#xff0c;层序遍历&#xff0c;而树的大部分情况下都是通过递…