【问题标题】:what's the detail about gdb, does it hold one thread?gdb 的详细信息是什么,它有一个线程吗?
【发布时间】:2012-07-13 01:57:16
【问题描述】:

gdb的详细情况是什么,调试代码时它是否持有一个线程?

我在主线程中设置了一个退出标志,并且在打印标志之前我已经加入了其他线程。当我在使用参数“-g”编译后使用 gdb 运行调试版本时,它看起来:

[Thread debugging using libthread_db enabled]
Input number of threads:5

Main thread id: 0xb7fda6c0, 
[New Thread 0xb7fd9b70 (LWP 9276)]
[New Thread 0xb75d8b70 (LWP 9277)]
[New Thread 0xb6bd7b70 (LWP 9278)]
[New Thread 0xb61d6b70 (LWP 9279)]
[New Thread 0xb57d5b70 (LWP 9280)]
I am thread 0xb6bd7b70, myorder 2, thread_exit.
I am thread 0xb61d6b70, myorder 3, thread_exit.
I am thread 0xb7fd9b70, myorder 0, thread_exit.
I am thread 0xb57d5b70, myorder 4, thread_exit.
I am thread 0xb75d8b70, myorder 1, thread_exit.
[Thread 0xb61d6b70 (LWP 9279) exited]
[Thread 0xb6bd7b70 (LWP 9278) exited]
[Thread 0xb75d8b70 (LWP 9277) exited]
[Thread 0xb7fd9b70 (LWP 9276) exited]
Main: completed join with thread 0xb7fd9b70 having a status of 0
Main: completed join with thread 0xb75d8b70 having a status of 1
Main: completed join with thread 0xb6bd7b70 having a status of 2
Main: completed join with thread 0xb61d6b70 having a status of 3
Main: completed join with thread 0xb57d5b70 having a status of 4
Main: lock will be destroy
Main: 9273, tlist will be free 
Main exit.
[Thread 0xb57d5b70 (LWP 9280) exited]

Program exited normally.
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.7.el6.i686 libgcc-4.4.4-13.el6.i686

GDB 提供有关线程“创建”和“退出”的信息。但是在调用pthread_join() 并在主线程中打印“Main exit”后总是有一个线程退出。为什么?是 gdb 使用的线程吗?

运行发布版,没什么特别的:

Input number of threads:5

Main thread id: 0xb77176c0, 
I am thread 0xb5913b70, myorder 3, thread_exit.
I am thread 0xb4f12b70, myorder 4, thread_exit.
I am thread 0xb6314b70, myorder 2, thread_exit.
I am thread 0xb6d15b70, myorder 1, thread_exit.
I am thread 0xb7716b70, myorder 0, thread_exit.
Main: completed join with thread 0xb7716b70 having a status of 0
Main: completed join with thread 0xb6d15b70 having a status of 1
Main: completed join with thread 0xb6314b70 having a status of 2
Main: completed join with thread 0xb5913b70 having a status of 3
Main: completed join with thread 0xb4f12b70 having a status of 4
Main: lock will be destroy
Main: tdata list will be free 
Main exit.

【问题讨论】:

  • 如果您从第一个列表中删除 GDB 消息,则输出几乎相同(仅在分配的地址/ID 和 myorder 值的顺序上有所不同,我认为这是不确定的因为它可能取决于线程调度)。你怎么知道最后一个线程退出没有在非调试器运行中被阻止,因为在这种情况下你没有关于线程退出何时完成的信息?据您所知,它也可能发生在其他线程上......
  • 我跑了很多次,每次"Main exit"后只有一个线程。Main exit. [Thread 0xb57d5b70 (LWP 9280) exited]。如果是随机的,应该是两个,也许是三个线程,但不是。

标签: multithreading debugging gdb pthreads pthread-join


【解决方案1】:

gdb,调试代码的时候是不是只有一个线程?

没有。

在调用 pthread_join() 并在主线程中打印“Main exit”后总是有一个线程退出。为什么?

glibc 发送给 GDB 以告知它线程已退出的通知作为(几乎)线程执行的最后一件事发送。特别是,在退出线程通知主线程它已经退出之后(即在退出线程唤醒主线程之后)发送该通知。因此,在 GDB 注意到退出线程实际上已经退出之前,主线程被唤醒并打印 Main exit 一点也不奇怪。

我跑了很多次,每次“Main exit”后只有一个线程。

这证明什么都没有。如果您运行程序 1,000,000 次,可能至少有一次运行 GDB 会在打印 Main exit 之前注意到线程退出。排序可能取决于您的系统有多少处理器,以及它们有多忙。这里真的没有什么(有趣的)可看的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 2013-06-16
    • 2011-05-15
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多