2012-01-20 2 views
8

В моем приложении создано много потоков. некоторые имена потоков видны в gdb, в то время как я выполняю команду «информационные потоки», другие не отображаются. Как получить все само название нити вместо шестнадцатеричное значение, как 0xb7fe1424gdb Как получить отображаемое имя потока

4 Thread 0xb68ffb70 (LWP 18377) 0xb7fe1424 in __kernel_vsyscall() 
* 3 Thread 0xb7291b70 (LWP 18375) JKMainT (arg=0x0) at mylib.cpp:482 
2 Thread 0xb7a92b70 (LWP 18374) 0xb7fe1424 in __kernel_vsyscall() 
1 Thread 0xb7a94730 (LWP 18371) 0xb7fe1424 in __kernel_vsyscall() 
+0

Чтобы добавить больше .. я ставлю точку останова на mylib.cpp: 482, и по линии он создает поток. – Whoami

+1

Это не имя потока, то есть имя функции, которую этот поток выполняет в настоящий момент. –

ответ

8

Нити не имеют имена по умолчанию - в JKMainT строку есть имя текущей функции.

Попробуйте выбрать один из потоков и просмотреть обратную линию - это может дать вам хорошую идею, какой поток это. В противном случае вы можете попробовать prctl с PR_SET_NAME, если он доступен.

+4

более простой способ сделать это: pthread_setname_np (pthread_t *, const char *) – manylegged

4

Если вы обновляетесь до версии gdb 7.3 или более поздней, «информация потока» отобразит имена потоков; по крайней мере, на родной (не удаленной) Linux.

4

Вы можете установить имя потока через нестандартные вызовы api POSIX. Эти имена будут отображаться GDB (и другими отладчиками).

В Linux

// watch out, 16 char limit on the name 
pthread_setname_np(pthread_self(), "My thread name"); 

На Mac

pthread_setname_np("My thread name"); 
Смежные вопросы