strace命令主要是追踪程序的系统的调用,
可执行文件 helloworld由 (makefile基础学习 http://blog.csdn.net/zhouzhenhe2008/article/details/55117592)编译而得
主程序如下:
#include "hello.h"
#include
int s= 9;
int main()
{
hello1_print();
hello2_print();
return 0;
}
#include "hello.h"
void hello1_print()
{
printf("\n***** hello1_print *****\n");
}
#include "hello.h"
void hello2_print()
{
printf("\n***** hello2_print *****\n");
}
执行strace ./helloworld
root@ubuntu:/share/learn# strace ./helloworld
execve("./helloworld", ["./helloworld"], [/* 21 vars */]) = 0
brk(0) = 0x8803000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb76f0000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=89950, ...}) = 0
mmap2(NULL, 89950, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb76da000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/i386-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\1\1\1\3\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\220\210\1\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1807496, ...}) = 0
mmap2(NULL, 1814236, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb751f000
mmap2(0xb76d3000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b3000) = 0xb76d3000
mmap2(0xb76d8000, 7900, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb76d8000
close(3) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb751e000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb751e940, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
mprotect(0xb76d3000, 12288, PROT_READ) = 0
mprotect(0x8049000, 4096, PROT_READ) = 0
mprotect(0xb7717000, 4096, PROT_READ) = 0
munmap(0xb76da000, 89950) = 0
fstat64(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 6), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb76ef000
write(1, "\n", 1
) = 1
write(1, "***** hello1_print *****\n", 25***** hello1_print *****
) = 25
write(1, "\n", 1
) = 1
write(1, "***** hello2_print *****\n", 25***** hello2_print *****
) = 25
exit_group(0) = ?
+++ exited with 0 +++
root@ubuntu:/share/learn# ^C
root@ubuntu:/share/learn#
1.每一行都是一次系统调用。等号左边是系统调用函数及其参数,右边是返回值。
2.系统首先调用execve开始一个新的进程,最后调用exit_group退出进程,完成整个程序的执行过程。
对于命令行执行的程序,execve或者exec系列中的任何一个,均为strace输出系统调用中的第一个。
strace首先调用fork或者clone函数新建一个子进程,然后在子进程中调用exec载入需要执行的程序。
3. brk(0) = 0x8803000, 以0作为参数的调用brk,返回值是内存管理的起始地址,如果程序调用调用malloc,内存管理分配将从0x8803000地址开始。
4.access是检查文件是否存在
5.使用nmap2函数进行匿名内存映射,以此来获取内存空间,其第二参数就是需要获取内存空间的长度,返回值为内存空间的起始地址。匿名内存映射就是为了不涉及具体的文件名,避免了文件的创建和打开,只能用于具有亲缘关系的进程间通信。
真正能与源码对应上的只有write系统调用,其他系统调用基本用于系统初始化工作,装载被执行程序,载入libc函数库,设置内存映射等。
使用strace执行程序主要能查看是否有系统调用错误,统计系统调
用耗时等
strace -c ./helloworld 统计系统调用