2015-04-20 6 views
5

Я пытаюсь отлаживать приложение, написанное на C++, скомпилированное для процессора на базе ARM, работающего под управлением Linux.Как программно идентифицировать идентификатор потока, напечатанный в GDB

Когда приложение прерывается, оно останавливается в определенном потоке, и я предполагаю, что поток - это где ошибка (ошибка сегментации).

Моя проблема в том, что у меня возникли проблемы с определением ЧТО эта нить. Я вижу, что после того, как GDB запущен, печатается в затмении.

Каковы цифры, подчеркнутые синим цветом, и есть ли способ для меня программным образом получить к ним доступ, чтобы я знал, где искать код?

enter image description here

+2

Почему бы не назвать свои ниточки именем при их нерестах? –

+0

@ SelçukCihan это будет показано в GDB? –

+1

Gdb может отображать имена потоков, проверить [link] (https://sourceware.org/gdb/onlinedocs/gdb/Threads.html) для получения дополнительной информации –

ответ

2

В дополнение к @Heshan Perera ответ.

Вы также можете получить доступ к идентификатор потока, который является большим числом, внутри программы

UNIX:

#include <sys/syscall.h> 
syscall(SYS_gettid); 

WINDOWS: (Не проверено)

#include <windows.h> 
GetCurrentThreadId(); 
0

На основе this link разместил @Selcuk Cihan в комментарии выше, первое число в квадратных скобках представляет собой целое число идентификатор, назначенный самим GDB, а другой сист-тег назначается нити.

0

Лучшее решение, если вы на Linux/gcc, на самом деле дать описательное имя для потока с pthread_setname_np. Затем gdb будет использовать это имя при попадании контрольных точек и т. д. Обратите внимание, что это расширение GNU для pthreads.