【Linux】进程ID和线程ID在日志中的体现

在分析内核打印日志流程的时候,发现有时候同一个进程函数调用关系比较混乱(因为只打印了进程号),现象就是一个函数走着走着不知道走哪里去了。

另一个现象是,在Linux启动Firefox的时候,启了大概80个进程,其实这个时候也有点怀疑:

Linux内核裁剪后编译重启查看日志_哔哩哔哩_bilibili

有点类似开始分析打印日志的时候,有多进程时,如果未把多进程的ID打印出来,是不太容易分析出来函数调用流程的,如下图所示红色方框这个字段,(注意,这图未针对函数调用关系混乱)

本来想的是,会不会是因为进程内多线程函数调用导致?

然后在网上搜索了下:看到一篇文章:

https://zhuanlan.zhihu.com/p/673084366

然后看了下fork.c的copy_process,然后看到创建进程后的pid和tgid的设置,如下图所示:

这里可以看出,在创建进程的时候(实际有可能是线程) ,这个pid是不断变化的,但是如果是创建线程,tgid的值实际上是父进程的值,从上图中可以看出,父进程的tgid值是等于pid的值的(2507行和2516行)。

那么在原有的日志打印宏基础上需要添加task_struct->pgid的值,并且需要验证是不是这回事(其实原来的宏里已经包含这一字段):

这里需要注意的是:

1、测试的时候打印日志开关:touch LOG_MORE

2、日志增长速度很快,日志打印开关打开了10秒,在这10秒内打开FireFox,然后访问百度,百度网页打开后,马上关闭日志打印:touch LOG_STOP,这个过程持续10多秒,日志63M:

然后查找进程名为:firefox的进程

基于上面的描述,这个进程应该是主进程,再找找看看有没有线程:

等等。

这个pr_info_self打印宏其实还挺厉害,尤其是结合内核裁剪后,说不定更厉害。。。。。

感谢阅读。

相关推荐
梦想的初衷~2 分钟前
CESM2 完整实操学习大纲:环境搭建、案例运行、耦合模拟与代码开发
linux·地球系统模式·cesm2·气候模式模拟·clm 陆面模型·cam 大气模式·模式移植编译
无敌糖果3 分钟前
Nginx 后端error.log疯狂刷盘问题分析
运维·nginx
a5986527 分钟前
原生ARM云手机实测|ARM服务器底座,主流手游兼容性、闪退、帧率专项测试
服务器·arm开发·智能手机·云手机
a5986528 分钟前
工作室批量多开云手机|ARM 服务器方案成本解析、架构选型与踩坑总结
服务器·arm开发·智能手机·云手机
逐流人11 分钟前
ELK企业级日志分析系统:从零搭建集中化日志平台
运维·elk·云原生·云计算·日志分析
叼烟扛炮13 分钟前
Linux 学习笔记(三):文件管理与文本查看
linux·笔记·学习
Iruoyaoxh17 分钟前
linux-进程概念
linux
AbandonForce17 分钟前
Linux 网络:HTTP(一)基础与报文结构
linux·网络·http
Sayai17 分钟前
Elasticsearch Rollup 汇算索引实战:监控指标多粒度预聚合查询,附 painless 时间窗取每日最新值
大数据·运维·elasticsearch·搜索引擎·性能优化·监控
FfHUCisI25 分钟前
无锁 Reactor 网络模型与 gnet / evio 架构拆解
服务器·开发语言·后端·golang