使用strace追踪程序的系统调用


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   统计系统调用


root@ubuntu:/share/learn# strace -c ./helloworld 


***** hello1_print *****


***** hello2_print *****
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
  0.00    0.000000           0         1           read
  0.00    0.000000           0         4           write
  0.00    0.000000           0         2           open
  0.00    0.000000           0         2           close
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         3         3 access
  0.00    0.000000           0         1           brk
  0.00    0.000000           0         1           munmap
  0.00    0.000000           0         3           mprotect
  0.00    0.000000           0         7           mmap2
  0.00    0.000000           0         3           fstat64
  0.00    0.000000           0         1           set_thread_area
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                    29         3 total
root@ubuntu:/share/learn# 
root@ubuntu:/share/learn# 
root@ubuntu:/share/learn# 

你可能感兴趣的:(Unix高级环境编程,C/C++,linux命令学习)