【环境信息】
系统: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日志
Hi emily_liuliu, welcome to the openEuler Community.
I'm the Bot here serving you. You can find the instructions on how to interact with me at Here.
If you have any questions, please contact the SIG: Runtime, and any of the maintainers: @zhenyu , @small_leek , @Charlie_Li
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
问题情况说明:
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库
登录 后才可以发表评论