当前位置: 首页 > news >正文

linux strace 跟踪线程,获取线程id--strace跟踪线程系统调用

1.1 背景

有时候需要获取线程id,结合strace工具,跟踪线程内部系统调用过程,但pthread_self()获取到的线程id是在程序内部用的,这里所有说的线程id,指的是能通过pstree查看,ps,htop查看的线程id,有时候用strace跟踪某个线程的内部系统调用,因此获取线程id,这个线程id对应程序和内核来说都是唯一的。

*1.2 获取方法 *

#include

syscall(SYS_gettid) 这个函数的返回值即是线程id,对于内核来说,是唯一的。

1.3 获取线程id之后,用strace跟踪线程,查看线程的系统调用过程

测试例子:

#include

#include

#include

#include

#include

#include

void log_file(char *s)

{

FILE *fd = NULL;

fd = fopen("/tmp/Log.txt", "a+");

time_t cur_time;

struct tm *local_time;

cur_time = time(NULL);

local_time = localtime(&cur_time);

if (fd == NULL)

{

return;

}

fprintf(fd, "%d:%d:%d:%s ", local_time->tm_hour,local_time->tm_min,local_time->tm_sec,s);

fprintf(fd, "\r\n");

fprintf(fd, "\r\n");

fclose(fd);

}

void get_process_pid(const char *function)

{

char msg[1024] = {0};

sprintf(msg,"%s,pid:%d",function,syscall(SYS_gettid));

log_file(msg);

}

void *thread_one(void *arg)

{

while(1)

{

sleep(1);

write(1,"thread_one",strlen("thread_one"));

write(1,"\n",1);

}

pthread_exit(NULL);

}

void *thread_two(void *arg)

{

while(1)

{

sleep(1);

write(1,"thread_two",strlen("thread_two"));

write(1,"\n",1);

}

pthread_exit(NULL);

}

int main(void)

{

pthread_t thread_one_id;

pthread_t thread_two_id;

pthread_create(&thread_one_id,NULL,thread_one,NULL);

pthread_create(&thread_two_id,NULL,thread_two,NULL);

while(1)

{

pthread_join(thread_one_id,NULL);

pthread_join(thread_two_id,NULL);

sleep(1);

}

return 0;

}

gcc test.c -lpthread

./a.out

查看日志文件,各线程id,及对应的函数为:

d5be179cdd95563c5d72cab345bbe373.png

1.4 strace -p pid 跟踪系统调用

81b2f9465d59ccf12fe169572df66775.png

或者:

top -H -p pidof a.out

236ab3d5881c0935653f9fef8f2fabd6.png

htop

058f167c1a999e018b10b7fe2296f1b7.png

相关文章:

  • linux 非root进程,Linux查看非root运行的进程
  • linux下多路径dm不一致,DM多路径存储
  • linux虚拟主机管理平台,8 款顶级的虚拟主机管理系统
  • linux安装无线电软件,Uhd+GNUradio软件无线电平台在Linux系统上安装过程
  • linux主机健康检查,Zabbix监控Tengine 后端服务器健康检查
  • linux邮件查收,Linux mail命令:发送和接收电子邮件
  • 空间坐标转屏幕坐标c语言算法,线性代数——坐标系空间转换
  • openmv4可以c语言开发吗,OpenMV4开发笔记1-感光元件初始化
  • 西安邮电大学c语言期末考试题,西安邮电大学操作系统期末试卷(含答案)
  • android 本地文件读写,Android 读写文件方法汇总
  • android h 游戏下载地址,Android h游戏_如何在Android手机上玩游戏
  • android+捕获google账户+cancel按钮,MVVM: 这是一个android MVVM 框架,基于谷歌dataBinding技术实现...
  • android:stretchcolumns=0,1,2,3,android:stretchColumns用法
  • 鸿蒙os荣耀hdc大会,华为HDC2020开发者大会官宣,EMUI 11、鸿蒙OS 2.0将亮相
  • html模块不因为缩小页面错位,网页缩小放大后错位的解决方法(IE6有待解决)...
  • #Java异常处理
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 【mysql】环境安装、服务启动、密码设置
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • Linux链接文件
  • PhantomJS 安装
  • tensorflow学习笔记3——MNIST应用篇
  • ucore操作系统实验笔记 - 重新理解中断
  • 将 Measurements 和 Units 应用到物理学
  • 人脸识别最新开发经验demo
  • 智能合约Solidity教程-事件和日志(一)
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 积累各种好的链接
  • ​卜东波研究员:高观点下的少儿计算思维
  • (12)Hive调优——count distinct去重优化
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (附源码)php投票系统 毕业设计 121500
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (一)基于IDEA的JAVA基础12
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .net wcf memory gates checking failed
  • .NET多线程执行函数
  • .net和jar包windows服务部署
  • .NET序列化 serializable,反序列化
  • @RequestMapping处理请求异常
  • [04] Android逐帧动画(一)
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色
  • [ACM] hdu 1201 18岁生日
  • [bzoj1324]Exca王者之剑_最小割
  • [bzoj1912]异象石(set)
  • [C++进阶篇]STL中vector的使用
  • [C语言][PTA基础C基础题目集] strtok 函数的理解与应用
  • [EFI]Dell Latitude-7400电脑 Hackintosh 黑苹果efi引导文件
  • [flink总结]什么是flink背压 ,有什么危害? 如何解决flink背压?flink如何保证端到端一致性?
  • [Godot] 3D拾取
  • [Java算法分析与设计]--线性结构与顺序表(List)的实现应用
  • [leetcode]Search a 2D Matrix @ Python
  • [loj#115] 无源汇有上下界可行流 网络流
  • [SpringBoot系列]进阶配置