【问题标题】:What's the best way to discover why threads are being created in my C++ app and what they do?发现为什么在我的 C++ 应用程序中创建线程及其作用的最佳方法是什么?
【发布时间】:2009-09-29 18:45:46
【问题描述】:

我正在审核一个在 Windows 上运行的 C++ 应用程序,该应用程序针对多线程调试 DLL 进行编译。它有很多可以产生线程的第三方依赖项。我需要跟踪每个线程存在的原因以及它分配了多少堆栈空间。

什么是追溯线程创建开始的好方法,以便我可以看到它是在哪里产生的?

更新:我应该指出,我拥有整个应用程序的源代码,而不是 Microsoft 依赖项。但是,许多线程的调用堆栈仅存在于操作系统附带的库中,例如 ntdll.dll 和 kernel32.dll。

【问题讨论】:

    标签: c++ windows debugging multithreading


    【解决方案1】:

    您可以使用Windows Performance Toolkit 查看 ThreadCreate 事件。在 Vista 上,您可以获得每个线程创建的堆栈,因此您可以查看哪些代码正在创建线程。

    收集跟踪:

    xperf -on base -stackwalk ThreadCreate 
    

    运行你的场景,写出跟踪:

    xperf -stop -d mylog.etl
    

    查看跟踪文件:

    xperf mylog.etl
    

    在 Trace 菜单选项中,适当设置符号路径并加载符号。您可以使用Microsoft Symbol Server 获取操作系统的公共符号。

    在“进程生命周期”下,右键单击并选择“线程摘要表”。您可以为创建堆栈和用户堆栈大小添加列。展开您的进程,您可以看到已创建的所有线程、创建该线程的堆栈以及堆栈大小。

    【讨论】:

      【解决方案2】:

      Process Explorer 可以列出线程及其调用堆栈。如果您想在不附加真正调试器的情况下检查进程,这非常有用。

      【讨论】:

        【解决方案3】:

        为什么不 grep 源代码并寻找它呢? (这会告诉你原因)

        【讨论】:

          【解决方案4】:

          您可以访问源代码吗?如果是这种情况,请创建一个函数来显示线程 ID 和分配的内存并为所有线程调用它。

          【讨论】:

            【解决方案5】:

            我还没有遇到回溯到CreateThread 调用的方法,我不认为该信息可用于线程。

            帮助我几次的是命名我控制的线程,请参阅MSDN。不过,对于在 3rd 方库中生成和运行的线程无济于事。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-05-11
              • 2021-10-01
              • 1970-01-01
              • 1970-01-01
              • 2021-07-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多