2010-02-02 16 views
18

Herkes pthread_t öğesinden GDB'nin bilgi iş parçacığı ile gösterdiği bir yola nasıl gideceğini biliyor mu? pthread_t to gdb iş parçacığı kimliği

Yani var:

(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 

kimse bunun ne tür bir iş parçacığı anlamaya biliyor mu? 22768 gibi gözüküyordu, ama hiçbir iş parçamın hiçbiri o kadar düşük değil.

+0

Ne OS Linux, yani? –

+0

Evet, özür dilerim. Linux. –

+0

Ben de aynı şeyi sormak üzereydim ... ama benim sorunum daha kötüydü - pthread_id'i ilk olarak bağlamdan kurtarmaya ihtiyacım var (bu, diğer süreç dizisinde çalışan gömülü bir kütüphane .. ew) –

cevap

8

pthread_t değeri, GDB'de gördüğünüz dizinin sisteme bağlı iş parçacığı kimliğiyle aynı değil (Linux'ta gettid(2)). AFAIK, ikisi arasında dönüştürme işlevi yoktur. Bunu kendin izlemelisin.

+2

Bu doğru. Ek bilgi için * http: //stackoverflow.com/questions/558469/how-do-i-get-a-thread-id-from-an-arbitrary-pthread-t/558815#558815* adresindeki cevaba bakınız. – jschmier

+0

Ah, teşekkürler. Hangi iplik parçasının meydana geldiğini umursamıyorum. –

+1

Aslında bu kullanımdan kaldırılmış gibi görünüyor ve syscall (SYS_gettid) kullanmak zorundayım; yerine. –

17

GDB'un yeni sürümleri, numaralı pthread_t değerini çıkarıp, pthread_t numaralı iş parçacığı numarasını iş parçacığı numarasıyla ilişkilendirir. GDB 7.0 kullanarak Örneğin

:

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 baskılar: '* 1 işlem) (belirli gdb/lib64/libc.so.6' 7.0.1 baskılar 22749 0x000000385c8cd372: '* 1 den/lib64/seçin içinde 22749 0x000000385c8cd372() libc.so.6' gdb 7,2-55,1 baskılar: '* 1 Konu 0x40c68940 seçimde, (22749 LWP) 0x000000385c8cd372() dan/lib64/ Yani' gDB 7.0' deyimi biraz libc.so.6' bulanık. – Vlad

İlgili konular