我有一个崩溃的应用程序,它崩溃并输出:Aborted (core dumped)
。
现在,当我查看包含二进制文件的目录时,没有崩溃转储。
- 没有
core
目录。 - 文件系统上有可用空间
- 用户可以在目录中创建文件。
ulimit -a
印刷
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 31845
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65536
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 31845
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
cat /proc/sys/kernel/core_pattern
印刷
core
cat /proc/sys/fs/suid_dumpable
印刷
2
还有什么我可以检查的吗?我没主意了。
我正在 Ubuntu 15.04 上运行。
答案1
某些操作系统允许配置系统范围的目录来放置核心文件
该程序可能已更改其工作目录。 core文件位于转储core的程序的工作目录中
如果发出 ulimit -c 0,则 shell 消息不应打印“core dumped”,除非操作系统有错误
答案2
要在 Linux 上生成核心转储,我们可以在运行可执行文件的初始化脚本中添加以下参数。因此,每当我们初始化软件或运行应用程序并导出环境变量时,我们都可以将以下行复制到脚本中,并转储核心,以防万一我们看到任何崩溃。
要设置核心转储的位置,您可以使用 proc 文件系统设置核心文件路径。
例如,如果您希望在/tmp/crash/corefiles
.这将确保您的核心文件生成路径对于使用脚本运行的进程保持完整。
mkdir -p /tmp/crash/corefiles
chmod 775 /tmp/crash/corefiles
echo "/tmp/crash/corefiles/%e.%s.core" > /proc/sys/kernel/core_pattern
其中变量是:
%e是文件名
%G是进程运行时的 gid
%p是进程的pid
%s是导致转储的信号
%t是转储发生的时间
%u是进程运行时的 uid
另外,您必须设置核心文件大小,以下命令将核心文件大小设置为无限
ulimit -c unlimited
现在要检查进程中每个线程设置的核心文件大小,我们可以使用
cat /proc/<PID>/limits
上述命令的输出:
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size unlimited unlimited bytes
Max open files 10000 10000 files
Max address space unlimited unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 31868 31868 processes
Max locked memory 65536 65536 bytes
Max file locks unlimited unlimited locks
Max pending signals 31868 31868 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
从上面的输出中我们可以看到最大核心文件大小设置为无限制。
对于您的情况,您可以按照以下步骤操作。
- 创建一个初始化脚本,其中包含所有环境导出以及上述核心文件生成相关的更改。
- 从初始化脚本触发您的应用程序。
- 当发生崩溃时,您应该能够根据您设置的核心文件位置看到核心文件。
- 您可以使用以下命令验证 core_pattern:
cat /proc/sys/kernel/core_pattern
并查看您的位置设置是否正确。