问题描述
我在使用valgrind bbv工具的时候遇到了一个问题。同一个可执行文件valgrind的指令数和pmu有很大的不同。 比如SPEC2006 omnetpp,valgrind的指令数大约是571900亿,但是pmu是572900亿。程序运行的环境是一样的。
-
然后我们写了一个简单的程序来验证这一点,结果是valgrind的指令数少了800条左右。 测试代码:
#include <unistd.h> int main(void) { unsigned int i = 0,sum = 0; sum += i; return 0; }
valgrind --tool=exp-bbv ./withmain
指令总数:5232simpleperf stat -e instructions:u ./withmain
(只计算使用空间中的指令)
性能计数器统计:
6,043 条指令:u # (100%)
2.然后我们发现像 _start 和 _init 这样的函数在 valgrind 中是 UNKNowN,并且这些函数的符号大小为零。 Valgrind 在命令分析期间似乎忽略了它们。
我发现m_main.c里面有这种glibc函数的描述:
如果最终可执行文件的链接是在 glibc 存在的情况下完成的,那么 Valgrind 像往常一样从上面的 main() 开始,并且以下所有代码都无关紧要。 但是,这不是预期的使用模式。计划是通过在启动时为 gcc 提供标志 -nodefaultlibs -lgcc -nostartfiles 来避免链接到 glibc。
问:
1) 有谁知道为什么 valgrind 不能分析这些函数?
2) 上面的描述意味着我们必须避免使用glibc函数?有没有其他方法可以解决这种指令数差异?
3) 为什么 elf 文件中某些函数符号(例如 _start、_init 等)的大小为零?但是当我 objdump 该文件时,我可以看到该函数的完整代码。
3.程序环境:
- 运行环境:Andriod10 (aarch64 Linux 4.14)
- cpu 核心:armv8 CotexA55
- 交叉编译器:gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu(valgrind 和测试代码都由这个交叉工具编译,--static、-g -O3 和其他 para 已经尝试过)。我试过 gcc-4.8.2 也有同样的问题。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)