strace -c 不报告退出系统调用的情况

问题描述 投票:1回答:1

我正在做一些功课,我需要报告一个C程序利用了哪些系统调用。

不过我注意到 exit 不见得 strace 报告。

#include <stdlib.h>

int main() {
    exit(0);
}

┌─[brendon@parrot]─[~/Desktop/Classes/OSInternals/Lab3]
└──╼ $gcc exit.c
┌─[brendon@parrot]─[~/Desktop/Classes/OSInternals/Lab3]
└──╼ $strace -c ./a.out
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 38.74    0.001056         150         7           mmap
 11.12    0.000303         151         2           openat
 10.20    0.000278         139         2           fstat
 10.09    0.000275         137         2           close
  9.21    0.000251         251         1           arch_prctl
  7.45    0.000203          67         3           mprotect
  6.20    0.000169         169         1           munmap
  5.25    0.000143         143         1           read
  1.76    0.000048          48         1         1 access
  0.00    0.000000           0         1           brk
  0.00    0.000000           0         1           execve
------ ----------- ----------- --------- --------- ----------------
100.00    0.002726                    22         1 total

如你所见。exit 不显示在报告中。难道我说错了,是系统调用?阅读 usr/include/x86_64-linux-gnu/asm/unistd_64.h,我可以看到一个 exit 条目。

. . .
#define __NR_execve 59
#define __NR_exit 60
#define __NR_wait4 61
. . .

我错过了什么?

在Parrot OS上运行。



我很犹豫要不要发这个帖子,因为不清楚这是否够主题。如果认定不符合主题,我可以及时删除。

c system-calls exit
1个回答
1
投票

由于某些原因,它没有出现在 -c 摘要,但它确实显示在常规的 strace 产量。

#include <stdlib.h>

int main(void)
{
    exit(69);
}
$ strace ./exit
execve("./exit", ["./exit"], 0x7ffddc502ce0 /* 42 vars */) = 0
brk(NULL)                               = 0x563a56e63000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=113870, ...}) = 0
mmap(NULL, 113870, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f16c8537000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260A\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1824496, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f16c8535000
mmap(NULL, 1837056, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f16c8374000
mprotect(0x7f16c8396000, 1658880, PROT_NONE) = 0
mmap(0x7f16c8396000, 1343488, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x22000) = 0x7f16c8396000
mmap(0x7f16c84de000, 311296, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16a000) = 0x7f16c84de000
mmap(0x7f16c852b000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b6000) = 0x7f16c852b000
mmap(0x7f16c8531000, 14336, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f16c8531000
close(3)                                = 0
arch_prctl(ARCH_SET_FS, 0x7f16c8536500) = 0
mprotect(0x7f16c852b000, 16384, PROT_READ) = 0
mprotect(0x563a565ba000, 4096, PROT_READ) = 0
mprotect(0x7f16c857a000, 4096, PROT_READ) = 0
munmap(0x7f16c8537000, 113870)          = 0
exit_group(69)                          = ?
+++ exited with 69 +++
$ strace -c ./exit 
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
  0.00    0.000000           0         1           read
  0.00    0.000000           0         2           close
  0.00    0.000000           0         2           fstat
  0.00    0.000000           0         7           mmap
  0.00    0.000000           0         4           mprotect
  0.00    0.000000           0         1           munmap
  0.00    0.000000           0         1           brk
  0.00    0.000000           0         1         1 access
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         1           arch_prctl
  0.00    0.000000           0         2           openat
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                    23         1 total

鉴于 -c 衡量 时候 在每次系统调用中所花费的时间,我猜测它没有任何意义来衡量。exit (永远不会回来)。

© www.soinside.com 2019 - 2024. All rights reserved.