如何在androidndk中获取线程名称
How to obtain thread name in android ndk
在我的 Android 项目中,我使用 std::thread。
我也在一些 Linux 和 OSX 项目中使用相同的 C++ 代码。
出于调试目的,我想评估人类可读的线程名称,我通过调用 pthread_setname_np()
(因为缺少 std::thread::set_name()
)来实现。
如果稍后出现调试输出,我会尝试通过调用 pthread_getname_np()
来获取当前线程名称,这很有效,例如在 Linux 目标上。
但令我惊讶的是,Android Ndk pthread.h
中没有 pthread_getname_np()
,例如ndk-bundle/platforms/android-19/arch-arm/usr/include/pthread.h
也不在 ndk-bundle/platforms/android-21/arch-arm/usr/include/pthread.h
一个愚蠢的前向声明尝试:
extern "C" int pthread_getname_np(pthread_t, char*, size_t);
因链接器错误而失败(如预期)。
知道如何从 C/C++ 代码中获取 Android 中当前线程的人类可读名称吗?
您可以在 dalvik/vm/Thread.cpp 中看到 Dalvik 是如何设置它们的。如果可用,它使用 pthread_setname_np()
,如果不可用,则使用 prctl(PR_SET_NAME)
。因此,如果 pthread_getname_np()
不可用 - 请记住 "np" 表示 "non-portable" - 您可以使用 prctl(PR_GET_NAME)
获取 16 字节的空终止字符串Linux.
您可以通过在 /proc
个条目中四处寻找其他位。
如果您对名称的大小和格式有特定要求,那么您可能想要定义一个 pthread 键并将其放入线程本地存储中。它需要更多工作,但它具有一致性和便携性。
在我的 Android 项目中,我使用 std::thread。 我也在一些 Linux 和 OSX 项目中使用相同的 C++ 代码。
出于调试目的,我想评估人类可读的线程名称,我通过调用 pthread_setname_np()
(因为缺少 std::thread::set_name()
)来实现。
如果稍后出现调试输出,我会尝试通过调用 pthread_getname_np()
来获取当前线程名称,这很有效,例如在 Linux 目标上。
但令我惊讶的是,Android Ndk pthread.h
中没有 pthread_getname_np()
,例如ndk-bundle/platforms/android-19/arch-arm/usr/include/pthread.h
也不在 ndk-bundle/platforms/android-21/arch-arm/usr/include/pthread.h
一个愚蠢的前向声明尝试:
extern "C" int pthread_getname_np(pthread_t, char*, size_t);
因链接器错误而失败(如预期)。
知道如何从 C/C++ 代码中获取 Android 中当前线程的人类可读名称吗?
您可以在 dalvik/vm/Thread.cpp 中看到 Dalvik 是如何设置它们的。如果可用,它使用 pthread_setname_np()
,如果不可用,则使用 prctl(PR_SET_NAME)
。因此,如果 pthread_getname_np()
不可用 - 请记住 "np" 表示 "non-portable" - 您可以使用 prctl(PR_GET_NAME)
获取 16 字节的空终止字符串Linux.
您可以通过在 /proc
个条目中四处寻找其他位。
如果您对名称的大小和格式有特定要求,那么您可能想要定义一个 pthread 键并将其放入线程本地存储中。它需要更多工作,但它具有一致性和便携性。