core文件写入失败的主因是权限与配置问题:需确保core_pattern为绝对路径、父目录已存在且权限为1777;systemd服务须单独设置limitcore=infinity;管道模式需systemd-coredump服务运行;setuid程序需启用suid_dumpable=2。

core 文件写不到你指定的目录?不是路径写错了,而是内核根本没权限往那里写,或者压根没创建父目录。
确认 core_pattern 是绝对路径且父目录已存在
内核只负责把数据写进路径,不负责创建目录树。哪怕 /var/crash 少一级子目录,core 也会静默失败。
- 先手动创建完整路径:
sudo mkdir -p /var/crash - 必须设为 sticky + world-writable:
sudo chmod 1777 /var/crash(少一个7或不是1777都会拒绝写入) -
core_pattern中不能含 shell 变量:~/crash、$HOME/crash、../core全部无效 - 临时设置示例:
echo '/var/crash/core.%e.%p.%t' | sudo tee /proc/sys/kernel/core_pattern
systemd 服务必须单独配 LimitCORE=infinity
你在终端里跑 ulimit -c unlimited 没用——systemd 启动的服务完全不继承这个设置。哪怕 /proc/sys/kernel/core_pattern 和全局 ulimit 都对了,服务崩溃照样没 core。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 编辑对应 unit 文件,例如
/etc/systemd/system/myapp.service - 在
[Service]段下加一行:LimitCORE=infinity(注意:不能写unlimited) - 重载并重启:
sudo systemctl daemon-reload && sudo systemctl restart myapp - 验证是否生效:
systemctl show myapp | grep LimitCORE,输出应为LimitCORE=18446744073709551615
core_pattern 以 | 开头时,得确保接收端服务在运行
很多现代发行版(如 Ubuntu 22.04+、Fedora 36+)默认把 core_pattern 设成 |/usr/lib/systemd/systemd-coredump %P %u %g %s %t %e %p,走用户态处理。这时候生成失败,问题不在内核,而在管道另一端。
- 检查服务状态:
systemctl status systemd-coredump - 若未激活,启用它:
sudo systemctl enable --now systemd-coredump - 配置文件在
/etc/systemd/coredump.conf,可调Storage=external或MaxUse=等 - 如果只是想快速验证内核直写能力,可临时切回文件模式:
echo '/tmp/core.%e.%p.%t' | sudo tee /proc/sys/kernel/core_pattern
最容易被忽略的是:setuid 程序(比如 sudo、passwd)默认禁止生成 core,即使其他所有配置都对,也得额外执行 echo 2 | sudo tee /proc/sys/kernel/suid_dumpable。这个值不持久,需写入 /etc/sysctl.conf 并 sysctl -p 才能长期生效。










