如何在 Poco 中设置在内核 traces/ps/gdb 中调试可见的单个线程名称?

How to set individual thread name in Poco that is visible for debugging in kernel traces/ps/gdb?

我最近开始使用线程编程并遇到了 Poco 及其线程资源,同时从 Poco::ThreadPool::defaultPool().start(*testThread, "HappyThread") 并在调用 start 方法时传递一个字符串 "HappyThread"。

线程启动后 运行 我发出了 ps 命令来获取线程名称,但它显示 "a.out".

vipin@VIPIN:~$ ps H -C a.out -o 'pid tid cmd comm'
PID   TID     CMD               COMMAND
14051 14051 ./a.out              a.out
14051 14052 ./a.out              a.out
14051 14053 ./a.out              a.out`

而当我使用 pthread_setname_np(handle, "HappyThread") 时,ps 命令输出给出的线程名称为 "HappyThread",如下所示,

vipin@VIPIN:~$ ps H -C a.out -o 'pid tid cmd comm'
PID   TID    CMD                 COMMAND
14051 14051 ./a.out              a.out
14051 14052 ./a.out              HappyThread
14051 14053 ./a.out              a.out`

下面是我的示例代码(不完美只是一个懒惰的代码):

test.cc:

#include "test.h"

void TestThread::run() {
    while (1)
    ;
}

test.h:

#include <Poco/Runnable.h>

class TestThread: public Poco::Runnable
{
    public:
    void run() override;
};

main.cc:

#include "test.h"
#include <Poco/ThreadPool.h>

using Poco::ThreadPool;

int main()

{
    TestThread thread_t;

    ThreadPool::defaultPool().start(thread_t, "HappyThread");
    while (1)
    ;

}

据我查看 poco 文档,将字符串传递给 start 方法设置线程名称。 我什至尝试使用 Poco Thread class 并创建了一个线程并调用了 setName 方法,但观察到相同的行为

任何关于为什么 Poco 会发生这种行为的建议,或者是否无法使用 Poco 方法设置名称以反映在 OS 中的任何建议都将有助于理解此问题并找到解决方案.

我只是 运行 研究了这个,并通过深入研究源代码弄明白了。如果您查看 Thread 的平台实现,您会注意到一个切换线程名称的宏 on/off。在 Thread_POSIX.cpp 中是 POCO_POSIX_DEBUGGER_THREAD_NAMES,在 Thread_WIN32.cpp 中是 POCO_WIN32_DEBUGGER_THREAD_NAMES

因此,您只需使用为您的平台定义的这些宏来构建库。在 OSX 上,我使用以下命令构建,现在我在 XCode 中看到了线程名称:

cmake .. -DCMAKE_CXX_FLAGS="-DPOCO_POSIX_DEBUGGER_THREAD_NAMES" -DBUILD_SHARED_LIBS=OFF
cmake --build . --config Release