调试器看到的输出线程ID

时间:2019-06-17 08:24:04

标签: c++ multithreading gcc gdb

我正在使用GCC 4.4.5和GDB 7.2开发多线程C ++应用程序。 目前,我有四个线程。每个人都以一种或另一种形式与CAN总线进行交互,即读取,写入,轮询或处理消息。

为了确定哪个线程在做什么,我决定将线程ID添加到日志消息中。 在我的记录功能中,我有以下代码:

// This is for outputting debug messages
void logDebug(string msg, thread::id threadId[ = NULL]) {
    #ifdebug _DEBUG
    threadState.outputLock->lock();
    if (threadId != NULL)
        cout << "[Thread #" << threadId << "] ";
    // The rest of the output
    threadState.outputLock->unlock();
    #endif
}

这是应用程序的(调试)输出:

[Thread #3085296768] [DEBUG] [Mon Jun 17 10:18:45 2019] CAN frame was empty or no message on bus...
         ----------

这就是GDB告诉我的:

Thread #3 7575 [core: 0] (Suspended: Breakpoint)
          ----

为什么调试器会向我提供与应用程序不同的信息(线程ID /编号),并且有一种方法可以像调试器告诉我的那样在应用程序中输出相同的信息?

预期的行为是线程ID相同。

编辑: 我忘了添加一些可能重要的信息。 我正在交叉编译到由POWERPC芯片驱动的嵌入式设备,该设备运行Debian Wheezy的派生产品。

1 个答案:

答案 0 :(得分:2)

您可以使用以下系统调用从应用程序中获取线程ID:syscall(SYS_gettid)

您可以在其中通过以下任一方式设置线程名称:

  • 直接在/proc/PID/task/TID/comm中输入名称
  • 使用pthread函数int pthread_setname_np(pthread_t thread, const char *name)

然后在GDB中,您可以使用info threads命令轻松匹配给定的线程名称,其Linux TID和GDB线程ID。

希望这会有所帮助。