我试图测量一个系统调用的时间量,并且我在这个程序中使用了time(0)和gettimeofday() ,但是每当我使用gettimeofday()它就会出错。 我想我可以使用time(0)但我想知道为什么会发生这种情况。 而且我知道你们可以看看它,看看问题。 请不要吼我!
我想得到的时间,但没有保存在任何地方。
我已经尝试了所有我能想到的代码组合,但我在这里粘贴了最简单的代码。 我是C和Linux的新手。 我看着.stackdump文件,但是对我来说是没有意义的。
GetRDTSC在util.h中,正如人们所期望的那样,它使用rdtsc() 。 现在它被设置为10次迭代,但后来循环运行1000次,没有printf 。
Segfault仅在GDB中显示
分割故障139(核心转储)C ++更改操作系统后
分割错误,没有核心转储
发生分段错误时停止Linux bash脚本
_dl_runtime_resolve()中的分段错误
#include <stdio.h> #include <time.h> #include "util.h" int main() { int i; uint64_t cycles[10]; for (i = 0; i < 10; ++i) { // get initial cycles uint64_t init = GetRDTSC(); gettimeofday(); // <== time(0) will work here without a seg fault. // get cycles after uint64_t after = GetRDTSC(); // save cycles for each operation in an array cycles[i] = after - init; printf("%in",(int)(cycles[i])); } }
素数筛中的分割错误
Linux – 有时只有分段错误 – 如何debugging
最小的C / C ++程序,段错误?
优化处理Segfault
简短的版本
gettimeofday()需要一个指向struct timeval的指针来填充时间数据。
所以,举个例子,你可以这样做:
#include <sys/time.h> #include <stdio.h> int main() { struct timeval tv; gettimeofday(&tv,NULL); // timezone should be NULL printf("%d secondsn",tv.tv_secs); return 0; }
长版
真正的问题是,gcc会自动在您的系统中包含vdso ,其中包含系统调用gettimeofday的符号。 考虑这个程序(整个文件):
int main() { gettimeofday(); return 0; }
默认情况下,gcc会在没有警告的情况下编译它。 如果你检查链接的符号,你会看到:
ternus@event-horizon ~> gcc -o foo foo.c ternus@event-horizon ~> ldd foo linux-vdso.so.1 => (0x00007ffff33fe000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f56a5255000) /lib64/ld-linux-x86-64.so.2 (0x00007f56a562b000)
你只是碰巧使用了一个具有定义符号的函数,但没有原型,就没有办法知道它应该有多少个命令行参数。
如果你用-Wall编译它,你会看到:
ternus@event-horizon ~> gcc -Wall -o foo foo.c foo.c: In function 'main': foo.c:2:3: warning: implicit declaration of function 'gettimeofday' [-Wimplicit-function-declaration]
当然,当你尝试运行它时会出现段错误。 有趣的是,它会在内核空间中进行段错误(这是在MacOS上):
cternus@astarael ~/foo> gcc -o foo -g foo.c cternus@astarael ~/foo> gdb foo GNU gdb 6.3.50-20050815 (Apple version gdb-1822) (Sun Aug 5 03:00:42 UTC 2012) [etc] (gdb) run Starting program: /Users/cternus/foo/foo Reading symbols for shared libraries +.............................. done Program received signal EXC_BAD_ACCESS,Could not access memory. Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000001 0x00007fff87eeab73 in __commpage_gettimeofday ()
现在考虑这个程序(再次,没有头文件):
typedef struct { long tv_sec; long tv_usec; } timeval; int main() { timeval tv; gettimeofday(&tv,0); return 0; }
这将编译和运行就好 – 没有段错误。 您已经提供了它所期望的内存位置,即使仍然没有提供gettimeofday原型。
更多信息:
任何人都可以了解gettimeofday如何工作?
有更快的gettimeofday相当于?
POSIX gettimeofday规范
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。