如何在不分析主机应用程序的情况下剖析共享对象?

问题描述:

我有一个主机应用程序,我写了一个插件。我将插件编译到共享对象(比如foo.so),主机应用程序将通过dlopen加载它。在这种情况下,我的主机应用程序是来自llvm的选择工具(尽管我不认为这对于这个问题很重要)。如何在不分析主机应用程序的情况下剖析共享对象?

我想编译我的插件启用配置文件(即g++ -pg,gprof)。但是,当我这样做时,配置文件输出文件gmon.out永远不会被创建。也许gprof希望有人叫一个安装程序,或类似的东西。

由于各种原因,我想避免使用-pg重新编译主机应用程序。我很好奇,如果可以在不分析主机应用程序选项的情况下分析共享对象foo.so。

我也研究过其他分析工具; HP的qprof应该能够处理这种情况,但它无法解析共享对象中函数的名称(它以非常幼稚的方式回退到addr2line)。

感谢, 尼克

我假设你想这样做是想办法优化插件(而不是刚开定时信息)的原因。

您可以在调试器或IDE下运行主机应用程序吗? IDE是否有暂停按钮,或者您是否可以用Ctrl-C或其他键来中断它?

然后,您可以使用this technique快速找到代价高昂的代码。只有在插件运行时才采样,或者如果您不能这样做,只需忽略不会在插件中结束的示例。

即使你得到gprof工作,或类似的分析器,you're likely to be disappointed