C 等待gdb连接

C 等待gdb连接,c,debugging,gdb,cygwin,C,Debugging,Gdb,Cygwin,我通常在一两个项目中使用gdb。即,我调用gdb--args prog args。gdb与我正在调试的程序在同一tty中运行 但是,我的最新项目正在修改dtach实用程序。这是一个类似程序的屏幕,所以tty被重定向到其他地方,因此我必须使用gdb的附加功能 gdb attach的问题是,显然您不能从一开始就进行附加,因为您需要先运行程序才能获得要附加的pid 有没有办法让程序在某个点等待gdb被连接 我不能使用gdbserver,因为我在cygwin上。我还尝试使用了pause(),但当我尝试继

我通常在一两个项目中使用gdb。即,我调用
gdb--args prog args
。gdb与我正在调试的程序在同一tty中运行

但是,我的最新项目正在修改dtach实用程序。这是一个类似程序的屏幕,所以tty被重定向到其他地方,因此我必须使用gdb的附加功能

gdb attach的问题是,显然您不能从一开始就进行附加,因为您需要先运行程序才能获得要附加的pid

有没有办法让程序在某个点等待gdb被连接


我不能使用gdbserver,因为我在cygwin上。我还尝试使用了
pause()
,但当我尝试继续时,它挂起了。

某些平台可能已经等待调试器指令或陷阱

更便于移植的是,您可以让程序等待某些外部满足的条件,例如连接到套接字或将一些数据写入fifo。然后,您可以建立连接或从第三个终端发送虚拟数据

或者,您可以在程序中放置一个无限循环,测试某个易失性变量的值,您可以使用调试器修改该变量以允许其继续


如果我记得,您可以在cygwin程序中使用windows API,并且一些web搜索似乎表明有一个API用于检测程序是否正在调试,因此您可以循环,直到返回到。以下是我解决此问题的方法。我也见过其他人这样做

选择您希望程序停止的位置,并等待您连接调试器。对于大多数程序来说,这将是一个开始,但是如果有一些初始化工作需要做,您可能希望完成它,然后再做这个

放入一个类似以下内容的循环:

#ifdef DEBUG

int i = 0;

while (i == 0)
{
    usleep(100000);  // sleep for 0.1 seconds
}

#endif // DEBUG
成功附加到进程后,可以使用调试器更改变量
i
的值,这将中断循环并允许继续正常执行

将变量更改为1的gdb命令:
set var i=1

我一直在做的另一件事是:我定义了一个名为
nop()
的短函数,它什么也不做(“无操作”)。然后我坚持调用
nop()
任何我想中断的地方,并在
nop()
内设置断点


注意:如果使用
-O0
构建调试版本,则编译器不会优化该变量。如果您需要这个技巧来处理优化的构建,我想您需要将变量声明为
volatile

,至少LLDB让进程向自身发送
SIGSTOP
应该可以做到这一点。调试器继续命令随后将发出
SIGCONT
。这也应该适用于GDB。或者尝试
SIGINT
而不是
SIGSTOP

包含标题

#include <signal.h>
#include <csignal> // or C++ style alternative

我的错,邮件列表中抱怨gdbserver不能在cygwin上工作的消息是9年前发出的。昨晚编辑的,效果很好。出于某种原因,gdbserver二进制文件没有包含在cygwin repo中,这可能是因为它在cygwin上的使用范围很窄。此外,还有一种潜在的方法可以从一开始就使用gdb调试存根将gdb挂接到程序中。无论如何,感谢您的回答。必须有一个解决方案,您可以安装一个信号处理程序,该处理程序将设置
i
变量以中断循环?gdb命令
info signals
打印信号列表,以及它们是否被传递到程序。然后,您可以使用命令
handle
修改其行为。问题是,如果调试器在被调试器到达此点之前实际附加并发送
SIGCONT
,则进程将被卡住。
raise(SIGSTOP)