分析dll插件

Profiling a dll plugin

本文关键字:插件 dll 分析      更新时间:2023-10-16

我想在c++中配置一个dll插件。我可以访问源代码(作为作者/维护者),并可以修改它们(如果需要检测)。我没有的是调用dll的主程序的源/符号/等。我只需要建立插件的头。在客户端操作时调用dll。

分析代码的最佳方法是什么?在dll周围"包装"可执行文件是不现实的,这将是无用的,因为在插件中,我从主机调用一些函数,并且我需要配置这些路径,包装器会扭曲性能。

编辑Kieren Johnston的评论后:理想情况下,我想挂钩到加载的dll就像调试器能够(附加到运行的主机进程,并根据需要在dll的某个地方放置一个断点)。这可能吗?如果没有,我需要问另一个问题来问为什么:-)

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

为AIX下的相同任务提供建议/答案可以加分(啊,多环境的乐趣!)

这是可能的,尽管有点烦人。

  1. 将插件DLL部署到主机应用程序需要它的位置
  2. 启动主机应用程序并验证它正在使用插件
  3. 创建一个新的性能会话
  4. 添加主机EXE作为目标从步骤3
  5. 为您的会话选择采样或仪器
  6. 启动配置会话

在此期间保持插件解决方案加载,VS会自动为您的插件找到符号。

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

让我们把这个问题分成两部分:1)定位你可能称之为"瓶颈"的地方,2)衡量通过修复每个瓶颈所获得的总体加速。

(2)很简单,对吗?你所需要的只是一个外部计时器。

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

下面是一个编写得相当好的程序的例子,它的执行时间从48秒减少到20、17、13、10、7、4、2.1,最后是1.1,经过8次迭代这是一个超过40倍的复合加速因子。在每个不同的程序中,你能得到的加速因子是不同的——有些可以得到更少,有些可以得到更多,这取决于它们在一开始离最优值有多近。如何做到这一点并不神秘。方法是随机暂停。(这是使用分析器的另一种选择。分析器测量各种各样的东西,并给你各种线索,这些线索可能有帮助,也可能没有帮助,但它们并不能可靠地告诉你问题是什么。

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