123 Star 2 Fork 27

src-openEuler/jemalloc

【22.03-RC2】【arm/x86】jemalloc和php组合场景使用时,通过LD_PRELOAD加载jemalloc动态库后,执行php-fpm,报错:free(): invalid pointer 已放弃(核心已转储)

已验收
缺陷
创建于  
2022-03-03 10:23

【环境信息】
系统:arm,x86虚拟机
内存:4g
cpu:4核
OS版本:
openeulerversion=openEuler-22.03-LTS
compiletime=2022-02-25-07-53-11
gccversion=10.3.1-20220223.7.oe1
kernelversion=5.10.0-59.0.0.32.oe1
openjdkversion=1.8.0.312.b07-11.oe1

【问题复现步骤】
1、安装jemalloc和php相关的包
dnf install jemalloc* php php-fpm lsof -y
2、通过LD_PRELOAD加载jemalloc动态库
export LD_PRELOAD=/usr/lib64/libjemalloc.so
3、创建/run/php-fpm/目录为地址"/run/php fpm/www.sock"绑定socket
mkdir -p /run/php-fpm/
4、启动php-fpm 预期结果1
/usr/sbin/php-fpm
5、查看php-fpm是否启动成功 预期结果2
ps -ef | grep -E 'php-fpm|apache'
6、查看jemalloc是否生效 预期结果3
lsof -n | grep jemalloc | grep php-fpm

【预期结果】
1、启动php-fpm成功,没有报错返回
输入图片说明
2、有php-fpm进程生成
输入图片说明
3、jemalloc生效
输入图片说明

【实际结果】
1、启动php-fpm报错,返回:free(): invalid pointer 已放弃(核心已转储)
输入图片说明
2、因为启动php-fpm报错,没有php-fpm进程生成
输入图片说明
3、因为启动php-fpm报错,jemalloc没有生效
输入图片说明

【备注】
附件中有messages日志

附件
messages(6.03 KB)下载

评论 (2)

Emily_LiuLiu 创建了缺陷 3年前
openeuler-ci-bot 添加了
 
sig/Runtime
标签
3年前
Emily_LiuLiu 修改了描述 3年前

问题情况说明:
1.导致问题的直接原因:设置LD_PRELOAD=/usr/lib64/libjemalloc.so 程序前期的内存管理使用了这个库里的函数,而coredump的时候free()函数调用的却是libc.so库中的函数。free()在做对齐比较的时候,失败导致的
2.也就是说libjemalloc.so的优先没有一直生效,中途又被libc.so替换了回来。使用动态库调试工具,观看调试日志:程序在加载库libbz2.so的时候执行的这个替换。
3.执行替换的原因是dlopen库加载函数传入了flag RTLD_DEEPBIND,这个符号的作用是深度绑定,会使前期设置的LD_PRELOAD失效,继续使用libc.so
4.库加载传入RTLD_DEEPBIND的原因是系统设置了配置项:CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS
处理方案:在配置了CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS的系统中运行php不建议jemalloc.so库

xu_ping 任务状态待办的 修改为已完成 3年前
Emily_LiuLiu 任务状态已完成 修改为已验收 3年前

登录 后才可以发表评论

状态
负责人
项目
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
预计工期 (小时)
参与者(3)
5329419 openeuler ci bot 1632792936 王歌-wang--ge Emily_LiuLiu-emily_liuliu
1
https://gitee.com/src-openeuler/jemalloc.git
git@gitee.com:src-openeuler/jemalloc.git
src-openeuler
jemalloc
jemalloc

搜索帮助