使用 valgrind 获取 clock_gettime 的汇编代码?
Getting the assembly code of clock_gettime using valgrind?
考虑以下代码:
#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_gettime
、n
次。目前,我正在编译它:
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 的其他标志)
How can I access the assembly code that is actually executed?
您正在访问实际上在Valgrind下执行的代码,即:
mov $_NR_clock_gettime, %eax
syscall
Valgrind zaps AT_SYSINFO_EHDR
来自 auxv[]
向量,因此 GLIBC 的行为就好像 vdso(和其中的 __vdso_clock_gettime
)不存在一样。
考虑以下代码:
#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_gettime
、n
次。目前,我正在编译它:
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 的其他标志)
How can I access the assembly code that is actually executed?
您正在访问实际上在Valgrind下执行的代码,即:
mov $_NR_clock_gettime, %eax
syscall
Valgrind zaps AT_SYSINFO_EHDR
来自 auxv[]
向量,因此 GLIBC 的行为就好像 vdso(和其中的 __vdso_clock_gettime
)不存在一样。