我通常在一两个项目中使用gdb,也就是说,我调用gdb --args prog args
,gdb和我调试的程序在同一个tty中运行。
不过我最近的项目是修改dtach实用程序,这是一个类似screen的程序,所以tty会被重定向到其他地方,因此我不得不使用gdb的attach功能。
gdb attach的问题在于,显然你不能从一开始就进行连接,因为你需要先运行程序才能得到一个要连接的pid。
有没有什么方法可以让程序在某个点等待,直到gdb被连接?
我不能使用gdbserver,因为我在cygwin上。我也试过使用pause()
,但是当我试图继续时挂起了。
3条答案
按热度按时间zaq34kh61#
至少在LLDB中让进程发送
SIGSTOP
给自己应该可以了。调试器continue命令将发出SIGCONT
。这也可以在GDB中使用。或者尝试SIGINT
而不是SIGSTOP
。包含标题
那么
btqmn9zl2#
下面是我解决这个问题的方法。我也见过其他人也这么做。
选择一个你想让你的程序停止的地方,等待你连接调试器。对于大多数程序,这将是一个开始,但是如果你需要做一些初始化工作,你可能想完成它,然后再做这个。
放入一个类似下面的循环:
成功附加到进程后,可以使用调试器更改变量
i
的值,这将中断循环并允许继续正常执行。使用gdb命令将变量更改为1:
set var i = 1
我经常做的另一件事是:我定义了一个名为
nop()
的短函数,它什么也不做(“无操作”),然后在任何我想中断的地方插入对nop()
的调用,并在nop()
中放置一个断点。注意:如果你用
-O0
构建你的调试版本,那么编译器不会优化掉这个变量。如果你需要这个技巧来处理一个优化的版本,我猜你需要把变量声明为volatile
。ijxebb2r3#
某些平台可能具有等待调试器指令或陷阱。
更方便的是,你可以让程序等待一些外部满足的条件,比如连接到一个套接字或向一个fifo写入一些数据,然后你可以建立连接或从第三个终端发送伪数据。
或者,您可以在程序中放置一个无限循环,测试某个volatile变量的值,您可以使用调试器修改该变量以允许它继续运行。
如果我记得你可以在cygwin程序中使用windows apis,并且一些web搜索似乎指示一个用于检测程序是否正在调试的apis,所以你可以循环直到返回。