我想使用 gcc 的 gprof 逐行分析。但是在编译我的程序、运行它并执行
gprof -l binary_name
后,我收到如下消息:
gprof: somebody miscounted: ltab.len=9403 instead of 9391
gprof binary_name
运行没有错误,但我无法使用 -l
选项运行。我无法找到这方面的文档。谷歌自动完成表明我不是第一个收到此错误的人,但我找不到任何相关线程。我尝试过 g++-9 g++-10 和 g++-11。我尝试过使用 -g
和 -ggdb
进行编译。我认为也许 gprof 不喜欢我的程序是多线程的,但即使删除 OpenMP 依赖项并告诉 libtorch 使用 1 个线程,我也会得到相同的行为。
我怀疑这个错误不应该被最终用户看到,因为它没有给出解决方案的提示,并提到
ltab.len
这很可能是用户不会熟悉的 gcc 代码中的变量。
我不知道这是否是通用解决方案,但对我来说,我意识到当您启用优化时会发生此错误。如果我编译:
g++ -g -pg -O3 main.cpp # gprof: somebody miscounted: ltab.len=1034 instead of 1027
g++ -g -pg -O2 main.cpp # gprof: somebody miscounted: ltab.len=775 instead of 768
g++ -g -pg -O1 main.cpp # gprof: somebody miscounted: ltab.len=640 instead of 633
g++ -g -pg -O0 main.cpp # this works
我猜编译器优化后,
gprof
无法将分析器输出映射到行。
通过从 gprof 命令中删除 -l,我能够使带有 -02 优化的 g++ -pg -g 正常工作。 所以首先编译并运行程序。然后将 gmon.out 和使用调试选项编译的二进制文件移动到同一目录中。然后运行
sudo gprof binary_name gmon.out binary_name > output.txt