如何找出发生SEGV内存错误的程序
问题18-Feb-2014 15:48:45] WARNING: child 11274 exited on signal 11 (SIGSEGV) after 0.089068 seconds from start
显然11274进程运行过程中遇到了段错误导致进程异常退出了。继续追查发现是php的hsf扩展在启动初始化的时候遇到内存问题导致段错误。
沧老师这个段错误进程你怎么定位到是hsf扩展的问题?
分析过程
发现段错误:
日志中的信息表明,进程号为11274的进程由于收到SIGSEGV信号而退出了。收到这个信号的时候,程序是可以生成core文件的。不过通过日志我们可以知道进程11274退出时没有生成core文件。因为在php-fpm的日志中,如果退出时生成了core文件,日志中会有“SIGSEGV - core dumped”字样。如:
WARNING: child 15845 exited on signal 11 (SIGSEGV - core dumped) after 1.051001 seconds from start
生成core文件:
为啥没生成core文件?是因为我们的系统做了限制。执行如下命令可以查看限制情况:
可以看出,系统对于core文件大小默认限制是0.也就是说不能生成core文件。可以通过以下命令设置大小。
$ulimit -c unlimited
通过命令,我们就把系统对于core文件的大小限制去除了。
设置完后,重启了php-fpm 进程。剩下的事情,就是坐等core文件生成了。
第二天,查看php-fpm日志,发现了如下记录:
WARNING: child 15845 exited on signal 11 (SIGSEGV - core dumped) after 1.051001 seconds from start
WARNING: child 17803 exited on signal 11 (SIGSEGV - core dumped) after 0.927973 seconds from start
WARNING: child 23491 exited on signal 11 (SIGSEGV - core dumped) after 0.798308 seconds from start
说明,core文件已经生成。
gdb分析core文件:
既然core文件生成了,现在该gdb上场了。通过如下命令查看程序退出时的栈信息。
$gdb -e /home/php/sbin/php-fpm -c core.15845
..............此处省略n多无关紧要的字
$info threads
3 process 158500x0000003cf92d3f9a in epoll_ctl () from /lib64/libc.so.6
2 process 158450x0000003cf92c4f65 in _xstat () from /lib64/libc.so.6
* 1 process 158510x00007fa94e230310 in ez_run (loop=0x2434c60, flags=0) at ez.c:2363
$thread 2
#00x0000003cf92c4f65 in _xstat () from /lib64/libc.so.6
$bt
#00x0000003cf92c4f65 in _xstat () from /lib64/libc.so.6
#10x00007fa94df8fd8b in hsf::hsf_mkdir (path=0x7fa930001628 "/home/logs/hsfcpp") at /usr/include/sys/stat.h:436
#20x00007fa94df8feae in hsf::hsf_mkdirp (pathname=) at utils/fileutils.cc:50
#30x00007fa94dfad7cc in hsf::hsf_stat_log_init (path=@0x7fa94e21f080, name=@0x7fffb607a620) at hsf/hsf_stat_file.cc:37
#40x00007fa94dfabb36 in hsf::hsf_stat_monitor::init (this=) at hsf/hsf_stat_monitor.cc:231
#50x00007fa94dfa899a in hsf_core_bootstrap () at hsf/hsf.cc:104
#60x00007fa94dfa8cea in hsf::hsf_core::init () at hsf/hsf.cc:129
#70x00007fa94e448b52 in zm_activate_hsf (type=, module_number=) at /home/lingzhan/hsf_php_0.9/php_hsf.cpp:188
#80x000000000061d94c in ?? ()
#90x000000000226ee20 in ?? ()
#10 0x0000000000624c35 in ?? ()
#11 0x00000000024bc840 in ?? ()
#12 0x00000000024bc840 in ?? ()
#13 0x00000000024bc840 in ?? ()
#14 0x0000000000000000 in ?? ()
再继续分析其他的两个core文件,发现也都有这个栈信息。基本可以肯定是hsf的问题了。
另外,在/var/log/message 中也发现了如下记录:
Mar 13 14:40:07 s006132.cm6 kernel: : php-fpm: segfault at 30 ip 00007fdc74df3310 sp 00000000435b8040 error 4 in libeasy.so.0
libeasy.so 正是hsf中调用的。进一步确认是执行hsf程序时出现问题的。 作为DZ插件网的技术支持,针对Discuz站点中因PHP扩展引发SEGV内存错误的定位问题,以下是完整的排查方案:
**一、核心日志分析与环境配置**
1. **日志特征识别**
- 当php-fpm日志出现"SIGSEGV"但未标注"core dumped"时,表明系统未开启core dump功能
- 需对比正常core生成日志格式:`SIGSEGV - core dumped`
2. **系统层配置检测**
# 检查当前core配置
ulimit -c# 应返回unlimited
sysctl kernel.core_pattern# 确认存储路径有效
# 临时配置方案(重启失效)
ulimit -c unlimited
sysctl -w kernel.core_uses_pid=1
sysctl -w kernel.core_pattern=/var/cores/core-%e-%p-%t
# 永久配置方案(CentOS)
echo "* soft core unlimited" >> /etc/security/limits.conf
echo "kernel.core_pattern=/var/cores/core-%e-%p-%t" >> /etc/sysctl.conf
sysctl -p
**二、精准问题复现与调试**
1. **进程隔离调试法**
# 单进程调试模式
php-fpm --nodaemonize --force-stderr 2>&1 | grep -C10 'SIGSEGV'
# GDB实时附加调试
gdb -p $(pgrep -o php-fpm) -ex "set pagination off" -ex "bt" -batch
2. **扩展逐项排除法**
; 通过php-fpm.conf动态禁用扩展
php_admin_flag = off
php_admin_flag[可疑扩展名] = off
**三、核心转储深度分析(以示例core.15845为例)**
1. **符号化堆栈解析**
gdb -q /path/to/php-fpm /var/cores/core.15845 -ex "thread apply all bt full" -ex "quit" > stack.txt
2. **关键帧定位技巧**
- 重点关注PHP扩展模块的初始化阶段(MINIT/MSHUTDOWN)
- 注意观察资源初始化操作(如日志目录创建、共享内存分配等)
3. **二进制关联分析**
# 使用ldd验证扩展依赖
ldd /path/to/hsf.so | grep 'not found'
# 检查符号表完整性
nm -D /path/to/hsf.so | grep 'T hsf_core_bootstrap'
**四、特定于HSF扩展的优化建议**
1. **目录权限深度检查**
// 在Discuz入口文件添加诊断代码
$logPath = '/home/logs/hsfcpp';
if (!is_writable(dirname($logPath))) {
file_put_contents('hsf_debug.log', date('')." 目录权限异常\n", FILE_APPEND);
}
2. **兼容性适配方案**
; 尝试调整PHP内存模型
php_admin_value = 64M
php_admin_value = 128M
**五、Discuz环境专项优化**
1. **组件依赖检测**
# 检查Discuz依赖库
ldd ./discuz/upload/install/index.php | grep 'hsf\|libeasy'
2. **安全模式验证**
// 临时启用安全模式测试
putenv('LD_PRELOAD=');
ini_set('disable_functions', 'exec,passthru,shell_exec,system');
对于需要进一步调试的站长,建议通过DZ插件网的开发者支持频道提交完整的:
1. `php -v` 版本信息
2. `php --ri hsf` 扩展详情
3. 完整的gdb堆栈跟踪文件
我们技术团队可为您提供定制化的二进制补丁服务。同时,DZ插件网的扩展兼容性检测工具(https://www.dz-x.net/compatibility)可快速验证扩展与Discuz版本的适配情况。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页:
[1]