使用valgrind获取clock_gettime的汇编代码?

时间:2018-06-17 01:00:29

标签: c++ c assembly valgrind system-calls

请考虑以下代码:

#include <ctime>
#include <cstdlib>

int main(int argc, char* argv[])
{
    const std::size_t n = argc > 1 ? std::atol(argv[1]) : 65536;
    struct timespec tp;
    volatile std::size_t x = 0;
    for (std::size_t i = 0; i < n; ++i) {
        clock_gettime(CLOCK_REALTIME, &tp);
        x += tp.tv_nsec;
    }
    return x;
}

这是一个只调用clock_gettimen次的测试代码。目前,我正在编写它:

g++ -Wall -Wextra -g -std=c++11 -O3 clock_gettime.cpp -o clock_gettime

我正在用以下代码分析代码:

valgrind --tool=callgrind --dump-instr=yes --collect-jumps=yes ./clock_gettime 100000

但是,valgrind无法访问clock_gettime的内部汇编代码,如下所示: clock_gettime asm

如何访问实际执行的汇编代码? (通过使用编译器标志或valgrind的其他标志)

1 个答案:

答案 0 :(得分:2)

  

如何访问实际执行的汇编代码?

正在访问在Valgrind下实际执行的代码,即:

mov $_NR_clock_gettime, %eax
syscall

来自AT_SYSINFO_EHDR向量的Valgrind zaps auxv[],因此GLIBC的行为就好像vdso(及其中的__vdso_clock_gettime)不存在。

相关问题