debugging 等待gdb连接

7z5jn7bk  于 2023-01-31  发布在  其他
关注(0)|答案(3)|浏览(157)

我通常在一两个项目中使用gdb,也就是说,我调用gdb --args prog args,gdb和我调试的程序在同一个tty中运行。
不过我最近的项目是修改dtach实用程序,这是一个类似screen的程序,所以tty会被重定向到其他地方,因此我不得不使用gdb的attach功能。
gdb attach的问题在于,显然你不能从一开始就进行连接,因为你需要先运行程序才能得到一个要连接的pid。
有没有什么方法可以让程序在某个点等待,直到gdb被连接?
我不能使用gdbserver,因为我在cygwin上。我也试过使用pause(),但是当我试图继续时挂起了。

zaq34kh6

zaq34kh61#

至少在LLDB中让进程发送SIGSTOP给自己应该可以了。调试器continue命令将发出SIGCONT。这也可以在GDB中使用。或者尝试SIGINT而不是SIGSTOP
包含标题

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

那么

raise(SIGSTOP)
btqmn9zl

btqmn9zl2#

下面是我解决这个问题的方法。我也见过其他人也这么做。
选择一个你想让你的程序停止的地方,等待你连接调试器。对于大多数程序,这将是一个开始,但是如果你需要做一些初始化工作,你可能想完成它,然后再做这个。
放入一个类似下面的循环:

#ifdef DEBUG

int i = 0;

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

#endif // DEBUG

成功附加到进程后,可以使用调试器更改变量i的值,这将中断循环并允许继续正常执行。
使用gdb命令将变量更改为1:set var i = 1
我经常做的另一件事是:我定义了一个名为nop()的短函数,它什么也不做(“无操作”),然后在任何我想中断的地方插入对nop()的调用,并在nop()中放置一个断点。
注意:如果你用-O0构建你的调试版本,那么编译器不会优化掉这个变量。如果你需要这个技巧来处理一个优化的版本,我猜你需要把变量声明为volatile

ijxebb2r

ijxebb2r3#

某些平台可能具有等待调试器指令或陷阱。
更方便的是,你可以让程序等待一些外部满足的条件,比如连接到一个套接字或向一个fifo写入一些数据,然后你可以建立连接或从第三个终端发送伪数据。
或者,您可以在程序中放置一个无限循环,测试某个volatile变量的值,您可以使用调试器修改该变量以允许它继续运行。
如果我记得你可以在cygwin程序中使用windows apis,并且一些web搜索似乎指示一个用于检测程序是否正在调试的apis,所以你可以循环直到返回。

相关问题