我正在运行Embarcadero RAD Studio 2010 (C++)并使用AQTime来检查一些泄漏。我想知道是否有一种好方法可以在我的代码中查明大量似乎永远不会死亡的线程的起源。它们是在夜间创建的,所以我看不到它们,但我希望能够返回并查看生成最多线程的代码部分,并在我的侦探工作中使用该信息。
2 回答
我会尝试使用仅包含 TTHread 类的活动区域的分配探查器。开始分析并让它在一夜之间工作。当你第二天早上进来时,点击在 AQtime 中获取结果。结果,您将在报告中看到所有 TTHread 实例,详细信息面板将显示每个实例的创建调用堆栈。为了最大限度地减少收集的数据量,我可能会将分析器的“收集堆栈信息”设置设置为“按例程” - 这不会为您提供行号,但这可能是了解发生了什么的一个很好的起点里面。
如果我需要更多详细信息,我将使用第一步收集的信息在 Function Trace profiler 下运行应用程序,并以仅包含我需要的 rutines 的方式设置区域(基于识别的创建调用堆栈前)。这将为我提供有关该主题的完整信息。
在此处阅读有关分析区域的信息:http: //smartbear.com/support/viewarticle/17895/
并在此处检查分析器描述:
分配:http ://smartbear.com/support/viewarticle/18030/
功能追踪:http ://smartbear.com/support/viewarticle/17971/
这个建议对你有用吗?
是您的代码在创建线程吗?如果是这样,您可以将 TThread 子类化(是的,再次:),覆盖 ctor 以记录调用者的 threadID 并从中派生所有其他线程类。显然,您需要一个线程安全的记录器——您可能已经有了一个。
如果 ctor 调用者的线程 ID 没有太大帮助,因为你的大多数线程都是从一个线程创建的,并且创建了许多线程(例如主 GUI 线程),我想你可以以某种方式记录调用者返回地址并尝试找出在哪里电话是从哪里来的。面对这样的问题,恐怕我会采取简单、不明智的方法,在线程构造函数中传递一个额外的整数 ID,并编辑我的代码以在每次调用时传递不同的 ID。是的,这很可怕,但它确实有效。其他人肯定有更好的方法。如果类中的标准 TThread.create 将额外的“参数:anObject”“传递”到构造函数/线程中,那就太好了,但遗憾的是,没有:((
不过,我只需要问一下,您为什么要创建这么多线程?我很少在应用程序启动后创建任何线程,或者在应用程序关闭之前终止任何线程,(实际上,我不会在线程关闭时明确终止它们 - ExitProcess() 做得很好:)。
Rgds,马丁