【问题标题】:how does gdb attach to multithread processgdb如何附加到多线程进程
【发布时间】:2015-09-21 00:38:03
【问题描述】:

当我们使用gdb attach调试一个正在运行的进程时,我们可以使用gdb attach pid,如果该进程有两个或多个线程,pid就是主线程tid。

现在我想实现一个简单的调试器来调试多线程进程,但是当我使用我的调试器附加一个多线程进程时,只有main thread 挂起。

我想知道为什么只使用主线程tid,gdb可以附加这个进程的所有线程,gdb如何挂起所有线程?我们假设当我们使用gdb attach时,所有的线程都已经创建好了。

【问题讨论】:

    标签: c++ c multithreading gdb ptrace


    【解决方案1】:

    我想知道为什么只使用主线程tid,gdb可以attach这个进程的所有线程,gdb如何挂起所有线程?

    当您执行 attach PROCESS_PID gdb 时,会在内部为每个线程调用 ptrace (PTRACE_ATTACH) 。在 Linux 上,您可以自己检查:

    $ strace -e ptrace -p GDB_PROCESS_PID
    

    只需运行一个带有几个线程的程序,运行 gdb,然后在运行 attach PROCESS_PID 之前在另一个控制台中运行 strace。您必须查看每个线程的 ptrace (PTRACE_ATTACH)。

    【讨论】:

      【解决方案2】:

      ptrace PTRACE_ATTACHSIGSTOP 发送到挂起整个进程的进程,即所有线程。

      【讨论】:

        【解决方案3】:

        主线程TID与进程PID数值相同是Linux系统的历史意外;在其他 Unix 系统上并非如此。

        当 gdb(或任何调试器)使用 ptrace 附加到进程时,该进程的所有线程都将暂停。

        【讨论】:

        • 我知道gdb使用'ptrace'来实现附加功能,但是如何使用'ptrace'来挂起所有线程。我只能让 TID 与 PID 相同的线程挂起。
        • @wangxf 当 gdb 附加到进程时,所有线程都被挂起。您是否有一些不是这种情况的示例?
        • 其实我想实现一个简单的调试器,但是我的调试器附加到一个进程时不知道如何让所有线程挂起,我只能让主线程挂起。
        猜你喜欢
        • 2015-10-22
        • 2017-12-23
        • 2012-12-31
        • 2013-01-19
        • 1970-01-01
        • 1970-01-01
        • 2016-02-06
        • 1970-01-01
        • 2019-04-30
        相关资源
        最近更新 更多