拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

麒麟桌面系统程序崩溃数据:从定位到清理的完整指南

麒麟桌面系统程序崩溃数据:从定位到清理的完整指南 1. 麒麟桌面系统“程序崩溃数据”到底是怎么回事我最早开始折腾银河麒麟桌面系统是因为单位一批老电脑统一配发了麒麟V10桌面版。用了一段时间后隔三差五收到同事反馈“某某软件又崩了”“刚才窗口一闪就没了”“弹了个程序崩溃的提示然后啥也干不了”。当时第一反应是系统稳定性问题但排查一圈下来发现崩溃本身并不可怕真正麻烦的是崩溃时产生的那些数据没处理好——系统不断尝试写崩溃报告、磁盘被占满、报错弹窗反复出现甚至某些情况下崩溃数据写入异常导致后续软件启动直接失败。这里要先把概念说清楚。麒麟桌面系统银河麒麟V10、麒麟桌面版本质上是基于Linux内核的操作系统内核在遇到进程异常退出时会尝试保留现场信息这套机制在Linux世界里叫“core dump”翻译成大白话就是“程序崩溃时把内存里的关键内容转储到磁盘上”。而麒麟系统在桌面层面还有一层崩溃报告机制会把崩溃信息整理成可读的报告比如“程序xxx因段错误退出”“内存访问越界”之类。很多人在网上搜“麒麟系统程序崩溃数据”其实是在两种截然不同的场景下搜的场景一程序崩了想找到崩溃原因需要开启或调取崩溃数据开发调试、运维排障。场景二系统频繁提示程序崩溃、弹窗、卡死崩溃数据积累太多拖慢系统想清理掉这些数据日常使用维护。这两类需求的处理方式完全不同混为一谈就容易越搞越乱。我接下来会把这两条线都拆开讲从崩溃数据的生成机制、存储位置、配置方法到实际分析技巧和清理维护一条条过一遍。2. 崩溃数据存在哪麒麟桌面的三个存放点想处理崩溃数据第一件事是知道它落在哪。在麒麟桌面系统上崩溃数据其实有三大类存放位置很多人只盯着其中一个看漏了另外两个。2.1 用户态崩溃报告目录麒麟桌面系统自带图形化的崩溃报告机制进程崩溃后桌面上会弹提示同时报告文件会写到用户目录下。具体路径是~/.local/share/kylin/crash-report/ ~/.cache/kylin/crash-report/不同版本路径略有差异但绝大多数情况下在~/.local/share/下能找到。这里的文件包含崩溃程序的名称、崩溃信号比如SIGSEGV段错误、SIGABRT中断、崩溃时的一些堆栈摘要。如果你只是想知道“哪个程序崩了”“大概是什么类型的崩溃”看这里的文本报告就够了。2.2 系统级core dump文件这是崩溃数据里内容最完整、体积也最大的一类。内核在进程异常退出时根据/proc/sys/kernel/core_pattern中配置的路径把内存镜像写进文件。麒麟V10桌面版安装完之后默认配置比较特殊。有的版本默认是空的不生成core文件有的版本配置了core_%e_%p这种格式写进当前目录还有的版本用systemd的coredump机制统一管理。先别急着猜直接执行cat /proc/sys/kernel/core_pattern我看到过麒麟V10机器上输出/var/lib/systemd/coredump/core.%e.%p.%h.%t这样的结果这说明用的是systemd-coredump统一收集。如果输出是core或者core_%e_%p说明会生成裸的core文件在程序的工作目录下。2.3 apport风格的崩溃报告部分麒麟版本有部分麒麟桌面版本把Ubuntu的apport机制移植过来了崩溃报告会写到/var/crash/里面是一堆.crash文件。这些文件本质上是一坨压缩打包的数据可以用命令解包提取崩溃信息。老读者应该发现了麒麟不同版本、不同批次的桌面系统崩溃数据存放逻辑并不完全统一。所以排查的第一步永远是确认当前系统用的是哪一套机制而不是拿网上随便一篇教程硬套。3. 开启崩溃数据采集从源头拿到可用信息搞清楚存在哪之后第二个关键问题是崩溃数据可能压根没生成。我见过太多人对着一个空空如也的目录发愁程序明明崩了但系统什么数据都没留下来。这通常是因为core dump机制被关闭或者被限制得太死。3.1 检查并开启core dump先看内核的core_pattern同时检查相关限制cat /proc/sys/kernel/core_pattern ulimit -c如果执行ulimit -c显示0表示当前shell进程不会生成core文件。想临时开启ulimit -c unlimited但这样只对当前shell有效想全局生效需要改配置文件。麒麟桌面系统比较常见的做法是改/etc/security/limits.confecho * soft core unlimited /etc/security/limits.conf echo * hard core unlimited /etc/security/limits.conf改完之后重启或重新登录再执行ulimit -c确认已经是unlimited。如果你还想让core文件统一落在一个目录里方便找可以直接修改core_pattern。比如我想让它全部写到/data/coredumpecho /data/coredump/core.%e.%p.%t /proc/sys/kernel/core_pattern注意core_pattern最多支持128字节存储位置必须提前创建目录并确保有写权限。不过这个设置重启系统就没了持久化需要写到/etc/sysctl.conf或/etc/sysctl.d/下的配置文件里echo kernel.core_pattern/data/coredump/core.%e.%p.%t /etc/sysctl.d/99-coredump.conf sysctl -p /etc/sysctl.d/99-coredump.conf3.2 systemd-coredump模式下的处理如果你的麒麟V10用的是systemd的coredump机制也就是core_pattern指向/var/lib/systemd/coredump/那管理起来更简单。查看历史崩溃记录用coredumpctl list查看某条记录的详细信息coredumpctl info PID比如程序名叫myapp你想看它最近一次崩溃的堆栈coredumpctl info myapp这条命令能直接给出崩溃时的信号、进程ID、触发的可执行文件路径以及最重要的——有没有从core文件里提取出堆栈信息。如果信息不够详细可以用gdb加载core文件手动分析这个后面单独讲。3.3 桌面崩溃报告服务的启停麒麟桌面系统有一个后台服务专门收集桌面程序的崩溃信息名字通常叫kylin-crash-daemon或者类似的名字不同版本有差异和镜像批次有关。查看运行状态systemctl status kylin-crash-*如果服务在跑崩溃报告弹窗会自动出现同时数据会写进~/.local/share/kylin/crash-report/。如果不想要这些弹窗又不影响系统运行可以把它停掉systemctl stop kylin-crash-daemon.service systemctl disable kylin-crash-daemon.service但有一点要注意排查崩溃问题的时候别关。哪怕弹窗烦人有这个服务至少能保证崩溃报告被记录后面分析问题全靠它。4. 实战用崩溃数据定位程序崩溃原因数据有了接下来是重头戏——怎么用这些数据找出程序为什么崩。这part对开发人员和运维来说价值最大日常用户也可以理解为“知其所以然”的过程。4.1 从崩溃报告文本里提取有效线索打开~/.local/share/kylin/crash-report/下的报告文件正常会看到类似这样的内容程序: myapp 版本: 2.4.1 信号: SIGSEGV (段错误) 时间: 2025-01-15 14:32:08 详细信息: 在函数 ProcessData() 中发生了无效的内存访问这类文本报告里最有用的是三个信息信号类型、崩溃程序名、详细描述。看到SIGSEGV基本就是指针越界或者访问了已释放内存SIGABRT通常是程序自己检测到异常主动中断SIGILL是执行了非法指令可能和CPU指令集不匹配有关。4.2 gdb手动分析core文件文本报告能告诉你“怎么死的”但不一定能告诉你“死在哪一行”。要精确定位就得用gdb加载core文件。先从systemd-coredump里导出core文件coredumpctl dump myapp -o /tmp/myapp.core如果core文件是裸文件在某个目录下直接跳到下一步。用gdb加载可执行程序和core文件gdb /usr/bin/myapp /tmp/myapp.core进入gdb后直接执行bt命令查看崩溃时的调用栈(gdb) bt #0 0x00007f8d2c1a3d40 in __memcpy_avx_unaligned () from /lib64/libc.so.6 #1 0x000055b7a9e24a15 in ProcessData() () #2 0x000055b7a9e24b28 in main ()看到这种堆栈再配合frame 1切换栈帧、然后list查看对应源代码位置崩溃点就清楚了。这里有个实操小技巧在编译时加-g -O0选项调试信息保留得越多看到的内容越精确。如果你在麒麟上调试自己写的程序编译时一定带上-g。4.3 没有core文件时的替代手段有时候崩溃发生得太彻底core文件都没来得及写。这时候可以试试看系统的日志journalctl -xe --since 今天或者看内核日志里有没有关于OOM内存不足的痕迹dmesg | grep -i -E killed process|out of memory如果程序是被系统OOM杀掉的内核日志里会明确记录“Killed process 1234 (myapp) total-vm:...的的确确是内存消耗过大导致。这种情况和程序“崩溃”有本质区别别混为一谈。被OOM杀掉时不会有西格玛信号报告反而日志里全是内存统计处理思路也应该走“优化内存占用、排查内存泄漏”这条路而不是调试非法内存访问。5. 清理崩溃数据麒麟系统越用越慢的隐形元凶这次的搜索热词里反复出现“软件商店一片空白”“系统卡顿”“字体异常”这类关键词我实际处理过不少麒麟V10的“故障”之后可以负责任地告诉你其中相当一部分病根在崩溃数据的长期堆积上。为什么这么说原因也很直白崩溃报告、core文件里存着完整的内存镜像体积巨大。一个程序的core文件动辄几百MB甚至上GB反复崩溃几次磁盘空间就吃紧了。麒麟系统安装时默认分区往往不大根目录被塞满是日常操作。崩溃报告服务本身有内存占用。服务挂在后台不断检查崩溃事件、写报告重启了又重启系统交互卡顿感就会变明显。某些应用崩溃后会留下损坏的缓存和临时配置。下次启动时程序读取到异常数据又崩溃形成“崩溃–写坏数据–再崩溃”的恶性循环。像V10软件商店打开空白、某些程序启动即闪退很多时候就是这么来的。5.1 手动清理崩溃数据清理思路分两层先清大文件再清报告文件。先看磁盘占用大头du -sh /var/lib/systemd/coredump/ 2/dev/null du -sh /var/crash/ 2/dev/null du -sh ~/.local/share/kylin/crash-report/ 2/dev/null du -sh ~/.cache/kylin/crash-report/ 2/dev/null哪个目录大就先清哪个。直接删除历史core文件rm -f /var/lib/systemd/coredump/* rm -f /var/crash/* rm -rf ~/.local/share/kylin/crash-report/* rm -rf ~/.cache/kylin/crash-report/*执行完再执行一次df -h确认根目录释放了多少。如果清理后空间立刻恢复了一大截那恭喜说明病根找到了。5.2 限制崩溃数据体积不让问题复发只清一次不解决问题要限制系统在崩溃时产生的数据量。限制core文件大小在/etc/security/limits.conf中加入* soft core 1048576这样单次崩溃记录上限为1GB单位是KB算的话是1024*1024超过这个大小的数据就丢弃了。配置systemd-coredump的保留策略修改/etc/systemd/coredump.conf[Coredump] Storageexternal Compressyes ProcessSizeMax2G ExternalSizeMax2G MaxUse4G KeepFree2GMaxUse4G表示coredump机制累计最多占用4GB空间KeepFree2G表示系统的可用空间不足2GB时就停止写新core文件避免盘满。关闭桌面崩溃报告弹窗配置后重启服务systemctl restart systemd-coredump.socket如果实在觉得崩溃报告弹窗烦可以把桌面崩溃服务停掉。但注意这在排障期间不推荐确定问题彻底解决后再停不迟。5.3 针对具体应用彻底清理有些用户发现某个程序反复崩溃清理崩溃数据后下次启动还是崩。这时候要查程序自身的缓存目录通常~/.config/程序名/或~/.cache/程序名/下有损坏的配置文件。保守做法是先把目录重命名备份而不是直接删mv ~/.config/myapp ~/.config/myapp.bak再启动程序如果正常了说明就是旧的损坏配置导致的问题。确认后可以把备份删掉或者从备份里找回需要的东西。6. 一些补充技巧和踩过的坑6.1 麒麟V10软件商店空白的处理经验热词里“麒麟v10软件商店一片空白”出现频率高结合崩溃数据的机制我多说一句。这类问题排查顺序应该是先清理崩溃数据仓库和缓存。查看商店相关服务状态。检查系统磁盘剩余空间是否充足。最后才是重装商店软件包。我实际遇到过一个案例软件商店反复崩溃界面一直空白。清理了/var/lib/systemd/coredump/里的几百MB内容后系统空间恢复到了安全线以上商店竟然自己恢复正常了——不是商店程序的bug纯粹是磁盘满了导致它写的临时文件失败进而前端界面渲染不出来。这个案例很典型值得分享先看磁盘余量再怀疑软件本身。6.2 崩溃数据的合理利用修复系统问题的线索清理崩溃数据不等于“看见崩溃就当垃圾直接扔”。有些基础系统服务频繁崩溃可能是内核模块、显卡驱动、特定硬件兼容性的问题。这类信息对判断“该不该更新驱动”“是不是某批机型有通病”很有参考价值。我在维护麒麟系统时会定期执行coredumpctl list --since 1 week ago每周花一分钟扫一眼看这周有没有哪个系统组件频繁崩溃。如果有先尝试更新对应组件而不是直接压制崩溃报告。有些崩溃信号比如SIGSEGV发生在libGL、libmali这类图形库时十有八九是显卡驱动不匹配升级驱动或者调整内核参数往往能解决。6.3 别忽略“程序崩溃数据”的隐私风险这点容易被忽略。core dump文件里面是进程退出时的完整内存镜像意味着里面可能包含用户在程序里输入的内容、访问过的数据、内存中的密钥或临时票据等内容。如果你是在多用户或公共服务区维护麒麟终端处理崩溃数据时要谨慎不要随意把core文件拷贝给别人看先把堆栈提取出来再分发。清理时建议用安全删除方式特别是shred -u 文件名而不是普通rm。含有敏感信息的core文件可以直接用coredumpctl删除单条记录coredumpctl remove PID这些细节文档里很少写但真实场景下发生过把用户的崩溃日志发给第三方分析、结果导致信息泄露的事件。考虑到麒麟系统在政企和办公场景里的使用环境这一点值得反复强调。6.4 常见问题速查表现象可能原因排查/处理动作崩溃后没有生成任何数据ulimit -c为0core_pattern为空或非法检查limits.conf、sysctl配置重新开启磁盘空间莫名变小core文件、崩溃报告堆积du -sh找大目录删除过期数据软件商店打开空白系统剩余空间不足、缓存损坏清理崩溃数据、检查空间、重装商店包程序闪退且无崩溃弹窗被OOM杀掉dmesg查内存日志换用更小内存的程序崩溃报告弹窗频繁崩溃服务在收集数据排查具体崩溃原因修复程序最后再停服务gdb加载core报错core文件与可执行文件版本不匹配确保使用同一版本的程序加载core文件7. 最后再聊几句麒麟桌面系统的“程序崩溃数据”这件事说到底就两层一是作为排查问题的线索二是作为消耗资源的垃圾。该开启的时候要开启该清理的时候要果断清理关键是搞清楚当前系统的崩溃数据机制是哪一种别拿别的发行版的经验直接生搬硬套。我也踩过几次坑最深刻的体会是在麒麟这类国产系统上维护最重要的不是指令背得多熟而是养成“先查机制、再动手”的习惯。你面前这台机器是哪个版本、哪套收集逻辑、哪个服务在管决定了你后续所有操作的正确性。根据我个人经验给刚上手麒麟桌面系统维护的同学一个衷心建议拿到系统后先跑一遍cat /proc/sys/kernel/core_pattern、systemctl status kylin-crash-*把崩溃数据处理的后台机制记录下来别等到程序崩了、电脑卡了再临时抱佛脚。把这套基础工作做在平时后面出什么问题都能从容应对。
返回列表