为什么GDB中堆地址0x12942a0可访问却未出现在进程地址映射表中?
问题原因
- 你贴出的
info proc map输出并不完整,仅包含了有对应磁盘文件映射的内存段(你的可执行程序、libc、ld动态链接器),漏掉了没有对应文件的匿名映射段,0x12942a0正好属于这类未被列出的合法内存段。你贴出的结果连栈段、vdso段都没有,也侧面验证了输出不完整的问题。 - 部分版本的gdb在输出
info proc map时,会默认过滤或截断没有objfile值的匿名段,你可以手动读取proc文件系统获取完整映射验证:- 先在gdb中执行
info proc拿到当前调试进程的PID - 执行
!cat /proc/<替换为你的PID>/maps,输出结果中必然存在覆盖0x12942a0的内存段,一般是标记为[heap]的堆区域。
- 先在gdb中执行
malloc返回的地址属于ptmalloc分配器管理的堆空间:当你申请6字节这类小内存时,ptmalloc会预先通过brk系统调用向操作系统申请一块至少128KB的连续内存作为堆区,再从中切出小内存块返回给用户,这块预先申请的堆区本身就是进程的合法可访问内存,所以你可以正常解引用。
内容的提问来源于stack exchange,提问作者the_endian
相关产品推荐
相关产品推荐

