我可以分析我的代码以查看创建大量线程的原因吗?
Posted
技术标签:
【中文标题】我可以分析我的代码以查看创建大量线程的原因吗?【英文标题】:Can I profile my code to see what is creating a lot of threads? 【发布时间】:2011-05-31 09:07:53 【问题描述】:我正在运行 Embarcadero RAD Studio 2010 (C++) 并使用 AQTime 来检查一些泄漏。我想知道是否有一种好方法可以在我的代码中查明大量似乎永远不会死亡的线程的起源。它们是在夜间创建的,因此我看不到它们,但我希望能够返回并查看生成最多线程的代码部分,并在我的侦探工作中使用该信息。
【问题讨论】:
【参考方案1】:我会尝试使用仅包含 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/
这个建议对你有用吗?
【讨论】:
我认为这可能足以为我指明正确的方向。今天将设置一个测试运行,看看我明天会得到什么。 QQ:我必须在 AQTime 中包含哪个模块才能添加 TThread? 似乎可以通过选择“类”并查看 rtl140.bpl 来找到它。但似乎唯一被抓住的是Module Name Class Name Namespace Token Finalizable Total Created Peak Created Live Count Total Size Peak Size Live Size FOOBAR.EXE Local heap 0 False 18 1 0 10362 8192 0
如果我在 Modules 列表中展开模块节点,我可以看到 TThread 类,并检查 Classes 单元内的项目。你没在那里看到吗?至于结果:在结果树中选择 Objects 节点,而不是 Classes - 您将看到创建的各个对象。选择其中任何一个,然后切换到 Details 面板(位于屏幕底部)以查看创建调用堆栈。
顺便说一句,您可以在此处阅读有关结果分析的更多信息:smartbear.com/support/viewarticle/18192【参考方案2】:
是您的代码在创建线程吗?如果是这样,您可以将 TThread 子类化(是的,再次:),覆盖 ctor 以记录调用者的 threadID 并从中派生所有其他线程类。显然,您需要一个线程安全的记录器——您可能已经有了一个。
如果 ctor 调用者的线程 ID 没有太大帮助,因为你的大多数线程都是从一个线程创建的,并且创建了许多线程(例如主 GUI 线程),我想你可以以某种方式记录调用者返回地址并尝试弄清楚电话是从哪里来的。当遇到这样的问题时,恐怕我会采取简单、不明智的方法,在线程构造函数中传递一个额外的整数 ID,并编辑我的代码以在每次调用时传递不同的 ID。是的,这很可怕,但它有效。其他人肯定有更好的方法。如果类中的标准 TThread.create 将额外的“参数:anObject”“传递”到构造函数/线程中,那就太好了,但遗憾的是,没有:((
不过,我只想问一下,为什么要创建这么多线程?在应用程序启动后创建任何线程或在应用程序关闭之前终止任何线程是相当罕见的(实际上,我不会在线程关闭时显式终止它们 - ExitProcess() 做得很好:)。
Rgds, 马丁
【讨论】:
这是一个遗留的服务器->客户端解决方案,包含我已经接管的 500.000-1.000.000 行。连接服务器并向服务器发送“问题”的客户端会创建线程等等。在服务器保存客户端的 gui 信息的地方,这种设计有点奇怪,客户端通过 vi TCP 连接传递给客户端。 哦..维护工作:(((((以上是关于我可以分析我的代码以查看创建大量线程的原因吗?的主要内容,如果未能解决你的问题,请参考以下文章
有人可以通过分析我的 CLR DLL 来破解我的密钥许可系统吗?