【问题标题】:How can you break on handle creation?你怎么能打破句柄创建?
【发布时间】:2009-03-16 10:33:34
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ file process handles


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,你让我走上了正轨。子进程共享父进程的句柄。我无法继续使用您的解决方案,但我正在尝试找到一种方法来列出所有打开的句柄。
    • 已解决,子进程从父进程继承句柄,作为输出重定向的副作用。
    【解决方案2】:

    当子进程 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,您可以在相应的代码中设置断点。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-26
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多