如何在 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
我最近开始使用线程编程并遇到了 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