我有一个产生多个子进程的应用程序。在启动子程序之前,我为日志文件创建 stdOut 和 stdErr 句柄(例如,如果我要启动 procA,我创建 logA.log 的句柄)。我在子进程上设置了这些句柄。
通过查看 ProcExplorer,我可以看到每个子进程都有每个日志文件的句柄(因此 procA 有 logA、logB 等的句柄)。这会产生以后的问题。
我希望能够看到 procA 何时创建 logB 的句柄。有什么想法吗?
一种可能的解决方案是文件句柄在任何子进程之间共享,因为它们是由父进程创建的。
这是我能看到的唯一解决方案,因为如果您设计为只有一个 var 来处理它,我看不出如何在每个子进程中拥有多个句柄(每个日志文件一个)。
为什么不在子进程中创建句柄?我知道它确实对这个问题做出了昂贵的回应,但显然如果 procA 只需要 logA 的句柄,那么在子进程 procA 中创建 logA 的句柄会更好。
当子进程 procA 创建 logB 的句柄时,您是否在问如何闯入调试器?我假设您使用的是 Windows,因为您提到了 Process Explorer。
一种方法是使用Image File Execution Options
注册表项来指定每次procA.exe
启动时,您要启动调试器。当调试器启动时,您可以在创建 logB 句柄的代码中设置断点,然后让进程继续。这适用于任何调试器(如 WinDbg 或 ntsd,或分析工具如 AQTime),而不仅仅是 Visual Studio。
另一种方法是告诉调试器附加到所有子进程。有几种方法可以使用 WinDbg 或 ntsd 启用此行为。这样,您将调试器附加到父进程,它会自动附加到子进程 procA,您可以在适当的代码中设置断点。
另一种方法是在DebugBreak()
创建 logB 句柄时使用该函数临时修改代码以生成断点异常,然后使用即时调试附加调试器。请注意,如果您的代码在没有异常过滤器表达式的情况下处理结构化异常(这是一个坏主意),这将不起作用,并且可能会产生令人惊讶的结果(死锁、内存泄漏等)。