如何在android ndk中获取线程名称

时间:2015-09-03 12:00:00

标签: android android-ndk pthreads

在我的Android项目中,我正在使用std :: thread。 我在一些Linux和OSX项目中也使用相同的C ++代码。

出于调试目的,我想给人类可读的线程名称,我通过调用pthread_setname_np()来做到这一点(因为缺少std::thread::set_name())。

如果是以后的调试输出,我会尝试通过调用pthread_getname_np()来获取当前的线程名称在Linux目标上。

但令我惊讶的是,Android Ndk pthread_getname_np()中没有pthread.h,而不是例如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中当前线程的可读名称吗?

1 个答案:

答案 0 :(得分:6)

你可以看到Dalvik如何在dalvik/vm/Thread.cpp中设置它们。如果可用,则使用pthread_setname_np(),否则使用prctl(PR_SET_NAME)。因此,如果pthread_getname_np()不可用 - 并且请记住“np”表示“非可移植” - 您可以使用prctl(PR_GET_NAME)在Linux下获取一个16字节的以空字符结尾的字符串。

您可以通过/proc条目中的钓鱼来找到其他位。

如果您对名称的大小和格式有特定要求,那么您可能需要定义pthread键并将其塞入线程本地存储中。这是更多的工作,但它是一致和便携的。