分析 dll 插件

Posted

技术标签:

【中文标题】分析 dll 插件【英文标题】:Profiling a dll plugin 【发布时间】:2011-11-12 15:53:06 【问题描述】:

我想在 C++ 中分析一个 dll 插件。我可以访问源(作为作者/维护者)并且可以修改它们(如果需要进行检测)。 我没有的是调用 dll 的主机程序的源/符号/等。我只有构建插件所需的标题。 该 dll 在来自客户端的操作时被调用。

进行代码分析的最佳方法是什么?将可执行文件“包装”在 dll 周围是不现实的,而且它没有用处,因为在插件中我从主机调用一些函数并且我需要分析这些路径,包装器会影响性能。

在 Kieren Johnston 的评论后编辑: 理想情况下,我想像调试器一样挂接到加载的 dll 中(附加到正在运行的主机进程并根据需要在 dll 中的某处放置断点)。是否可以?如果没有,我需要问另一个问题来问为什么:-)

我使用的是 Visual Studio 2010 的 TFS 版本。

在 AIX 下为同一任务提供建议/答案的奖励积分(啊,多环境的乐趣!)。

【问题讨论】:

您使用的是什么分析器?您是否只是尝试运行主机程序?如果你有插件的符号,它应该仍然可以工作.. VS2010 内置的分析器。我将尝试解开主机程序的启动过程,但这并不容易,因为它需要各种其他程序/连接。这不是一个简单的 foo.exe ......这需要我一点时间,所以我想检查是否有某种方法可以“挂钩”到加载的 dll 中,就像调试器能够做到的那样。 在您的解决方案中为您的 dll 启用分析器,将所有程序树复制到您的可执行文件夹中,或者制作 vs 将您的 dll 放入程序文件夹中。将可执行文件名设置为 foo.exe 并运行探查器... @neagoegab “复制可执行文件夹中的所有程序树”是什么意思?如果我明白你的意思,我应该能够通过“启用分析器”将 dll 链接到可执行文件的名称。您能否拼出一个完整的答案,以便我为您投票? 【参考方案1】:

这是可能的,虽然有点烦人。

    将插件 DLL 部署到宿主应用程序需要的位置 启动您的主机应用程序并验证它是否正在使用您的插件 创建一个新的性能会话 从步骤 3 开始,将主机 EXE 作为目标添加到会话中 为您的会话选择采样或检测 启动分析会话

在所有这些过程中,保持你的插件解决方案加载,VS 应该会自动为你的插件找到符号。

【讨论】:

这似乎是我的想法。能够(在您的步骤 4 中)将实际运行的进程指定为主机 exe,而无需重新启动它(指定命令行参数等),这对我来说很重要。我会尽快尝试,但如果可行,您的就是我正在寻找的答案:)【参考方案2】:

不确定 VS10,但在较旧的版本中,您可以通过指定运行它的 exe 来调试 dll。

让我们将问题分成两部分:1) 找出您可能称之为“瓶颈”的部分,以及 2) 通过修复每个部分来衡量您获得的整体加速。

(2) 很简单,对吧?您只需要一个外部计时器。

剩下 (1)。如果您和大多数人一样,您认为如果没有对程序各部分进行某种精确计时,就无法找到“瓶颈”。 并非如此,因为大多数情况下,您需要修复以获得最大速度的东西并不是您可以通过这种方式检测到的东西。 它们不一定是糟糕的算法、缓慢的函数或热点。 它们是分布式的东西,由看起来很纯真的精心设计的代码完成,如果以不同的方式编码,恰好会提供巨大的加速机会。

Here's an example 一个写得相当好的程序的执行时间从 48 秒减少到 20、17、13、10、7、4、2.1,最后是 1.1,超过 8 次迭代。** 这是超过 40 倍的复合加速因子。 在每个不同的程序中,您可以获得的加速因子是不同的——有些可以得到更少,有些可以得到更多,这取决于它们与最优值的接近程度。 如何做到这一点并不神秘。 方法是random pausing。 (它是使用探查器的替代方法。探查器测量各种事物,并为您提供各种可能有用或可能无用的线索,但它们不能可靠地告诉您问题所在。)

** 每次迭代实现的加速因子分别为 2.38、1.18、1.31、1.30、1.43、1.75、1.90、1.91。另一种说法是每次迭代减少的时间百分比:58%、15%、24%、23%、30%、43%、48%、48%。我从探查器粉丝那里遇到了困难,因为该方法是如此手动,但他们从不谈论加速结果。 (也许这会改变。)

【讨论】:

谢谢迈克,链接非常有趣,我很欣赏你的贝叶斯解释(如此正式的赞成)。我也一定会尝试您的方法,它具有跨平台适用的附加优点。 @Francesco:很多人都知道这种方法。 this post中说明了您可以修复一些不局限于例程甚至代码行但可以通过仔细查看示例快速找到的东西以节省时间的想法>. @Francesco:如果你倾向于统计,它背后的原理也可以用 beta、二项式或负二项式分布来解释,但你不需要知道就可以使用它。 感谢您提供答案的链接。统计原理对我来说非常清楚:) 我会说该方法旨在找到全局优化而不是局部优化。全局优化可以通过一系列局部优化获得(如果用物理学家的术语来说,“势”足够平滑的话),但这绝不能保证。找到全局最小值的所有相关问题都适用。

以上是关于分析 dll 插件的主要内容,如果未能解决你的问题,请参考以下文章

如何分析纯 dll?

恶意代码分析实战——Lab03-02.dll分析篇

Unity网页游戏特点分析

Azure 流分析自定义 dll

恶意代码分析实战9-3

Visual C++ 中的 MSVCR90.dll 分析 [关闭]