2010-02-04 50 views
1

我运行一个典型的生产国和消费过程,但它们通过在命令行中使用管道类似下面的执行:如何在这种情况下附加VC++调试器(或gdb)?

c:\>producer | consumer

producer只是数据打印出来stdout,并consumer从读stdin

我的问题是我想调试consumer的过程。在VC++和gdb中最好的方法是什么?

一种解决方案倾出到一个文件,并读文件:

c:\>producer > temp.data 
c:\>consumer < temp.data 

然而,由两个传送的数据的量是非常大的。 temp.data将超过1TB!我可能会使用压缩,但压缩/解压缩需要很长时间。所以,我想在网上做。

目前我的解决方法是:

  1. 做任何工作之前,把休眠功能(例如,睡10秒)在consumer的主要功能如stdin阅读。
  2. 从控制台调用producer | consumer。然后,consumer以10秒睡眠开始。
  3. 附加consumer在10秒内由VC++和gdb处理。
  4. 好吧,睡觉后,我现在可以调试消费者。

是的,此解决方法正在工作。但是,这很烦人。我想在这种情况下有更好的调试方法。我很欣赏它的任何想法。

+0

是生产者输出静态?即你可以做C:\>消费者

+0

好点。我更新了我的问题。 – minjang

+0

这是一个非常好的解决方法,不知道为什么你需要更好的解决方案? –

回答

2

两种解决方案浮现在脑海

改变你的睡眠是

// this waits indefinitely without killing the CPU 
while(true) {SleepEx(100, FALSE);} 

一旦你手动附加调试者,你只是把一个破发点上的睡眠,那么你可以手动跳出循环。

或更好(除非它的服务/进程没有UI访问权限)添加一个DebugBreak声明,而不是睡眠。这将导致一个异常被抛出,并会提示你杀掉该进程或调试系统上启动默认的调试器..

DebugBreak();