Unix中的Strace命令
程序:
#include<stdio.h>
#include<sys/types.h>
#include<malloc.h>
main()
{
int *i1, *i2;
printf("sbrk(0) before malloc(): %xn", sbrk(0));
i1 = (int *) malloc(sizeof(int));
printf("sbrk(0) after `i1 = (int *) malloc(4)': %xn", sbrk(0));
i2 = (int *) malloc(sizeof(int));
printf("sbrk(0) after `i2 = (int *) malloc(4)': %xn", sbrk(0));
}
输出1:
mohanraj@ltsp63:~/Development/chap8$ strace -e sbrk ./a.out
strace: invalid system call `sbrk'
mohanraj@ltsp63:~/Development/chap8$
输出2:
mohanraj@ltsp63:~/Development/chap8$ strace -e brk ./a.out
brk(0) = 0x8380000
brk(0) = 0x8380000
sbrk(0) before malloc(4): 8380000
brk(0x83a1000) = 0x83a1000
sbrk(0) after `i1 = (int *) malloc(4)': 83a1000
sbrk(0) after `i2 = (int *) malloc(4)': 83a1000
mohanraj@ltsp63:~/Development/chap8$
释疑:
Malloc函数使用sbrk系统调用在堆中分配内存。 在调用malloc之后,此处程序中断也会更改。
但是,输出只显示brk系统调用。 strace命令会抛出一个错误,因为“sbrk是无效的系统调用”。 那么,记忆如何?
分配使用malloc?
但是,在调用malloc语句之后,输出显示以下行“brk(0x83a1000)”。 这里,为什么brk值被改变,为什么sbrk没有被打印在输出中?
我认为,只有在第一次调用malloc()后才会创建堆。 直到那时我们不需要堆。 这就是为什么在第一次调用malloc()之后,你看到一个对“brk(0x83a1000)”的调用。
链接地址: http://www.djcxy.com/p/15175.html