关于HEAPCHECK=normal与tcmalloc冲突问题

有点郁闷,被同一个石头绊倒了二次,好记性还是不如乱笔头!事情是这样子的......

在C++的工程单测中,一般会为TESTS目标指定TESTS_ENVIRONMENT,如下:

TESTS_ENVIRONMENT                      = LD_LIBRARY_PATH=/usr/local/lib:/usr/lib@BITS@ HEAPCHECK=normal
TESTS                                                   = $(check_PROGRAMS)

值得注意的是,这里HEAPCHECK指定为normal,这里参考heap checker

但发现make check时,会产生core,ldd 单测二进制,发现主要是gperftools-libs(当前版本2.7-9)中tcmalloc库(libtcmalloc.so)"污染"导致,但本身代码中没有做tcmalloc的链接。

并且发现签名相同的单测二进制,在另外一台机器上ldd则没有tcmalloc的依赖。

于是乎跟踪下去,发现brpc有tcmalloc的依赖,二台机器brpc版本和so签名全部相同,但同样在另外一台机器上ldd则没有tcmalloc的依赖。

此问题似乎难住了,ldd -u以及readelf -d都没有发现有任何异常。

继续跟踪brpc的依赖项,发现ldd /lib64/libleveldb.so.1,有依赖tcmalloc,导致堆内存检查错误。

leveldb版本是1.22-4.el8,找到对应源码,去掉tcmalloc链接即可。此处应该是EPEL官方源引入导致。

故写此文档陈述此bug。

Monthly Archives

Pages

Powered by Movable Type 7.9.4

About this Entry

This page contains a single entry by Cnangel published on January 18, 2023 1:50 PM.

Fedora37 发布了 was the previous entry in this blog.

debmake自动创建模板失败的解决方案 is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.