现在的位置: 首页 > 黄专家专栏 > 正文

Electric-fence 介绍

2014年10月30日 黄专家专栏 ⁄ 共 1725字 ⁄ 字号 评论关闭

秒速赛车公式 www.l19l7.cn 一般情况下,程序出现 segmentation fault,可以有多种方法 debug,利用 log 能找出程序 90% 以上的 bug,剩下的简单一点可以采取二分法注释掉代码或者祭起 gdb 这个大杀器。但是有的时候,gbd 给出的 crash 上下文其实并不是真正发生问题的第一现场,在多线程程序设计中,这种情景会让 bug 的追查陷入误区。

介绍一个内存 debug 的工具, electric-fence。 我手头的版本是 2.1.13。

electric-fence 的原理是重写 malloc(3) 和 free(3), 多分配一个 page 在用户需要的内存空间之后,并且利用函数 mprotect(2) 将这个 page 写?;?。

mprotect 函数的介绍如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
MPROTECT(2)                 BSD System Calls Manual                MPROTECT(2)

NAME
     mprotect -- control the protection of pages

SYNOPSIS
     #include <sys/mman.h>

     int
     mprotect(void *addr, size_t len, int prot);

DESCRIPTION
     The mprotect() system call changes the specified pages to have protection prot.  Not all implementa-tions implementations
     tions will guarantee protection on a page basis but Mac OS X's current implementation does.

     When a program violates the protections of a page, it gets a SIGBUS or SIGSEGV signal.

     Currently prot can be one or more of the following:

     PROT_NONE   No permissions at all.
     PROT_READ   The pages can be read.
     PROT_WRITE  The pages can be written.
     PROT_EXEC   The pages can be executed.

RETURN VALUES
     Upon successful completion, a value of 0 is returned.  Otherwise, a value of -1 is returned and errno
     is set to indicate the error.

ERRORS
     mprotect() will fail if:

     [EACCES]           The requested protection conflicts with the access permissions of the process on the
                        specified address range.

     [EINVAL]           addr is not a multiple of the page size (i.e.  addr is not page-aligned).

     [ENOTSUP]          The combination of accesses requested in prot is not supported.

可以看出,该函数只能操作对齐的 page, 控制该 page 是否能可读,可写,可执行。

所以,当通过 electric-fence 分配出的内存第一次被写越界的时候,直接报错退出。 这样,我们就可以发现错误的第一现场。

electric-fence 通过定义 EF_PROTECT_BELOW 设置对分配内存开头越界的?;?, 由于 mprotect(2) 只能操作对齐的 page, 所以某块内存都头尾都加上一个 page 来检测写入越界显然是不可行的。

electric-fence 也有如下的缺点:

  1. 每一次分配都是利用一个 semaphore 同步,没有 thread local 的分配
  2. malloc 和 free 在 slot 都是线性查找,这也造成了整体性能的落后
  3. 内存消耗大,这个是显然的,特别对于频繁的小内存分配

2,3 点都是造成整个 lib 性能较低的原因。简单说,这还是一个比较简陋的工具,如果能借鉴 tcmalloc, jemalloc 等设计可能会更好一点。

抱歉!评论已关闭.

  • 听,盲童唱出心底的阳光 2018-12-17
  • 老婆告老公索债780万 原是二人自导自演 2018-12-17
  • 井冈山交警开展重点车辆严重交通违法行为有奖举报工作 2018-12-17
  • 停车收费新政首日举报量攀升 2018-12-17
  • 这是世界杯开赛当晚的广西 2018-12-16
  • 【理上网来·喜迎十九大】建设世界一流军队的科学指南 2018-12-16
  • 第六届北京农业嘉年华--北京频道--人民网 2018-12-16
  • 【专题】节能降耗 保卫蓝天——浙江省暨杭州市2018年节能宣传周 2018-12-15
  • 【奋斗在新时代】劳道“歹猫”增色互联网“表情” 2018-12-15
  • 驾车撞倒城管队员反复碾压 义乌暴力摊贩被刑拘 2018-12-15
  • 《中国汽车报》2018“西部温暖计划”公益试驾活动即将启程 2018-12-14
  • 奇瑞新能源瑞虎3xe上市 售价8.98万 2018-12-14
  • 几家性价比超高的烤肉店 赶紧去试试 2018-12-14
  • 和“看着就想笑”说说你的“8421” 2018-12-13
  • 中共十八大以来藏语新词术语发布 2018-12-13
  • 686| 639| 760| 251| 782| 451| 182| 704| 119| 847|