![](https://csdnimg.cn/release/download_crawler_static/10630140/bg4.jpg)
mprotect(0x3ea0d8a000, 2097152, PROT_NONE) = 0
使用 mprotect 函数对 0x3ea0d8a000 起始的 2097152 字节空间进行保护,
PROT_NONE 参数就是不能访问。
munmap(0x7f52ff23e000, 93234) = 0
调用 munmap 函数,将/etc/ld.so.cache 文件从内存中去映射,与下面的 mmap
对应。
mmap(NULL, 93234, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f52ff23e000
对应源码中使用到的两个系统调用——read 和 write 函数,读取终端内容和
输出内容到终端:
read(0, 5
"5\n", 1024) = 2
write(1, "5\n", 25) = 2
子进程结束,退出码 0
exit_group(0) = ?
从源代码上看,真正能与源码对应上的只有 read 和 write 这两个系统调用,
其他系统调用几乎都是进行初始化工作:装在被执行的程序,载入 libc 函数库,
设置内存映射等。
再来看看可能 strace 用到的常用系统调用。
产生错误是,一般会返回-1,所以会有错误标志和描述符,例如:
open("cls.txt", O_RDONLY) = -1 ENOENT (No such file or directory)
这个表示打开 cls.txt 文件错误,后面描述提示是没有这个文件。
还可以用 strace 来跟踪信号传递。继续使用上面的 test.c 程序,来观察进程接受信号的
情况。在一个终端中执行”strace a.out”,等待的时候不输入任何东西,然后打开另一个终端,
输入命令”killall a.out”,执行结果如下:
[root@localhost debug]# strace a.out
execve("./a.out", ["a.out"], [/* 50 vars */]) = 0
brk(0) = 0x16b5000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x7f672a257000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=93234, ...}) = 0
mmap(NULL, 93234, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f672a240000
close(3) = 0
open("/lib64/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\356\301\240>\0\0\0"..., 832) =
832
fstat(3, {st_mode=S_IFREG|0755, st_size=1930416, ...}) = 0
mmap(0x3ea0c00000, 3750184, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0)
= 0x3ea0c00000
mprotect(0x3ea0d8a000, 2097152, PROT_NONE) = 0