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

Joe*_*Joe 2 android pthreads android-ndk

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

出于调试目的,我想分配人类可读的线程名称,我通过调用pthread_setname_np()(因为缺少std::thread::set_name())来实现.

在稍后调试输出的情况下,我尝试通过调用获取当前线程名称pthread_getname_np(),这在Linux目标上有效.

但令我惊讶的是,pthread_getname_np()在Android Ndk 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);
Run Code Online (Sandbox Code Playgroud)

失败并出现链接器错误(如预期的那样).

知道如何从C/C++代码获取Android中当前线程的人类可读名称吗?

fad*_*den 6

您可以在dalvik/vm/Thread.cpp中看到Dalvik如何设置它们.如果没有pthread_setname_np(),它会使用prctl(PR_SET_NAME).因此,如果pthread_getname_np()不可用 - 并记住"np"意味着"非可移植" - 您可以使用prctl(PR_GET_NAME)在Linux下获取16字节以空字符结尾的字符串.

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

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