GDB如何知道堆在哪里分配的?

3
在GDB中,运行info proc mappings会转储目标的地址空间,包括堆。我的问题是,GDB如何知道堆分配在哪里?显然,像malloc这样的函数返回一个地址,但它并没有指定确切的堆起始地址或其分配大小。
1个回答

2

在Linux上调试实时进程时,GDB的info proc mappings命令会解析/proc/pid/maps文件 - 该文件包含进程内存区域的详细信息 - 然后格式化并显示信息。如果映射文件中的条目的pathname字段为[heap],那么GDB将显示它。

Linux内核的实现。对于/proc/pid/maps将在对应包含地址为break的内存区域的行上显示[heap],历史上这个地址一直是数据段的顶部。使用sbrk系统调用可以将断点移动到更高或更低的地址。

glibc的malloc用于小型分配的堆。对于较大的分配,它使用匿名支持调用mmap,您可以在映射文件中看到这些内存区域 - 它们没有pathname字段。

我写了一个小程序,调用malloc来分配各种大小的内存,然后显示每个分配所放置的内存区域。它在我的回答Can't search into heap using gdb中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接