几个有用的 malloc 环境变量

或许除了LDDEBUG等少数几个环境变量,你对glibc的其它环境变量并不熟悉,比如 MALLOC_PERTURB

MALLOCPERTURB 很有用,它的作用是指定用来填充 malloc(3) 所分配的内存的内容,单位是字节。我们知道,malloc(3) 并不会对其所分配的内容进行初始化,所以如果直接使用这部分内存会出错。而 MALLOCPERTURB 就是用来解决这个问题的,你可以用它来填充这些内存,然后一旦使用了未初始化的内存,这部分内存就很容易被识别出来。所以它在某种程度上可以帮助我们检测未初始化的 malloc(3) 内存。

需要注意的是,用来初始化 malloc(3) 内存的值是 MALLOCPERTURB 的二进制取反(也就是~MALLOCPERTURB),但是 0 会取消掉这个功能。通常我们可以这样来设置:

export MALLOCPERTURB=$(($RANDOM % 255 + 1))

另一个是MALLOCCHECK,当设置了它时 glibc 就会使用另外一个 malloc(3) 的实现来检查一些简单的内存错误,比如多次 free(3) 同一个地址,off-by-one 错误等。它有三个值:0表示忽视检测到的错误,1表示打印错误到标准错误输出,2表示检测到错误就马上中止程序。更详细的描述可以参考手册

还有几个和 malloc 内存分配策略相关的环境变量是:

MALLOCMMAP_MAX
MALLOCMMAP_THRESHOLD
MALLOCTOP_PAD
MALLOCTRIM_THRESHOLD

它们分别等价于 mallopt() 的对应参数,可以参考 mallopt() 的手册。更详细的介绍见这里