c - Unix 中的 Strace 命令

标签 c linux unix

程序:

#include<stdio.h>
#include<sys/types.h>
#include<malloc.h>
main()
{
    int *i1, *i2;
    printf("sbrk(0) before malloc(): %x\n", sbrk(0));
    i1 = (int *) malloc(sizeof(int));
    printf("sbrk(0) after `i1 = (int *) malloc(4)': %x\n", sbrk(0));
    i2 = (int *) malloc(sizeof(int));
    printf("sbrk(0) after `i2 = (int *) malloc(4)': %x\n", 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)”的调用。

关于c - Unix 中的 Strace 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31260349/

相关文章:

c - 内存映射文件

c - [NSDictionary getObjects :andKeys:] 示例

c - 在 Windows 中将 Graphviz 与 Clion 结合使用

linux - OpenSIPs - 无法将域地址连接到 OpenSIPs 服务器

c++ - 非阻塞 mlock()

c++ - fork() 和输出

unix - 在UNIX中解析CSV文件,但也处理“”内的数据

c - 在 SIGINT 上释放分配内存的最佳实践

c - VS2013 假设 .c 文件的未识别符号的外部声明

Java Selenium 路径