Выходные идентификаторы потоков, видимые отладчиком - PullRequest
2 голосов
/ 17 июня 2019

Я занимаюсь разработкой многопоточного приложения на C ++ с использованием GCC 4.4.5 и GDB 7.2. На данный момент у меня четыре темы. Каждый из них взаимодействует с шиной CAN в той или иной форме, читая, записывая, опрашивая или обрабатывая сообщения.

Чтобы определить, какой поток что делает, я решил добавить идентификаторы потока в сообщения журнала. В моих функциях регистрации у меня есть следующий код:

// 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)
          ----

Почему отладчик дает мне информацию, отличную от приложения (идентификаторы / номера потоков), и есть ли способ вывести ту же информацию в приложении, как сообщает мне отладчик?

Ожидаемое поведение - идентификаторы потоков идентичны.

EDIT: Я забыл добавить, возможно, важную информацию. Я выполняю кросс-компиляцию на встроенное устройство, работающее на чипе POWERPC и работающее на основе Debian Wheezy.

1 Ответ

2 голосов
/ 17 июня 2019

Вы можете получить идентификатор потока из своего приложения с помощью следующего системного вызова: syscall(SYS_gettid)

Оттуда вы можете установить имя потока:

  • написав непосредственно имя в /proc/PID/task/TID/comm
  • с использованием функции pthread int pthread_setname_np(pthread_t thread, const char *name)

Затем в GDB вы можете легко сопоставить указанное имя потока, его TID в Linux и идентификатор потока GDB с помощью команды info threads.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...