2010-02-02 3 views
18

pthread_t에서 GDB가 정보 스레드로 표시하는 방법을 아는 사람이 있습니까? pthread_t to gdb thread id

그래서 내가 가진 :

(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

어떤 OS는 리눅스,이다? –

+0

예, 죄송합니다. 리눅스. –

+0

나는 똑같은 것을 물어 보려고했다. 그러나 나의 문제는 더 나쁘다. 나는 우선 context로부터 pthread_id를 복구 할 필요가있다. (이것은 다른 프로세스 thread .. ew에서 실행되는 임베디드 라이브러리이다.) –

답변

8

pthread_t의 값은 GDB에서 볼 수있는 스레드의 시스템 종속 스레드 ID (Linux 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의 새 버전은 실제로 info threadpthread_t의 값을 출력하고 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 과정) (선택 GDB/lib64에 /로부터 libc.so.6' 7.0.1 인쇄물 22,749 0x000000385c8cd372 : '* 1 개 스레드/lib64에 /로부터 선택에서 22,749 0x000000385c8cd372() libc.so.6' GDB 7.2-55.1 인쇄 : '* 1 개 스레드 0x40c68940 선택에서 (22,749 LWP) 0x000000385c8cd372()에서/lib64에/ 은 그래서'GDB 7.0' 문이 비트가 libc.so.6' 흐린. – Vlad