我正在尝试在GNU / Linux上分析一个共享库来进行实时音频处理,因此性能非常重要。我运行另一个程序,它将它连接到我的系统的音频输入和输出,并使用callgrind配置它。
查看KCacheGrind中的结果,我可以获得有关哪些函数占用大部分时间的大量信息。但是,它不会让我看一行一行的信息,而是说我需要用调试符号编译它并再次运行分析。
我正在分析的程序没有使用调试符号编译,但库是。我知道这一点,因为有趣的是, cachegrind 的源代码注释工作正常。
当我运行callgrind时,它表示默认是转储源行信息,但它没有这样做。有什么方法可以强制它,或弄清楚是什么阻止了它?
答案 0 :(得分:2)
参见valgrind FAQ,特别是4.2和4.3
http://valgrind.org/docs/manual/faq.html#faq.unhelpful
http://valgrind.org/docs/manual/faq.html#faq.aliases
答案 1 :(得分:0)
您使用--dump-instr=yes --trace-jump=yes
获取指令级别信息吗?
答案 2 :(得分:0)
默认情况下,您已经正确识别了callgrind
,因此会在源代码级别执行事件计数。
从callgrind
的手册页引用-
--dump-line=<no|yes> [default: yes]
但是,在后期处理期间,您必须使用callgrind_annotate
选项为--include
工具提供源文件的路径,以使其生成带有逐行信息的带注释的源代码。
从callgrind_annotate
的手册页引用-
-I, --include=<dir>
Add dir to the list of directories to search for source files.
这是为我工作的示例命令-
callgrind_annotate --auto=yes --include=/home/sangeek/source callgrind.out.15078 > callgrind.annotate.txt
还请注意,源代码级注释报告位于文件中通常的file:function
摘要报告之后。因此,您必须滚动浏览报告中的内容才能访问它们。