如何在这种情况下附加VC ++调试器(或gdb)?

时间:2010-02-04 20:50:25

标签: visual-c++ gdb debugging

我正在运行一个典型的生产者和消费者流程,但它们是通过在命令行中使用管道来执行的,如下所示:

c:\>producer | consumer

producer只是将数据打印到stdoutconsumerstdin读取。

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

一种解决方案是转储到文件中并读取文件:

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

但是,两者传达的数据量非常大。 temp.data超过1TB!我可以使用压缩,但是压缩/解压缩需要花费大量时间。所以,我想在网上做。

目前我的解决方法是:

  1. 在执行任何工作(例如从consumer阅读之前),在stdin的主要功能中设置睡眠功能(例如,睡10秒)。
  2. 从控制台调用producer | consumer。然后,consumer以10秒睡眠开始。
  3. 通过VC ++和gdb在10秒内附加consumer进程。
  4. 好的,睡了之后,我现在可以调试消费者了。
  5. 是的,此解决方法正常运行。但是,这很烦人。我想在这种情况下有一种更好的调试方法。我很感激任何想法。

1 个答案:

答案 0 :(得分:2)

想到两个解决方案

将睡眠改为

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

手动连接debugee后,只需在睡眠中设置一个断点,然后就可以手动跳出循环。

或更好(除非它的服务/进程没有UI访问权限)添加DebugBreak语句,而不是Sleep。这将导致抛出异常,系统将提示您终止进程或调试在系统上启动默认调试器。

DebugBreak();