0

我有一个产生多个子进程的应用程序。在启动子程序之前,我为日志文件创建 stdOut 和 stdErr 句柄(例如,如果我要启动 procA,我创建 logA.log 的句柄)。我在子进程上设置了这些句柄。

通过查看 ProcExplorer,我可以看到每个子进程都有每个日志文件的句柄(因此 procA 有 logA、logB 等的句柄)。这会产生以后的问题。

我希望能够看到 procA 何时创建 logB 的句柄。有什么想法吗?

4

2 回答 2

1

一种可能的解决方案是文件句柄在任何子进程之间共享,因为它们是由父进程创建的。

这是我能看到的唯一解决方案,因为如果您设计为只有一个 var 来处理它,我看不出如何在每个子进程中拥有多个句柄(每个日志文件一个)。

为什么不在子进程中创建句柄?我知道它确实对这个问题做出了昂贵的回应,但显然如果 procA 只需要 logA 的句柄,那么在子进程 procA 中创建 logA 的句柄会更好。

于 2009-03-16T10:41:49.733 回答
1

当子进程 procA 创建 logB 的句柄时,您是否在问如何闯入调试器?我假设您使用的是 Windows,因为您提到了 Process Explorer。

一种方法是使用Image File Execution Options注册表项来指定每次procA.exe启动时,您要启动调试器。当调试器启动时,您可以在创建 logB 句柄的代码中设置断点,然后让进程继续。这适用于任何调试器(如 WinDbg 或 ntsd,或分析工具如 AQTime),而不仅仅是 Visual Studio。

另一种方法是告诉调试器附加到所有子进程。有几种方法可以使用 WinDbg 或 ntsd 启用此行为。这样,您将调试器附加到父进程,它会自动附加到子进程 procA,您可以在适当的代码中设置断点。

另一种方法是在DebugBreak()创建 logB 句柄时使用该函数临时修改代码以生成断点异常,然后使用即时调试附加调试器。请注意,如果您的代码在没有异常过滤器表达式的情况下处理结构化异常(这是一个坏主意),这将不起作用,并且可能会产生令人惊讶的结果(死锁、内存泄漏等)。

于 2009-03-16T16:38:49.733 回答