【问题标题】:Getting the assembly code of clock_gettime using valgrind?使用valgrind获取clock_gettime的汇编代码?
【发布时间】:2018-06-17 01:00:28
【问题描述】:

考虑以下代码:

#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 的内部汇编代码,如下所示:

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

【问题讨论】:

  • 你的意思是你用syscall调用的内核代码?您是否使用旧硬件或其他东西,没有constant_tscnonstop_tsc?通常clock_gettime在用户空间运行而不进入内核,只是使用内核导出到用户空间的VDSO页面。 (运行rdtsc)。但是 IIRC,即使在新硬件上,在某些情况下它也可以回退到进行系统调用。也许当 valgrind 单步执行时会发生这种情况?

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


【解决方案1】:

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

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

mov $_NR_clock_gettime, %eax
syscall

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

【讨论】:

    猜你喜欢
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    相关资源
    最近更新 更多