2016-09-30 108 views
0

我想在gdb中调试一个低级别的C程序。这个程序的目的是作为一个包装,启动另一个进程,并监控/干扰其内存使用。程序仅在第一次运行时挂起?

当我在gdb中加载程序时,一切似乎都正常(如果不是理想的话)。我看到新的流程叉,然后它挂起。就其本身而言,这不会太奇怪;可能是我的代码中的某个地方存在死锁或无限循环。

但是,如果我中断并杀死gdb内的进程,然后再次在同一个gdb会话中运行它,一切正常工作正常。大约需要半秒钟的时间才能运行,并且完全按照它应该执行的操作。

所以我的问题是:什么是GDB之间保持我的程序运行?第一次和第二次执行之间会有什么变化?

+0

某些内存可能有一些不同的值。一些硬件状态可能不同(你说它是低级的)。许多事情都可能发生。 –

+0

您可能正在访问一些未初始化的变量,从而进入某种锁。在第二次和后续运行中,正在运行的进程的数据段可能会重复使用,并且与以前一样,但现在作为初始值。注意“未初始化的变量”警告。 – tofro

+0

“但是当我中断并杀死进程” - *哪个进程?您正在调试的那个,还是分叉的(或两者)?用实际的代码 –

回答

0

我发现原因,但我仍然不明白为什么gdb会这样做。但是我会在这里发布它,以防其他人使用它。

我发起了GDB:

GDB --args ./mywrapper testers_exe /测试仪2

当首次运行:

/家庭/ 用户名/mywrapper testers_exe/tester-2

但是死亡,再次运行时,它模仿最近过程,没有的观点已获得:

/家庭/ 用户名/testers_exe /测试仪2 testers_exe /测试仪2

因此,它运行没有包装的测试,并避免包装的无限循环。

相关问题