2010-02-02 27 views
18

क्या किसी को किसी pthread_t से जाने का तरीका पता है कि जीडीबी जानकारी थ्रेड के साथ क्या प्रदर्शित करता है?pthread_t से gdb थ्रेड आईडी

तो मेरे पास है:

(gdb) info threads 
    37 Thread 22887 0xb7704422 in __kernel_vsyscall() 
    36 Thread 22926 0xb7704422 in __kernel_vsyscall() 
    35 Thread 22925 0xb7704422 in __kernel_vsyscall() 
    34 Thread 22924 0xb7704422 in __kernel_vsyscall() 
    33 Thread 22922 0xb7704422 in __kernel_vsyscall() 
    32 Thread 22921 0xb7704422 in __kernel_vsyscall() 

(gdb) p m_messageQueue->m_creationThread 
$3 = 2694822768 
(gdb) p/x m_messageQueue->m_creationThread 
$4 = 0xa09fbb70 

किसी को भी पता है कि कैसे मैं यह पता लगाने की जो धागा है? यह 22768 प्रतीत होता है, लेकिन मेरे धागे में से कोई भी कम नहीं जाता है।

+0

क्या ओएस कि, लिनक्स है? –

+0

हां, क्षमा करें। लिनक्स। –

+0

मैं वही बात पूछने वाला था .. लेकिन मेरी समस्या बदतर है - मुझे संदर्भ से पहले pthread_id को पुनर्प्राप्त करने की आवश्यकता है (यह एक एम्बेडेड लाइब्रेरी है जो अन्य प्रक्रिया धागे में चल रही है .. ew) –

उत्तर

8

pthread_t का मान उस थ्रेड के सिस्टम निर्भर थ्रेड आईडी (लिनक्स gettid(2) में) जैसा नहीं है जो आप जीडीबी में देखते हैं।

AFAIK, दोनों के बीच कनवर्ट करने के लिए कोई फ़ंक्शन नहीं है। आपको अपने आप को ट्रैक रखने की जरूरत है।

+2

यह सही है। अतिरिक्त जानकारी के लिए * http: //stackoverflow.com/questions/558469/how-do-i-get-a-thread-id-from-an-arbitrary-pthread-t/558815#558815* पर उत्तर देखें। – jschmier

+0

आह, धन्यवाद। मैं इसे पकड़ लेगा जहां मुझे परवाह है कि कौन सी धागा चीजें होती हैं। –

+1

वास्तव में ऐसा लगता है कि यह बहिष्कृत है और मुझे syscall (SYS_gettid) का उपयोग करना है; बजाय। –

17

GDB के नए संस्करण में के मान को वास्तव में आउटपुट करते हैं, pthread_t के थ्रेड नंबर तुच्छ के साथ एसोसिएशन बनाते हैं।

उदाहरण के लिए, GDB 7.0 का उपयोग कर:

cat t.c 
#include <pthread.h> 

void *fn(void *p) 
{ 
    sleep(180); 
} 

int main() 
{ 
    pthread_t pth1, pth2; 
    pthread_create(&pth1, 0, fn, 0); 
    pthread_create(&pth2, 0, fn, 0); 
    pthread_join(pth1, 0); 
    return 0; 
} 

gcc -g -m32 -pthread t.c && gdb -q ../a.out 

(gdb) r 
[Thread debugging using libthread_db enabled] 
Using host libthread_db library "/lib64/libthread_db.so.1". 
[New Thread 0xf7e56b90 (LWP 25343)] 
[New Thread 0xf7655b90 (LWP 25344)] 

Program received signal SIGINT, Interrupt. 
0xffffe405 in __kernel_vsyscall() 
(gdb) info thread 
    3 Thread 0xf7655b90 (LWP 25344) 0xffffe405 in __kernel_vsyscall() 
    2 Thread 0xf7e56b90 (LWP 25343) 0xffffe405 in __kernel_vsyscall() 
* 1 Thread 0xf7e576b0 (LWP 25338) 0xffffe405 in __kernel_vsyscall() 
(gdb) up 2 
#2 0x080484e2 in main() at t.c:13 
13 pthread_join(pth1, 0); 
(gdb) p/x pth1 
$1 = 0xf7e56b90 ## this is thread #2 above 
(gdb) p/x pth2 
$2 = 0xf7655b90 ## this is thread #3 above 
+0

gdb 6.8-27 प्रिंट: '* 1 प्रक्रिया 22,749 0x000000385c8cd372 का चयन करें() 7.0.1 प्रिंट/lib64/libc.so.6' से gdb में: ' * 1 थ्रेड 22,749 0x000000385c8cd372 चयन में() से/lib64/libc.so.6' जीडीबी 7.2-55.1 प्रिंट: '* 1 थ्रेड 0x40c68940 (एलडब्लूपी 2274 9) 0x000000385c8cd372/lib64/libc.so.6' से चुनिंदा() में 'जीडीबी 7.0' कथन थोड़ा सा है फजी। – Vlad