rhl*_*lee 11 c debugging cygwin gdb
我一直在使用gdb进行1或2个项目.即我援引gdb --args prog args
.gdb与我正在调试的程序运行在同一个tty中.
但是我的最新项目是修改dtach实用程序.这是一个类似于屏幕的程序,所以tty被重定向到其他地方,因此我必须使用gdb的附加功能.
gdb attach的问题是,显然你不能从一开始就附加,因为你需要先运行程序才能得到一个pid来附加.
有什么办法可以让程序等到某个点,直到连接gdb为止?
我不能使用gdbserver,因为我在cygwin上.我也尝试过使用pause()
,但是当我试图继续时它就挂了.
ste*_*eha 14
这是我如何解决这个问题.我也看到其他人也这样做了.
选择一些您希望程序停止的位置并等待您附加调试器.对于大多数程序来说,这将是一个开始,但如果你需要做一些初始化工作,你可能想要完成它然后再做.
放入类似这样的循环:
#ifdef DEBUG
int i = 0;
while (i == 0)
{
usleep(100000); // sleep for 0.1 seconds
}
#endif // DEBUG
Run Code Online (Sandbox Code Playgroud)
成功连接到进程后,可以使用调试器更改变量的值i
,这将中断循环并允许正常执行继续.
用于将变量更改为1的gdb命令: set var i = 1
我一直在做的另一件事:我定义了一个名为nop()
"无操作" 的简短函数.然后我坚持打电话到nop()
任何我想打破的地方,并在里面放一个断点nop()
.
注意:如果您构建调试版本,-O0
那么编译器将不会优化变量.如果你需要这个技巧来使用优化的构建,我猜你需要将变量声明为volatile
.
Pet*_*erg 10
至少LLDB使得流程发送SIGSTOP
给自己应该可以解决问题.然后调试器继续命令将发出SIGCONT
.这也适用于GDB.或者尝试SIGINT
代替SIGSTOP
.
包括标题
#include <signal.h>
#include <csignal> // or C++ style alternative
Run Code Online (Sandbox Code Playgroud)
然后
raise(SIGSTOP)
Run Code Online (Sandbox Code Playgroud)
某些平台可能有等待调试器指令或陷阱。
更方便的是,您可以让程序等待某些外部满足的条件,例如与套接字的连接或将一些数据写入 fifo。然后,您可以从第三个终端建立连接或发送虚拟数据。
或者您可以在程序中放置一个无限循环,测试某些易失性变量的值,您可以使用调试器修改该变量以允许其继续。
如果我记得你可以在 cygwin 程序中使用 windows api,并且一些网络搜索似乎表明用于检测程序是否正在调试,因此你可能可以循环直到返回。
归档时间: |
|
查看次数: |
7053 次 |
最近记录: |