如何等待调试器附加 [重复]

How to wait for a debugger to attach [duplicate]

提问人:Timmmm 提问时间:7/12/2023 更新时间:7/12/2023 访问量:188

问:

在 C++ 中,如何暂停执行并等待调试器(例如 GDB 或 LLDB)附加到进程(如果尚未连接)?

提出了一些其他问题,但如果它已经附加,那只会闯入调试器。我想暂停执行,直到调试器附加。raise(SIGTRAP)

我也不能真正弄乱信号,因为我的代码运行在一个安装自己的信号处理程序的程序中。

它只需要在 Linux 上运行。

linux 调试 gdb lldb

评论


答:

1赞 Andrew 7/12/2023 #1

请考虑以下示例程序:

#include <unistd.h>

volatile int gdb_attached = 0;

int
main ()
{
  while (gdb_attached == 0)
    sleep (1);
  return 0;
}

我编译它然后让它运行。以下是我对 GDB 的处理方式:

$ gdb -q -p 253454
Attaching to process 253454
... snip library loading output ...
(gdb) set gdb_attached = 1
(gdb) continue
Continuing.
[Inferior 1 (process 253454) exited normally]
(gdb) 

将允许下级继续通过延迟循环。如果我之前附加 GDB,我也可以在下级到达延迟循环之前设置它。set gdb_attached = 1

评论

0赞 Timmmm 7/12/2023
是的,这就是我正在考虑的。我认为这是最好的解决方案。我在这里找到了一些其他答案,这些答案可以检查跟踪器 PID,或者使用各种 ptrace 系统调用,但它们都有相同的问题 - 它们让您等到调试器被附加,但直到它真正完成初始化。例如,它仍然需要设置断点。此解决方案没有该问题。/proc/self/status
0赞 Jim Ingham 7/13/2023
我同意,如果你可以修改你的代码,人工自旋循环是迄今为止最简单的方法。但是,附加到进程通常会停止它,然后调试器设置其所有断点,然后才继续该过程。因此,“等到你被跟踪”不应该运行并返回 true,直到调试器重新启动你 - 在其设置的断点之后等等。如果在“不停止”模式下运行调试器,则情况并非如此,但应该不会在此模式下工作。