堆越界--coredump 在malloc函数里

本文介绍了使用objdump工具分析可执行程序的内存分布,并详细解释了signal11(Segment Fault)导致的问题及其原因,涉及malloc/free的具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,可执行程序分析: 

objdump -h xxx,可以看到程序内部各个段的内存分布,结果如下(部分): 

 26 .data         0000016c  0000000000879d20  0000000000879d20  00279d20  2**5
                  CONTENTS, ALLOC, LOAD, DATA
 27 .bss          00001000  0000000000879ea0  0000000000879ea0  00279e8c  2**5
                  ALLOC

 实时上,各个段的信息不包括heap和stack的信息。

二,signal 11, Segment Fault。

malloc,内存块实际上是挂在链表上。数据结构包括next,内容,大小。不能被写坏,否则可能造成coredump。

原因见malloc / free 流程图(数据结构)。 

今天看见一篇写得很好的文章可以说明这个问题:-- 

http://www.cnblogs.com/onlyforcloud/articles/4476436.html 

 

  1. malloc实际是调用Void_t*  public_mALLOc(size_t) --> victim = _int_malloc(ar_ptr, bytes); 接下来分析 _int_malloc内部流程
  2. 根据size_t传递的大小计算出mfastbinptr。(idx = fastbin_index(nb);mfastbinptr* fb = &fastbin (av, idx);)| #define fastbin_index(sz) \ ((((unsigned int)(sz)) >> (SIZE_SZ == 8 ? 4 : 3)) - 2) | #define fastbin(ar_ptr, idx) ((ar_ptr)->fastbinsY[idx]) | struct malloc_state { ... mfastbinptr fastbinsY[NFASTBINS]; ... }
  3. 因此实际上public_mALLOc会从 arena_lookup(ar_ptr)里查找出ar_ptr。 
  4. # define tsd_getspecific(key, vptr) (vptr = (key))
  5. static tsd_key_t arena_key; ar_ptr实际等于arena_key.

  6. typedef struct malloc_chunk* mchunkptr; 

  7. sYSMALLOc -> struct malloc_par

转载于:https://www.cnblogs.com/onlyforcloud/p/4465456.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值