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

上一篇: Strace command in Unix

下一篇: Initial size of heap memory for a program