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

标签 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 的其他标志)

最佳答案

How can I access the assembly code that is actually executed?

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

mov $_NR_clock_gettime, %eax
syscall

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

关于c++ - 使用valgrind获取clock_gettime的汇编代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50892878/

相关文章:

c++ - C 链接和 C++ 头文件

assembly - ModR/M字节中REG的所有者,方向位

assembly - 最终 assembly 手册指南和 list

assembly - 程序集 8086 中的状态标志

c++ - 如何使用预签名的 url 和 Aws::FStream 将文件上传到 AWS S3?

c++ - vector 推回

c - 如何在不执行 exec 系列函数的情况下更改子进程名称?

java - Android 版 OpenCV 中的矩阵乘法

c++ - 带有空字符的 std::string 是否可能?

c - 如何修复 C 语言中的错误 "use of undeclared identifier n"?