本文目录导读:

获取系统崩溃转储(Crash Dump)通常需要管理员权限,并且可以通过多种脚本方式实现,根据你的操作系统环境,以下是几种常见的方法:
Windows 系统
PowerShell 脚本(推荐)
# 需要管理员权限运行 # 设置崩溃转储类型(0=无, 1=完全, 2=核心, 3=小内存) $dumpType = 1 # 完全内存转储 $dumpPath = "%SystemRoot%\MEMORY.DMP" # 修改注册表设置 Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\CrashControl" -Name "CrashDumpEnabled" -Value $dumpType Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\CrashControl" -Name "DumpFile" -Value $dumpPath # 获取当前设置 Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\CrashControl" | Select-Object CrashDumpEnabled, DumpFile, MinidumpDir # 手动触发蓝屏(仅用于测试,会重启) # shutdown /r /t 0 /f
批处理脚本
@echo off :: 需要管理员权限 :: 查看当前崩溃转储设置 reg query "HKLM\SYSTEM\CurrentControlSet\Control\CrashControl" /v CrashDumpEnabled reg query "HKLM\SYSTEM\CurrentControlSet\Control\CrashControl" /v DumpFile :: 设置完全内存转储 reg add "HKLM\SYSTEM\CurrentControlSet\Control\CrashControl" /v CrashDumpEnabled /t REG_DWORD /d 1 /f reg add "HKLM\SYSTEM\CurrentControlSet\Control\CrashControl" /v DumpFile /t REG_EXPAND_SZ /d "%SystemRoot%\MEMORY.DMP" /f echo 崩溃转储设置已更新
使用 WMIC 查看崩溃记录
# 查看系统崩溃日志
Get-WinEvent -LogName System -MaxEvents 10 | Where-Object {$_.LevelDisplayName -eq "Error" -and $_.ProviderName -eq "BugCheck"}
# 检查是否有 MEMORY.DMP 文件
Test-Path "$env:SystemRoot\MEMORY.DMP"
Get-ChildItem "$env:SystemRoot\Minidump\*.dmp" -ErrorAction SilentlyContinue
Linux 系统
Bash 脚本 - 检查 kdump 设置
#!/bin/bash
# 检查 kdump 是否安装
if which kdumpctl > /dev/null 2>&1; then
echo "kdump 已安装"
kdumpctl status
else
echo "kdump 未安装,尝试安装..."
# sudo apt install kdump-tools # Debian/Ubuntu
# sudo yum install kexec-tools # RHEL/CentOS
fi
# 查看崩溃转储配置
cat /etc/kdump.conf
# 查看已有转储文件
ls -lh /var/crash/ 2>/dev/null || echo "未找到转储文件"
Python 脚本 - 解析 core dump
#!/usr/bin/env python3
import os
import subprocess
def check_core_dumps():
"""检查系统 core dump 文件"""
core_pattern = "/proc/sys/kernel/core_pattern"
# 读取 core dump 模式
with open(core_pattern, 'r') as f:
pattern = f.read().strip()
print(f"Core dump 模式: {pattern}")
# 检查常见的 core dump 位置
dump_locations = [
"/var/crash/",
"/var/lib/systemd/coredump/",
"/core",
os.path.expanduser("~/core")
]
for loc in dump_locations:
if os.path.exists(loc):
files = os.listdir(loc)
if files:
print(f"在 {loc} 找到转储文件:")
for f in files[:5]: # 只显示前5个
print(f" - {f}")
# 使用 coredumpctl 查看 systemd-coredump 信息
try:
result = subprocess.run(
["coredumpctl", "list", "--no-legend"],
capture_output=True, text=True, timeout=5
)
if result.stdout:
print("\nSystemd coredump 记录:")
print(result.stdout[:500])
except FileNotFoundError:
print("\ncoredumpctl 未安装")
if __name__ == "__main__":
check_core_dumps()
macOS 系统
Bash 脚本
#!/bin/bash # 查看崩溃报告位置 echo "=== 系统崩溃报告 ===" ls -lh ~/Library/Logs/DiagnosticReports/ 2>/dev/null # 使用 sysdiagnose 收集诊断信息(需要管理员权限) # sudo sysdiagnose -f /tmp/crash_dump -b # 查看核心转储设置 echo "Core dump 设置:" sysctl kern.coredump sysctl kern.corefile # 检查 panic 日志 echo "Panic 日志:" ls -lh /Library/Logs/DiagnosticReports/Kernel*.panic 2>/dev/null
通用脚本 - 跨平台检查
#!/usr/bin/env python3
"""跨平台系统崩溃转储检查脚本"""
import platform
import os
import subprocess
import sys
def check_dumps():
system = platform.system().lower()
if system == 'windows':
print("Windows 崩溃转储:")
dump_path = os.environ.get('SystemRoot', 'C:\\Windows') + '\\MEMORY.DMP'
minidump_path = os.environ.get('SystemRoot', 'C:\\Windows') + '\\Minidump'
if os.path.exists(dump_path):
size = os.path.getsize(dump_path)
print(f" MEMORY.DMP: {dump_path} ({size / 1024**3:.2f} GB)")
else:
print(" 未找到完全内存转储")
if os.path.exists(minidump_path):
files = [f for f in os.listdir(minidump_path) if f.endswith('.dmp')]
print(f" 小内存转储文件: {len(files)} 个")
elif system == 'linux':
print("Linux 崩溃转储:")
try:
result = subprocess.run(
["ls", "-lh", "/var/crash/"],
capture_output=True, text=True
)
print(result.stdout or " 无转储文件")
except:
print(" 无法访问 /var/crash/")
elif system == 'darwin':
print("macOS 崩溃转储:")
report_path = os.path.expanduser("~/Library/Logs/DiagnosticReports/")
if os.path.exists(report_path):
files = os.listdir(report_path)
print(f" 诊断报告: {len(files)} 个文件")
else:
print(f"不支持的系统: {system}")
if __name__ == "__main__":
if os.name == 'nt' and not sys.platform.startswith('win'):
print("请以管理员身份运行此脚本")
check_dumps()
注意事项
- 权限要求:大多数操作需要管理员/root权限
- 磁盘空间:完全内存转储可能占用数与RAM相同大小的空间
- 性能影响:设置崩溃转储可能会影响系统性能
- 隐私安全:崩溃转储可能包含敏感数据
- Windows:需要开启"自动重新启动"和"将事件写入系统日志"
建议先以非管理员身份运行查看脚本,确认系统状态后再进行配置更改。