【问题标题】:How Does AQTime Do It?AQTime是如何做到的?
【发布时间】:2008-11-26 22:02:29
【问题描述】:

我一直在测试the performance and memory profiler AQTime,看看是否值得为我的 Delphi 应用程序花费这么多美元。

令我惊讶的是,它如何在不修改应用程序源代码和不添加过多调试运行的时间。

他们如此高效地执行此操作的方式让我觉得这里可能使用了一些我不知道的技术/技术,了解这些会很有用。

您知道他们使用什么样的方法来逐行捕获执行而无需更改代码?

是否还有其他分析工具也可以进行非侵入性逐行检查,如果有,它们是否使用相同的技术?

【问题讨论】:

  • AQTime 太棒了。我喜欢它。完全推荐它。

标签: performance profiler profiling aqtime


【解决方案1】:

我为 Delphi 制作了一个开源分析器,它的作用相同: http://code.google.com/p/asmprofiler/

它并不完美,但它是免费的 :-)。也是使用Detour技术。 它存储每个呼叫(您必须手动设置要分析的功能), 所以它可以制作一个准确的通话历史树,包括一个时间表(!)。

【讨论】:

  • 感谢安德烈,辛苦了。我要试试看。 Delphi 社区可以真正使用集成到 Delphi IDE 中的分析器。既然你已经把它开源了,你可能想考虑把它捐给 Embarcadero,他们可能会把它包括在内。或者以每支 200 美元的价格推销它。
  • 现在确实有一个! RAD Studio XE Enterprise 和 ARchitect 现在包括 AQTime Lite。它是内置的。如果您购买 AQTime pro,它会完全集成到 IDE 中,或者您可以单独使用它。
【解决方案2】:

这只是猜测,但也许AQtime基于类似于Microsoft Detours的技术?

Detours 是一个用于检测的库 x86、x64 上的任意 Win32 函数, 和 IA64 机器。绕道拦截 通过重写 Win32 函数 目标函数的内存代码。

【讨论】:

  • 必须!除非有人知道不同的东西,否则我会给你答案。
  • 有些人称之为“挂钩”。 MadCodeHook 是 Delphi 的一个工具,可让您检测代码。有趣的是,代码挂钩的一个限制是您不能挂钩太短而无法进行内联修改的函数。 AQTime 报告的函数太小而无法使用钩子,您所能做的就是忽略它们。这让我认为,挂钩(检测、拦截)肯定是 AQTime 所做的。
【解决方案3】:

我不太了解 Delphi,但 C 应用程序调试器可以相对轻松地进行逐行分析 - 它可以加载代码并将每个代码路径与代码块相关联。然后它可以中断所有条件跳转指令,然后观察并查看采用了什么代码路径。像 gdb 这样的调试器可以相对有效地运行,因为它们通过内核工作并且不修改代码,它们只是在每行执行时得到通知。如果某些事情导致块提前退出(longjmp),调试器可以挂钩并计算它发生时它进入块的距离并仅增加这些行。

当然,编写代码仍然很困难,但是当我说简单时,我的意思是你可以做到这一点,而无需浪费时间在每条指令上更新计数器。

【讨论】:

    【解决方案4】:

    早已不复存在的 TurboPower 还为 Delphi 提供了一个出色的剖析/分析工具,称为 Sleuth QA Suite。我发现它比 AQTime 简单得多,但也更容易获得有意义的结果。可能值得尝试追踪 - eBay,也许?

    【讨论】:

      猜你喜欢
      • 2014-10-26
      • 2011-06-25
      • 1970-01-01
      • 2013-02-26
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      相关资源
      最近更新 更多