gpt4 book ai didi

c - Unix 中的 Strace 命令

转载 作者:行者123 更新时间:2023-11-30 17:12:50 28 4
gpt4 key购买 nike

程序:

#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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com