我有一个多线程程序,其中每个线程都被分配了一个唯一的名称,帮助pthread_setname_np.如果我使用gdb附加到正在运行的程序,我可以看到它们的名称:

(gdb) i th
  Id   Target Id                                            Frame
* 1    Thread 0x7f883dba1200 (LWP 3867757) "main"           __pthread_clockjoin_ex (threadid=140222870320896, thread_return=0x0, clockid=<optimized out>, abstime=<optimized out>, block=<optimized out>)
    at pthread_join_common.c:145
  2    Thread 0x7f883477f700 (LWP 3867759) "log_aggregator" 0x00007f883dc8026f in __GI___clock_nanosleep (clock_id=clock_id@entry=0, flags=flags@entry=0, req=0x7f883477b220, rem=0x7f883477b220)
    at ../sysdeps/unix/sysv/linux/clock_nanosleep.c:78

注意mainlog_aggregator个名字.但是,如果我创建一个核心转储,然后用gdb加载这个转储,我看不到名称:

$ gcore 3867757
...
Saved corefile core.3867757
...
$ gdb -c core.3867757 my_program
GNU gdb (Ubuntu 10.2-0ubuntu1~20.04~1) 10.2
...
(gdb) i th
  Id   Target Id                           Frame
* 1    Thread 0x7f883dba1200 (LWP 3867757) __pthread_clockjoin_ex (threadid=140222870320896, thread_return=0x0, clockid=<optimized out>, abstime=<optimized out>, block=<optimized out>)
    at pthread_join_common.c:145
  2    Thread 0x7f883477f700 (LWP 3867759) 0x00007f883dc8026f in __GI___clock_nanosleep (clock_id=clock_id@entry=0, flags=flags@entry=0, req=0x7f883477b220, rem=0x7f883477b220)
    at ../sysdeps/unix/sysv/linux/clock_nanosleep.c:78

在这种情况下,我如何获得线程名称?或者我应该以不同的方式创建核心文件,以将它们放入核心文件中?我判断了coredump_filter选项,但没有发现任何相关内容.我还在narkve邮件列表档案中发现了this discussion个,但它没有提供答案,只是暗示这可能是不可能的.

推荐答案

我的下一个问题是,有没有办法使用/proc/self/ask[tid]/comm

/proc/.../comm不是一个真正的文件,它是与按需生成的任务相关的内核数据 struct 的表示形式(当您try 读取该"文件"时).

您要查找的current->comm字段没有在binfmt_elf.c文件中提及(这是其他core转储代码所在的位置),因此它没有保存.

事实上,通过运行一个测试程序来确认这一点很容易,该程序生成一个随机字符串,调用pthread_setname_np,转储core,然后运行strings -a core | grep $string,这不会产生任何输出.

没有fundamental个理由不能将current->comm保存在core中,但目前它不是.

附注:通常看thread apply all where就足以区分不同的线程,因此唯一的线程名称是多余的,也不必要.

Linux相关问答推荐

如何告诉链接器不要在链接的共享库中查找某些符号?

2023 年如何在现代 Linux 上安装 Firebird SQL 版本 3 或 4?

仅查找并保留有效邮箱并删除无效记录,AWK

将所有列乘以一个常数

ln命令报错target not a directory

erlang 格式的 utf8 变为 \x(反斜杠 x)ascii 编码

如何在linux中将2个不同大小的图像(边框,实际图像)合并为1个

为什么 perf 不报告缓存未命中?

Linux/Unix 手册页语法约定

使用 AWS cli 从 AWS 机密管理器解析机密

判断条件是否为假

哪个程序在给定任何文件的情况下创建一个 C 数组?

在 Linux/POSIX 系统上获取用户全名的最简单方法是什么?

kdevtmpfsi 使用整个 CPU

从核心转储中获取堆栈跟踪

如何设置errno值?

在 Linux 上忽略 glob() 中的大小写

Linux 守护进程

如何使用 sed 通过灵活的键和值更改我的配置文件?

计算每个进程打开的文件