为什么valgrind bbv工具的指令数和pmu有很大的不同?以及如何解决?

问题描述

我在使用valgrind bbv工具的时候遇到了一个问题。同一个可执行文件valgrind的指令数和pmu有很大的不同。 比如SPEC2006 omnetpp,valgrind的指令数大约是571900亿,但是pmu是572900亿。程序运行的环境是一样的。

  1. 然后我们写了一个简单的程序来验证这一点,结果是valgrind的指令数少了800条左右。 测试代码

    #include <unistd.h>
    int main(void)
    {
        unsigned int i = 0,sum = 0;
        sum += i;
        return 0;
    }
    

    valgrind --tool=exp-bbv ./withmain
    指令总数:5232

    simpleperf 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.程序环境:

  1. 运行环境:Andriod10 (aarch64 Linux 4.14)
  2. cpu 核心:armv8 CotexA55
  3. 交叉编译器:gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu(valgrind 和测试代码都由这个交叉工具编译,--static、-g -O3 和其他 para 已经尝试过)。我试过 gcc-4.8.2 也有同样的问题。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)