对于默认的linux系统中,当前可设置的线程名字长度被限制在16个字符。
在未修改前,通过ps -eT查看到的线程名如下:
u0_a6 1204 1214 192 14891352 113620 0 S HeapTaskDaemon
u0_a6 1204 1215 192 14891352 113620 0 S ReferenceQueueD
u0_a6 1204 1216 192 14891352 113620 0 S FinalizerDaemon
u0_a6 1204 1217 192 14891352 113620 0 S FinalizerWatchd
u0_a6 1204 1218 192 14891352 113620 0 S Binder:1204_1
u0_a6 1204 1221 192 14891352 113620 0 S Binder:1204_2
u0_a6 1204 1244 192 14891352 113620 0 S Profile Saver
可通过如下方法修改线程名字的限制
1:修改内核中线程名字长度限制。
如下修改,可更改linux 内核中对线程名字长度的限制。如果只修改到32个字符,修改下面两个点就可以了,超过还需修改其他地方。
diff --git a/include/linux/sched.h b/include/linux/sched.h
index a9427da2dfdd..608017184474 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -212,7 +212,7 @@ struct io_uring_task;
#endif
/* Task command name length: */
-#define TASK_COMM_LEN 16
+#define TASK_COMM_LEN 32
extern void scheduler_tick(void);
diff --git a/include/uapi/linux/cn_proc.h b/include/uapi/linux/cn_proc.h
index db210625cee8..9fc6295e25e2 100644
--- a/include/uapi/linux/cn_proc.h
+++ b/include/uapi/linux/cn_proc.h
@@ -110,7 +110,7 @@ struct proc_event {
struct comm_proc_event {
__kernel_pid_t process_pid;
__kernel_pid_t process_tgid;
- char comm[16];
- char comm[32];
} comm;
struct coredump_proc_event {
2:修改android 源码中对线程名字的限制
2.1 修改bionic目录下pthread对线程名字长度的限制
diff --git a/libc/bionic/pthread_setname_np.cpp b/libc/bionic/pthread_setname_np.cpp
index 5236e4dbe..b3e5b2102 100644
--- a/libc/bionic/pthread_setname_np.cpp
+++ b/libc/bionic/pthread_setname_np.cpp
@@ -41,7 +41,7 @@
#include "pthread_internal.h"
// This value is not exported by kernel headers.
-#define MAX_TASK_COMM_LEN 16
+#define MAX_TASK_COMM_LEN 32
static int __open_task_comm_fd(pthread_t t, int flags, const char* caller) {
char comm_name[64];
2.2 修改art目录下虚拟机中对线程名字长度的限制
diff --git a/libartbase/base/utils.cc b/libartbase/base/utils.cc
index ba62f30bdc..81e568bebe 100644
--- a/libartbase/base/utils.cc
+++ b/libartbase/base/utils.cc
@@ -291,7 +291,7 @@ void SetThreadName(const char* thread_name) {
}
#if defined(linux) || defined(_WIN32)
// pthread_setname_np fails rather than truncating long strings.
- char buf[16]; // MAX_TASK_COMM_LEN=16 is hard-coded in the kernel.
- char buf[32]; // MAX_TASK_COMM_LEN=16 is hard-coded in the kernel.
strncpy(buf, s, sizeof(buf)-1);
buf[sizeof(buf)-1] = '\0';
errno = pthread_setname_np(pthread_self(), buf);
3:修改后的结果,通过ps -eT 查看到线程名如下:
system 1898 1903 187 15396108 104388 0 S Signal Catcher
system 1898 1904 187 15396108 104388 0 S perfetto_hprof_listener
system 1898 1905 187 15396108 104388 0 S ADB-JDWP Connection Control Th
system 1898 1906 187 15396108 104388 0 S Jit thread pool worker thread
system 1898 1907 187 15396108 104388 0 S HeapTaskDaemon
system 1898 1908 187 15396108 104388 0 S ReferenceQueueDaemon
system 1898 1909 187 15396108 104388 0 S FinalizerDaemon
system 1898 1910 187 15396108 104388 0 S FinalizerWatchdogDaemon