pun*_*ess 8 c linux time segmentation-fault
我正在尝试测量系统调用的时间,我尝试使用time(0)
和gettimeofday()
在此程序中,但每当我使用gettimeofday()
它时seg故障.我想我可以使用,time(0)
但我想知道为什么会这样.我知道你们可以看看它并看到问题所在.请不要对我大喊大叫!
我想得到时间,但不能保存在任何地方.
我已经尝试了我能想到的每种代码组合,但是我在这里粘贴了最简单的版本.我是C和Linux的新手.我看一下.stackdump文件,但这对我来说毫无意义.
GetRDTSC位于util.h中rdtsc()
,正如人们所预料的那样.现在它设置为10次迭代但后来循环将运行1000次,没有printf
.
#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("%i\n", (int)(cycles[i]));
}
}
Run Code Online (Sandbox Code Playgroud)
Chr*_*nus 16
gettimeofday()
需要一个指向a的指针来struct timeval
填充时间数据.
所以,例如,你会做这样的事情:
#include <sys/time.h>
#include <stdio.h>
int main() {
struct timeval tv;
gettimeofday(&tv, NULL); // timezone should be NULL
printf("%d seconds\n", tv.tv_secs);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在真正的问题是,GCC将自动包括vdso
你的系统,其中包含了系统调用的码元gettimeofday
.考虑这个程序(整个文件):
int main() {
gettimeofday();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
默认情况下,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)
Run Code Online (Sandbox Code Playgroud)
您恰好正在使用具有已定义符号的函数,但如果没有原型,则无法确定它应该具有多少命令行参数.
如果你用它编译-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]
Run Code Online (Sandbox Code Playgroud)
当然,当你尝试运行它时会出现段错误.有趣的是,它在内核空间中会出现段错误(这是在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 ()
Run Code Online (Sandbox Code Playgroud)
现在考虑这个程序(再次,没有头文件):
typedef struct {
long tv_sec;
long tv_usec;
} timeval;
int main() {
timeval tv;
gettimeofday(&tv, 0);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这将编译并运行得很好 - 没有段错误.你已经为它提供了它所期望的内存位置,即使仍然没有gettimeofday
提供原型.
更多信息:
归档时间: |
|
查看次数: |
12624 次 |
最近记录: |