分类: C/C++
2010-05-20 20:07:42
原文在这里,wangcong写的。
如有侵权,请联系我,我将在第一时间将其删除。
或许除了LD_DEBUG等少数几个环境变量,你对glibc的其它环境变量并不熟悉,比如 MALLOC_PERTURB_。
MALLOC_PERTURB_ 很有用,它的作用是指定用来填充 malloc(3) 所分配的内存的内容,单位是字节。我们知道,malloc(3) 并不会对其所分配的内容进行初始化,所以如果直接使用这部分内存会出错。而 MALLOC_PERTURB_ 就是用来解决这个问题的,你可以用它来填充这些内存,然后一旦使用了未初始化的内存,这部分内存就很容易被识别出来。所以它在某种程度上可以帮助我们检测 未初始化的 malloc(3) 内存。
需要注意的是,用来初始化 malloc(3) 内存的值是 MALLOC_PERTURB_ 的二进制取反(也就是~MALLOC_PERTURB_),但是 0 会取消掉这个功能。通常我们可以这样来设置:
export MALLOC_PERTURB_=$(($RANDOM % 255 + 1))
另一个是MALLOC_CHECK_,当设置了它时 glibc 就会使用另外一个 malloc(3) 的实现来检查一些简单的内存错误,比如多次 free(3) 同一个地址,off-by-one 错误等。它有三个值:0表示忽视检测到的错误,1表示打印错误到标准错误输出,2表示检测到错误就马上中止程序。更详细的描述可以参考。
还有几个和 malloc 内存分配策略相关的环境变量是:
MALLOC_MMAP_MAX_
MALLOC_MMAP_THRESHOLD_
MALLOC_TOP_PAD_
MALLOC_TRIM_THRESHOLD_
它们分别等价于 mallopt() 的对应参数,可以参考。更详细的介绍。