发现为啥在我的 C++ 应用程序中创建线程及其作用的最佳方法是啥?
Posted
技术标签:
【中文标题】发现为啥在我的 C++ 应用程序中创建线程及其作用的最佳方法是啥?【英文标题】: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。
【问题讨论】:
【参考方案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 方库中生成和运行的线程无济于事。
【讨论】:
以上是关于发现为啥在我的 C++ 应用程序中创建线程及其作用的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
使用 C++ 在我的应用程序的菜单栏中创建“保存当前设置”功能