代码之家  ›  专栏  ›  技术社区  ›  Bogdan Gavril MSFT

如何打破句柄创建?

  •  0
  • Bogdan Gavril MSFT  · 技术社区  · 16 年前

    我有一个生成多个子进程的应用程序。在启动子项之前,我创建一个stdout和一个日志文件的stderr句柄(例如,如果我要启动proca,我创建log a.log的句柄)。我在子进程上设置了这些句柄。

    通过使用ProcExplorer,我可以看到 每个 子进程具有对 每个 日志文件(所以proca有loga、logb等的句柄)。这会造成以后的问题。

    我想知道proca何时创建logb的句柄。有什么想法吗?

    2 回复  |  直到 14 年前
        1
  •  1
  •   MarmouCorp    16 年前

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

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

    为什么不在子进程中创建句柄?我知道它确实对这个问题做出了昂贵的响应,但是很明显,如果proca只需要loga的句柄,那么最好在子进程proca中创建loga的句柄。

        2
  •  1
  •   bk1e    16 年前

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

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

    另一种方法是告诉调试器附加到所有子进程。有几种方法可以 enable this behavior with WinDbg or ntsd .这样,您可以将调试器附加到父进程,它将自动附加到子进程proca,并且您可以在适当的代码中设置断点。

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

    推荐文章