如果我从 shell 运行一个程序,它会出现段错误:
$ buggy_program
Segmentation fault
Run Code Online (Sandbox Code Playgroud)
然而,它会告诉我,有没有办法让程序打印回溯,也许是通过运行这样的东西:
$ print_backtrace_if_segfault buggy_program
Segfault in main.c:35
(rest of the backtrace)
Run Code Online (Sandbox Code Playgroud)
我也不想将 strace 或 ltrace 用于此类信息,因为它们会以任何一种方式打印...
我有一台 128 GB Ram 的机器,它使用 Apache2 作为 Web 服务器(在这台机器上没有数据库服务器,数据库机器是一台 64 GB Ram 机器,可以处理 2000 个最大连接)。我使用监控工具看到目前大约有 44 个忙碌的工作人员和 12 个空闲的工作人员,我的 prefork 模块的最佳理论值是多少?
我有时会在高负载时间加载网站时出现空白页面,并在我的 apache 错误日志中出现此错误:
【注意】child pid 13595 exit signal Segmentation fault (11)
如何解决这个问题呢?
我的 Apache2 Prefork 模块配置:
StartServers 3
MinSpareServers 3
MaxSpareServers 5
ServerLimit 3200
MaxClients 3100
MaxRequestsPerChild 0
Run Code Online (Sandbox Code Playgroud)
在 www 机器上免费 -h:
总计:128 G 空闲空间:97GB(运行 apache2)共享 0b 缓冲区 1.9G 缓存 23G
Apache2 和其他程序使用的 Ram:
Private + Shared = RAM used Program
96.0 KiB + 61.0 KiB = 157.0 …
Run Code Online (Sandbox Code Playgroud) hosting mpm-prefork shared-hosting segmentation-fault apache-2.2
每次logrotate
运行 Apache/2.4.7 (Ubuntu) 都会遇到段错误并且不会重新启动:
[Wed Sep 10 06:35:54.266018 2014] [mpm_event:notice] [pid 20599:tid 140630283466624] AH00493: SIGUSR1 received. Doing graceful restart
[Wed Sep 10 06:35:54.885118 2014] [core:notice] [pid 20599] AH00060: seg fault or similar nasty error detected in the parent process
Run Code Online (Sandbox Code Playgroud)
我的 apache logrotate 脚本如下所示:
/var/log/apache2/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
postrotate
/usr/sbin/apachectl graceful
endscript
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi; \
endscript
}
/srv/apache/log/*.log { …
Run Code Online (Sandbox Code Playgroud) 我已经按照网上很多地方的说明,在 apache 产生段错误时如何从 apache 获取核心转储,但它仍然拒绝生成转储。
我有:
CoreDumpDirectory
指令添加到httpd.conf
文件中并将其设置为/tmp
ulimit -c unlimited
echo '/tmp/core-%e.%p' > /proc/sys/kernel/core_pattern
echo 0 > /proc/sys/kernel/core_uses_pid
Httpd 已重新启动,但仍未创建转储。
我正在运行 CentOS 5.8 x64httpd-2.2.3-65.el5.centos.3
和php-5.3.20-13.el5.art
任何帮助将非常感激!
我的服务器在不同的工具中将频繁的分段错误记录到 /var/log/kern.log。到目前为止,我已经在 Perl、PHP 和 rsync 中看到过它们。所有安装的软件都是最新的 Debian 软件包。这是日志文件的摘录:
Mar 2 01:07:54 gaz kernel: [ 5316.246303] imapsync[4533]: segfault at 8b ip 00007fb448c98fe6 sp 00007ffff571dd68 error 4 in libperl.so.5.10.1[7fb448bd7000+164000]
Mar 2 01:17:42 gaz kernel: [ 5904.354307] php5-cgi[4441]: segfault at 2bb3dc8 ip 0000000002bb3dc8 sp 00007fffbeeaae48 error 15
Mar 2 02:54:05 gaz kernel: [11687.922316] php5-cgi[4495]: segfault at 2d7acf9 ip 0000000002d7acf9 sp 00007fff60c6eb18 error 15
Mar 2 10:50:08 gaz kernel: [40250.390322] BUG: unable to handle kernel paging request at 00000000024b03f0
Mar 2 10:50:08 gaz kernel: …
Run Code Online (Sandbox Code Playgroud) 我正在使用 Red Hat Enterprise Linux Server 版本 5。在这种情况下,每当用户进程由于段错误而崩溃时,它就不会登录到 /var/log/messages 中。甚至 dmesg 也没有显示任何与此相关的消息。
在另一个发行版(Cent OS 5)中,每当我的用户进程 crashed.dmesg 也显示段错误时,我在 /var/log/messages 中看到了段错误消息。
是否有任何要启用的设置,以便将段错误记录到 /var/log/messages.log 中。
我交叉检查了两个系统的 /etc/syslog.conf。两者都是相同的,甚至是 /etc/sysconfig/syslog 文件。
现在我检查内核源代码,arch/x86/mm/fault.c,发现只有在2.6.23及之后才能将segfault的错误信息打印到/var/log/messages。由于 RHEL5.4 使用 2.6.18 内核,因此无法将信息记录到系统日志中。
我用作$HOME/.local
前缀来安装一些没有root访问权限的应用程序。里面有一个目录$HOME/.local
我不能执行ls
命令:
[tuananh@server lib]$ ls
Segmentation fault
[tuananh@server lib]$ cd ..
[tuananh@server .local]$ ls lib
audit libform.a
libncurses.a libopenblas.so.0
...
[tuananh@server .local]$
Run Code Online (Sandbox Code Playgroud)
这可能是什么原因?uname -a
对于我的服务器:
Linux server 2.6.32-358.2.1.el6.x86_64 #1 SMP Tue Mar 12 14:18:09 CDT 2013 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
编辑: 的输出LD_TRACE_LOADED_OBJECTS=1 ls
。我发现了一些从这个目录加载的库。那么现在我应该怎么做才能找到导致问题的那个?
linux-vdso.so.1 => (0x00007fff831b8000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003d94800000)
librt.so.1 (0x00007fdcde5a3000)
libcap.so.2 => /lib64/libcap.so.2 (0x0000003d95c00000)
libacl.so.1 => /lib64/libacl.so.1 (0x0000003d97c00000)
libc.so.6 (0x00007fdcde1f5000)
libdl.so.2 (0x00007fdcddff1000)
/lib64/ld-linux-x86-64.so.2 (0x0000003d92c00000)
libpthread.so.0 (0x00007fdcdddd3000)
libattr.so.1 => /lib64/libattr.so.1 …
Run Code Online (Sandbox Code Playgroud) 每小时左右一个 Apache 子进程段。我们的网络服务器上的故障。我们正在运行带有 Apache prefork MPM 的非线程 PHP 5.2.17 Apache 模块。我已经使用一些核心转储、gdb 和来自 php 的 github repo 的这个 .gdbinit 文件运行了 httpd,在 gdb 中为每个文件输入以下命令:
dump_bt executor_globals.current_execute_data
Run Code Online (Sandbox Code Playgroud)
由于没有 gdb 或 php 解释器的内部工作经验,我无法从结果中做出任何事情。
core.22762
[0x53896ef0] () :-2118682552
[0x538977a0] () /Statement/Interface.php:113
[0x538978a0] /Zend/Db/Statement/Interface.php()
core.22791
[0x538977a0] () @:0
[0x538978a0] ()
core.5568
[0x53896ef0] () :2061035360
[0x538977a0] () :1767992432
[0x538978a0] ()
core.30384
[0x538977a0] () :0
[0x538978a0] ()
core.3091
[0x53896ef0] mysql_query():992424253
[0x538977a0] () ~:17
[0x538978a0] ()
Run Code Online (Sandbox Code Playgroud)
(core.3091 之后也显示了这一点Program terminated with signal 11, Segmentation fault. …
当我安装 joomla 时,我看不到index.php
并且我在我的/var/log/apache2/error.log
[notice] child pid 3211 exit signal Segmentation fault (11)
Run Code Online (Sandbox Code Playgroud)
为了激活核心转储,我按照此链接中的说明进行操作
CoreDumpDirectory /tmp/apache2-gdb-dump # added this to /etc/apache2/apache2.conf
mkdir -p /tmp/apache2-gdb-dump
chown www-data: /tmp/apache2-gdb-dump
chmod 0777 /tmp/apache2-gdb-dump
/etc/init.d/httpd restart
Run Code Online (Sandbox Code Playgroud)
但我什么也没看到 coredumpdirectory
ls /tmp/apache2-gdb-dump
Run Code Online (Sandbox Code Playgroud)
我可以看到localhost/administrator
joomla 但看不到localhost/index.php
。
linux ×4
apache-2.2 ×3
apache-2.4 ×1
diagnostic ×1
dump ×1
gdb ×1
hardware ×1
hosting ×1
httpd ×1
joomla ×1
logrotate ×1
ls ×1
mpm-prefork ×1
php ×1
redhat ×1