我可以分析我的代码,看看是什么创建了很多线程?

时间:2011-05-31 09:07:54

标签: multithreading profiling c++builder aqtime

我正在运行 Embarcadero RAD Studio 2010(C ++)并使用了 AQTime 来检查是否存在泄漏。我想知道是否有一种很好的方法可以在我的代码中查明似乎永远不会死的大量线程的来源。它们是在夜间创建的,因此我没有看到它们发生但我希望能够返回并查看生成最多线程的代码的哪些部分并在我的侦探工作中使用该信息。

2 个答案:

答案 0 :(得分:1)

我会尝试使用Allocation Profiler,只有一个活动区域只包含TTHread类。开始分析并让它在一夜之间工作。当您第二天早上来时,请点击AQtime中的获取结果。因此,您将在报告中看到所有TTHread实例,“详细信息”面板将显示每个实例的创建调用堆栈。 为了最大限度地减少收集的数据量,我可能会将探测器的“收集堆栈信息”设置设置为“按例程” - 这不会给你行号,但这可能是一个很好的起点,可以找出发生了什么内部。

如果我需要进一步的细节,我会使用第一步收集的信息在功能跟踪分析器下运行应用程序,区域设置的方式只包括我需要的程序(基于创建)之前确定的调用栈)。 这将为我提供有关该主题的完整信息。

在此处阅读有关分析区域的信息:http://smartbear.com/support/viewarticle/17895/

并在此处查看分析器说明:

分配:http://smartbear.com/support/viewarticle/18030/

功能追踪:http://smartbear.com/support/viewarticle/17971/

此建议是否适用于您的情况?

答案 1 :(得分:0)

是你的代码创建线程吗?如果是这样,你可以继承TThread,(是的,再次:),覆盖ctor以记录调用者的threadID并从中派生所有其他线程类。显然,你需要一个线程安全的记录器 - 你可能已经有了一个。

如果ctor调用者的线程ID没有多大帮助,因为大多数线程都是从一个创建了很多创建的线程创建的(例如主GUI线程),我想你可以以某种方式记录调用者返回地址。尝试找出来电的来源。当遇到这样的问题时,我担心我会采用简单,不完整的方法,在线程构造函数中传递一个额外的整数ID,并编辑我的代码以在每次调用时传递不同的ID。是的,这太可怕但它确实有效。其他人肯定有更好的方法。如果类中的标准TThread.create需要额外的'参数:anObject'来“传递”到构造函数/线程中,那就太好了,但遗憾的是,没有:((

但是,我只是要问,为什么要创建这么多线程?我很少在app启动后创建任何线程,或者在app关闭之前终止任何线程(实际上,我不打算在线程关闭时明确地终止它们 - ExitProcess()做得很好:)。

RGDS, 马丁