【问题标题】:pthread_t to gdb thread idpthread_t 到 gdb 线程 id
【发布时间】:2011-01-12 09:14:22
【问题描述】:

有谁知道从 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,但我的线程都没有这么低。

【问题讨论】:

  • 我正要问同样的问题..但我的问题更糟 - 我需要先从上下文中恢复 pthread_id(它是在其他进程线程中运行的嵌入式库.. ew)跨度>

标签: c gdb pthreads


【解决方案1】:

pthread_t 的值与您在 GDB 中看到的该线程的系统相关线程 id(在 Linux gettid(2) 中)不同。

AFAIK,没有任何函数可以在两者之间进行转换。您需要自己跟踪。

【讨论】:

  • 这是正确的。请参阅 stackoverflow.com/questions/558469/… 的答案以获取更多信息。
  • 啊,谢谢。我会在我关心发生在哪个线程上的地方抓住它。
  • 实际上这似乎已被弃用,我必须使用 syscall(SYS_gettid);而是。
【解决方案2】:

GDB 的新版本实际上在info thread 中输出pthread_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

【讨论】:

  • gdb 6.8-27 打印:* 1 process 22749 0x000000385c8cd372 in select () from /lib64/libc.so.6 gdb 7.0.1 打印:* 1 Thread 22749 0x000000385c8cd372 in select () from /lib64/libc.so.6 gdb 7.2-55.1 打印:* 1 Thread 0x40c68940 (LWP 22749) 0x000000385c8cd372 in select () from /lib64/libc.so.6 所以GDB 7.0 语句有点模糊。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
  • 2017-05-21
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 2021-11-30
相关资源
最近更新 更多