怎么用脚本获取系统崩溃转储

wen 实用脚本 1

本文目录导读:

怎么用脚本获取系统崩溃转储

  1. Windows 系统
  2. Linux 系统
  3. macOS 系统
  4. 通用脚本 - 跨平台检查
  5. 注意事项

获取系统崩溃转储(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()

注意事项

  1. 权限要求:大多数操作需要管理员/root权限
  2. 磁盘空间:完全内存转储可能占用数与RAM相同大小的空间
  3. 性能影响:设置崩溃转储可能会影响系统性能
  4. 隐私安全:崩溃转储可能包含敏感数据
  5. Windows:需要开启"自动重新启动"和"将事件写入系统日志"

建议先以非管理员身份运行查看脚本,确认系统状态后再进行配置更改。

抱歉,评论功能暂时关闭!