C#中的Dump:解锁程序调试新姿势

一、Dump 初印象

在 C# 的编程世界里,Dump 就像是一个神奇的 “透视镜”,它生成的 dump 文件是程序运行状态的快照,这个快照可不是普通的照片,它把程序运行时的所有关键信息,像变量值、线程状态、堆栈跟踪等都清晰地记录下来 。在实际开发中,它的作用举足轻重,尤其是当程序出现性能问题,比如运行速度越来越慢,或者突然崩溃,又或者遭遇内存泄漏,导致内存占用不断攀升等棘手情况时,dump 文件能成为我们定位和解决问题的关键线索。就好比医生给病人做全面检查,通过各种检查报告来诊断病情,dump 文件就是程序的 “检查报告”,帮助开发者深入了解程序内部的状况,从而精准地找到问题根源,进行修复。

二、生成 Dump 文件的 “十八般武艺”

(一)借助任务管理器或 Process Explorer

使用任务管理器生成 Dump 文件的操作非常简单。当程序出现问题时,我们只需按下 “Ctrl + Shift + Esc” 组合键打开任务管理器,切换到 “详细信息” 选项卡 。在进程列表中找到目标程序的进程,右键点击它,然后选择 “创建转储文件” 选项。此时,系统会自动在默认路径下生成一个 Full Dump 文件,这个默认路径通常是系统盘的 “用户 \ 当前用户名 \AppData\Local\Temp” 文件夹 。不过,在 64 位操作系统上,要注意使用 32 位任务管理器给 32 位进程生成转储文件,用 64 位任务管理器给 64 位进程生成转储文件,32 位的任务管理器位于 C:\Windows\SysWOW64\taskmgr.exe。

而 Process Explorer 是一款功能更强大的进程管理工具,它可以看作是任务管理器的增强版。我们可以从微软官方网站下载并解压后直接使用。运行 Process Explorer 后,在搜索框中输入程序名称,就能快速过滤出目标进程。右键点击该进程,选择 “Create Dump” 选项,这里提供了 “Create Mini Dump” 和 “Create Full Dump” 两个选项,我们可以根据实际需求选择生成 Mini Dump 文件还是 Full Dump 文件,并且还能自由选择生成 Dump 文件的保存路径。

(二)使用 DebugDiag 工具

DebugDiag 是一款专门用于诊断程序问题的强大工具,它能够帮助我们在程序出现崩溃、卡死、断言等情况时,生成详细的 Dump 文件,以便深入分析问题。

首先,我们需要从微软官方网站下载 DebugDiag 工具的安装包,根据系统版本选择 32 位或 64 位的安装程序进行安装 。安装完成后,在开始菜单中找到 “DebugDiag 2 Collection” 并打开它。

接下来进行规则设置。在打开的窗口中,点击 “Add Rule” 按钮,在弹出的 “Rule Wizard” 对话框中,选择 “Crash” 规则类型,表示我们要针对程序崩溃的情况生成 Dump 文件,然后点击 “Next”。在 “Process Selection” 页面,选择 “A specific process”,并在下方输入框中填写目标程序的进程名,例如 “myProgram.exe”,再点击 “Next”。在 “Advanced Options” 页面,可以根据需要勾选一些选项,比如 “Log Stack Trace”,它能记录程序崩溃时的堆栈信息,这对于定位问题非常有帮助,完成选择后继续点击 “Next”。在 “Save & Activate” 页面,给这个规则取一个名字,比如 “myProgram Crash Rule”,然后点击 “Finish” 完成规则设置并激活它。

当目标程序发生崩溃时,DebugDiag 就会按照我们设置的规则,在指定的文件夹中生成 Dump 文件,这个指定文件夹可以在规则设置的 “Advanced Options” 页面中进行配置,默认是 DebugDiag 安装目录下的 “Logs” 文件夹。

(三)利用 CLRMD 库以编程方式实现

CLRMD(Common Language Runtime Managed Debugging)库提供了一种通过编程方式生成 Dump 文件的方法,这在一些自动化测试或特定的开发场景中非常有用。

在使用 CLRMD 库之前,需要先在项目中添加对它的引用。如果是使用 NuGet 包管理器,只需在 “程序包管理器控制台” 中输入 “Install-Package Microsoft.Diagnostics.Runtime” 命令,即可安装 CLRMD 库。

下面是一个使用 CLRMD 库生成 Dump 文件的简单示例代码:

using System;
using System.Diagnostics;
using Microsoft.Diagnostics.Runtime;

class Program
{
    static void Main()
    {
        // 获取目标进程ID,这里假设目标进程ID为1234,实际使用时需要根据实际情况获取
        int targetProcessId = 1234;

        // 打开目标进程
        using (DataTarget dataTarget = DataTarget.AttachToProcess(targetProcessId, 5000, AttachFlag.Passive))
        {
            // 设置Dump文件保存路径
            string dumpFilePath = @"C:\Dumps\myDump.dmp";

            // 生成Dump文件
            dataTarget.WriteDump(dumpFilePath, ClrDataCreateDumpFlags.WithPrivateReadWriteMemory);

            Console.WriteLine($"Dump文件已生成: {dumpFilePath}");
        }
    }
}

在这段代码中,首先定义了目标进程 ID,然后使用DataTarget.AttachToProcess方法尝试附加到目标进程,如果在 5000 毫秒(5 秒)内成功附加,则返回一个DataTarget对象 。接着,指定了 Dump 文件的保存路径,最后调用dataTarget.WriteDump方法生成 Dump 文件,并传入了ClrDataCreateDumpFlags.WithPrivateReadWriteMemory标志,表示在生成的 Dump 文件中包含进程的私有读写内存信息,这样生成的 Dump 文件会更全面,有助于后续的分析。运行这段代码后,就会在指定路径下生成一个 Dump 文件。

三、解读 Dump 文件的 “密码本”

(一)Visual Studio:调试的得力助手

Visual Studio 是一款功能强大的集成开发环境,对于分析 Dump 文件也提供了非常便捷且实用的功能。

当我们需要分析一个 Dump 文件时,首先在 Visual Studio 中选择 “文件” 菜单,然后点击 “打开”,再选择 “转储文件”,找到我们之前生成的 Dump 文件并打开它 。打开后,Visual Studio 会自动检测并加载相关的符号文件(PDB 文件),这些符号文件包含了程序的调试信息,如变量名、函数名、行号等,对于准确分析问题至关重要 。如果 Visual Studio 没有自动找到符号文件,我们可以通过 “调试” 菜单下的 “选项和设置”,在 “符号” 选项中手动设置符号文件的路径,确保符号文件能够正确加载。

加载完成后,Visual Studio 会自动对崩溃转储进行分析,它会在 “诊断工具” 窗口中展示详细的分析结果。在这里,我们可以看到许多关键信息,比如异常类型和异常消息,这能让我们快速了解程序崩溃的直接原因。以一个简单的除法运算程序为例,如果出现除零异常,我们就能在诊断工具窗口中看到异常类型为 “DivideByZeroException”,异常消息会提示具体在哪个方法、哪一行代码发生了除零操作 。

同时,还能查看线程信息,包括每个线程的状态(运行、等待、阻塞等)、线程的调用栈。通过线程的调用栈,我们可以清晰地看到线程在程序崩溃前执行的方法调用顺序,这对于追踪问题的根源非常有帮助。比如在一个多线程的文件处理程序中,某个线程出现问题,通过查看线程调用栈,我们可以发现它在调用文件读取方法时出现了异常,进而深入分析文件读取的参数设置、文件是否存在等问题 。

此外,Visual Studio 还会突出显示一些重要信息,如占用大量内存的对象、长时间运行的线程等,这些信息都能引导我们更快地定位到程序中的潜在问题。

(二)WinDbg:深度分析的利器

WinDbg 是微软提供的一款强大的调试工具,它在深度分析 Dump 文件方面有着独特的优势,能够帮助我们挖掘出更底层的信息。

在使用 WinDbg 之前,需要先从微软官方网站下载并安装它。安装完成后,打开 WinDbg,我们就可以开始加载 Dump 文件进行分析了。

加载 Dump 文件的操作很简单,在 WinDbg 的菜单中选择 “File” -> “Open Crash Dump”,然后选择要分析的 Dump 文件。加载成功后,我们需要加载调试扩展,其中最常用的是 SOS(Son of Strike)扩展,它专门用于调试托管代码。加载 SOS 扩展的命令是:.loadby sos clr ,这里的 “clr” 表示公共语言运行时,通过这个命令,WinDbg 会加载与当前 Dump 文件对应的 SOS 扩展,以便后续使用各种针对托管代码的调试命令 。

加载完扩展后,就可以使用一系列常用的分析命令了。例如,使用!clrstack命令可以查看当前线程的托管堆栈信息,它会列出堆栈上的所有方法调用,以及每个方法的参数和局部变量 。假设我们有一个递归调用的方法导致了栈溢出问题,通过!clrstack命令,我们可以清晰地看到递归调用的层次和每一层的方法参数,从而找到递归的起始点和可能导致栈溢出的原因 。

!threads命令用于查看所有托管线程的信息,包括线程 ID、线程状态、线程优先级等。这在分析多线程问题时非常有用,比如在一个多线程的服务器程序中,通过!threads命令可以查看是否存在线程死锁、线程长时间阻塞等问题 。

!dumpheap -stat命令用于统计托管堆上各种对象的数量和大小,这对于查找内存泄漏问题非常关键。如果我们发现某个对象类型的数量不断增加,而没有相应的减少,就可能存在内存泄漏的情况 。通过进一步分析这些对象的创建和引用关系,就有可能找到内存泄漏的根源 。

四、代码中的 Dump 魔法秀

(一).NET Framework 版本中的应用

在.NET Framework 版本中,我们可以通过调用 Windows API 函数MiniDumpWriteDump来生成 Dump 文件。不过,在使用之前,需要先定义相关的枚举和结构体,并且使用DllImport特性来导入dbghelp.dll库中的MiniDumpWriteDump函数。下面是一个完整的示例代码:

using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Diagnostics;

public class Program
{
    // 定义Dump类型的枚举,这里只列举了部分常用的,更多详情可查看MSDN
    [Flags]
    public enum MiniDumpType : uint
    {
        MiniDumpNormal = 0x00000000,
        MiniDumpWithFullMemory = 0x00000002,
        MiniDumpWithHandleData = 0x00000004
    }

    // 定义MiniDumpExceptionInformation结构体,用于传递异常信息
    [StructLayout(LayoutKind.Sequential, Pack = 4)]
    public struct MiniDumpExceptionInformation
    {
        public uint ThreadId;
        public IntPtr ExceptionPointers;
        [MarshalAs(UnmanagedType.Bool)]
        public bool ClientPointers;
    }

    // 导入dbghelp.dll中的MiniDumpWriteDump函数
    [DllImport("dbghelp.dll", SetLastError = true)]
    public static extern bool MiniDumpWriteDump(IntPtr hProcess,
                                                uint processId,
                                                SafeHandle hFile,
                                                uint dumpType,
                                                ref MiniDumpExceptionInformation expParam,
                                                IntPtr userStreamParam,
                                                IntPtr callbackParam);

    public static void Main()
    {
        CreateDump();
    }

    public static void CreateDump()
    {
        // 获取当前正在运行的进程
        Process currentProcess = Process.GetCurrentProcess();

        // 创建一个MiniDumpExceptionInformation对象
        MiniDumpExceptionInformation eInfo = new MiniDumpExceptionInformation();
        eInfo.ThreadId = (uint)currentProcess.Threads[0].Id;
        eInfo.ExceptionPointers = Marshal.GetExceptionPointers();
        eInfo.ClientPointers = false;

        // 设置Dump文件的保存路径
        string filePath = @"C:\temp\dumpfile.dmp";

        // 使用FileStream创建一个文件,用于保存Dump数据
        using (FileStream stream = new FileStream(filePath, FileMode.Create))
        {
            // 调用MiniDumpWriteDump函数生成Dump文件
            bool success = MiniDumpWriteDump(currentProcess.Handle,
                                             (uint)currentProcess.Id,
                                             stream.SafeFileHandle,
                                             (uint)MiniDumpType.MiniDumpWithFullMemory,
                                             ref eInfo,
                                             IntPtr.Zero,
                                             IntPtr.Zero);

            // 检查生成是否成功,如果失败则抛出异常
            if (!success)
            {
                throw new Exception("MiniDumpWriteDump failed");
            }
        }
    }
}

在这段代码中,首先定义了MiniDumpType枚举,它包含了不同的 Dump 类型选项,这里只展示了MiniDumpNormal(普通 Dump)、MiniDumpWithFullMemory(包含完整内存的 Dump)和MiniDumpWithHandleData(包含句柄数据的 Dump) 。然后定义了MiniDumpExceptionInformation结构体,用于存储异常相关的信息,如线程 ID、异常指针和客户端指针标志 。通过DllImport特性导入MiniDumpWriteDump函数,该函数负责将进程的状态信息写入到指定的文件中,生成 Dump 文件 。

在CreateDump方法中,获取当前进程,初始化MiniDumpExceptionInformation对象,指定 Dump 文件的保存路径,然后调用MiniDumpWriteDump函数生成 Dump 文件 。如果生成过程失败,会抛出异常提示用户。

(二).NET Core 之后版本的实现

在.NET Core 中,由于其跨平台的特性,无法直接使用MiniDumpWriteDump这个 Windows API 函数。不过,我们可以借助第三方库Microsoft.Diagnostics.NETCore.Client来实现生成 Dump 文件的功能。

首先,需要在项目中安装Microsoft.Diagnostics.NETCore.Client库。可以通过 NuGet 包管理器来安装,具体步骤如下:

  1. 打开 Visual Studio,在解决方案资源管理器中右键点击项目名称,选择 “管理 NuGet 程序包”。

  2. 在打开的 NuGet 包管理器窗口中,搜索 “Microsoft.Diagnostics.NETCore.Client”。

  3. 找到该包后,点击 “安装” 按钮,将其安装到项目中。

安装完成后,就可以使用以下代码来生成 Dump 文件:

using Microsoft.Diagnostics.NETCore.Client;
using System;

namespace DumpDemo
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 从命令行参数获取要收集Dump的进程ID和Dump文件保存路径
            int processId = int.Parse(args[0]); 
            string dumpFilePath = args[1]; 

            CreateDump(processId, dumpFilePath);
        }

        public static void CreateDump(int processId, string dumpFilePath)
        {
            // 创建DiagnosticsClient对象,用于与目标进程进行交互
            var client = new DiagnosticsClient(processId);

            // 调用WriteDump方法生成Dump文件,这里使用Normal类型的Dump
            client.WriteDump(DumpType.Normal, dumpFilePath);
        }

        // 定义DumpType枚举,包含不同类型的Dump
        public enum DumpType
        {
            Normal = 1,
            WithHeap = 2,
            Triage = 3,
            Full = 4
        }
    }
}

在这段代码中,首先从命令行参数获取要收集 Dump 的进程 ID 和 Dump 文件的保存路径 。然后创建DiagnosticsClient对象,该对象用于与目标进程进行交互,通过它可以执行各种诊断操作,如生成 Dump 文件 。调用client.WriteDump方法生成 Dump 文件,传入DumpType.Normal表示生成普通类型的 Dump 文件,这种类型的 Dump 文件主要包含线程和某些系统信息,但不包括堆信息,文件相对较小,适用于在处理能力有限的环境中快速捕获应用程序的状态 。如果需要生成包含更多信息的 Dump 文件,如包含堆信息的WithHeap类型、用于快速诊断常见问题的Triage类型或包含进程所有内存的Full类型,可以根据实际需求修改传入的DumpType参数 。

五、Dump 使用的注意事项与技巧

(一)优化 Dump 文件大小

在实际应用中,Dump 文件可能会因为包含大量的内存信息而变得非常庞大,这不仅会占用大量的磁盘空间,还会增加传输和分析的难度。因此,优化 Dump 文件大小是一个需要重视的问题。

一种有效的方法是只保存必要的内存区域。在生成 Dump 文件时,可以根据实际需求选择只包含关键线程的信息,而不是整个进程的所有线程信息。例如,在一个多线程的服务器程序中,可能只有处理关键业务逻辑的线程出现了问题,那么我们可以只保存这些线程的相关内存区域,这样可以大大减少 Dump 文件的大小 。在使用MiniDumpWriteDump函数时,可以通过设置合适的MiniDumpType参数来实现这一目的,比如使用MiniDumpNormal类型,它只包含调用栈相关信息,相比包含全部可访问内存的MiniDumpWithFullMemory类型,生成的 Dump 文件会小很多 。

另一种常见的优化方法是对 Dump 文件进行压缩。在 C# 中,可以使用System.IO.Compression命名空间下的相关类来实现文件压缩。例如,使用ZipFile.CreateFromDirectory方法将 Dump 文件压缩成 ZIP 格式 。以下是一个简单的示例代码:

using System.IO.Compression;

class Program
{
    static void Main()
    {
        string sourceDumpFilePath = @"C:\Dumps\myDump.dmp";
        string zipFilePath = @"C:\Dumps\myDump.zip";

        ZipFile.CreateFromDirectory(sourceDumpFilePath, zipFilePath);
    }
}

在这个示例中,sourceDumpFilePath是原始的 Dump 文件路径,zipFilePath是压缩后的 ZIP 文件路径。通过执行这段代码,就可以将原始的 Dump 文件压缩成一个 ZIP 文件,从而减小文件大小,方便存储和传输 。

(二)保障 Dump 文件安全

由于 Dump 文件包含了程序运行时的内存信息,其中可能包含敏感数据,如用户密码、数据库连接字符串、重要的业务数据等,因此 Dump 文件的安全性至关重要。如果这些文件被攻击者获取,他们可能会从中提取敏感信息,进而对系统造成严重的安全威胁,比如利用获取的数据库连接字符串进行非法的数据访问,或者使用用户密码进行恶意登录等 。

为了保障 Dump 文件的安全,一种常见的措施是对 Dump 文件进行加密。在 C# 中,可以使用System.Security.Cryptography命名空间下的加密算法来实现。例如,使用 AES(高级加密标准)算法对 Dump 文件进行加密。以下是一个简单的加密示例代码:

using System;
using System.IO;
using System.Security.Cryptography;

class Program
{
    static void Main()
    {
        string sourceDumpFilePath = @"C:\Dumps\myDump.dmp";
        string encryptedDumpFilePath = @"C:\Dumps\myEncryptedDump.dmp";
        string key = "ThisIsASecretKey12345"; // 实际应用中应使用更安全的密钥管理方式

        using (Aes aesAlg = Aes.Create())
        {
            aesAlg.Key = System.Text.Encoding.UTF8.GetBytes(key);
            aesAlg.IV = new byte[16]; // 初始化向量,这里简单设置为全0,实际应用中应随机生成

            ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

            using (FileStream sourceFileStream = new FileStream(sourceDumpFilePath, FileMode.Open, FileAccess.Read))
            {
                using (FileStream encryptedFileStream = new FileStream(encryptedDumpFilePath, FileMode.Create, FileAccess.Write))
                {
                    using (CryptoStream cryptoStream = new CryptoStream(encryptedFileStream, encryptor, CryptoStreamMode.Write))
                    {
                        sourceFileStream.CopyTo(cryptoStream);
                    }
                }
            }
        }
    }
}

在这段代码中,首先定义了原始 Dump 文件路径sourceDumpFilePath和加密后 Dump 文件路径encryptedDumpFilePath,以及一个加密密钥key(实际应用中应使用更安全的密钥管理方式,如密钥管理系统) 。然后使用Aes.Create()方法创建 AES 加密对象,设置密钥和初始化向量(这里简单设置为全 0,实际应用中应随机生成) 。接着创建加密器encryptor,通过CryptoStream将原始 Dump 文件的内容加密后写入到新的加密文件中 。

除了加密,还可以通过限制访问权限来保障 Dump 文件的安全。在 Windows 系统中,可以利用文件系统的访问控制列表(ACL)来设置只有特定的用户或组才能访问 Dump 文件 。例如,将 Dump 文件存储在一个特定的文件夹中,然后通过文件夹的属性设置,只赋予管理员组和开发人员组读取和写入权限,其他用户或组则没有任何访问权限,这样可以有效防止 Dump 文件被非法访问和获取 。

六、总结与展望

在 C# 的编程旅程中,Dump 无疑是一把强大的 “瑞士军刀”,它生成的 dump 文件承载着程序运行状态的关键信息,在程序出现性能瓶颈、崩溃、内存泄漏等复杂问题时,成为我们定位和解决问题的有力武器。通过任务管理器、Process Explorer、DebugDiag 工具以及 CLRMD 库等多种方式,我们能够灵活地生成不同类型的 dump 文件,满足各种场景下的调试需求 。

在分析 dump 文件时,Visual Studio 和 WinDbg 等工具为我们提供了深入探究程序内部状态的能力,从异常类型和线程信息,到托管堆栈和内存使用情况,这些工具帮助我们抽丝剥茧,找出问题的根源 。在代码实现方面,无论是在.NET Framework 版本中调用 Windows API 函数,还是在.NET Core 之后的版本中借助第三方库,我们都能根据具体的平台和项目需求,实现 dump 文件的生成 。

然而,在使用 Dump 的过程中,我们也需要关注一些重要的事项。比如,优化 dump 文件大小,避免因文件过大带来的存储和传输难题;保障 dump 文件的安全,防止敏感信息泄露,对 dump 文件进行加密和限制访问权限等措施必不可少 。

展望未来,随着 C# 语言和.NET 框架的不断发展,Dump 在程序开发和调试中的应用前景将更加广阔。在云计算和分布式系统日益普及的今天,Dump 技术有望在处理大规模、复杂的分布式应用程序的调试和性能优化方面发挥更大的作用 。例如,在微服务架构中,当多个服务之间出现通信问题或性能瓶颈时,通过在各个服务节点上生成 dump 文件,并进行统一的分析和诊断,能够快速定位问题所在,提高系统的稳定性和可靠性 。同时,随着人工智能和机器学习技术的发展,未来可能会出现更加智能的 Dump 分析工具,它们能够自动识别常见的问题模式,并提供针对性的解决方案,进一步提升开发人员的调试效率 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/967714.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Crowdin 在线本地化平台调用硅基流动AI预翻译

平台介绍 硅基流动(AI服务平台) 官网:https://siliconflow.cn/zh-cn/ 官方介绍 我主要使用:云服务平台 SilliconCloud 此平台已经将热门的开源大语言模型部署,花钱买额度,就能使用 API 最近有上线 Deep…

二、通义灵码插件保姆级教学-IDEA(使用篇)

一、IntelliJ IDEA 中使用指南 1.1、代码解释 选择需要解释的代码 —> 右键 —> 通义灵码 —> 解释代码 解释代码很详细,感觉很强大有木有,关键还会生成流程图,对程序员理解业务非常有帮忙,基本能做到哪里不懂点哪里。…

游戏引擎学习第97天

回顾昨天并计划今天 在这期节目中,主要讲解了光照的概念,并进一步讨论了法线贴图光照的实现。节目的内容大致分为几个部分: 光照的基础概述:讨论了光的工作原理以及如何在编程图形时需要考虑光照问题。尽管这些概念并没有深入到…

python+unity落地方案实现AI 换脸融合

先上效果再说技术结论,使用的是自行搭建的AI人脸融合库,可以离线不受限制无限次生成,有需要的可以后台私信python ai换脸融合。 TODO 未来的方向:3D人脸融合和AI数据训练 这个技术使用的是openvcinsighface,openvc…

Python——批量图片转PDF(GUI版本)

目录 专栏导读1、背景介绍2、库的安装3、核心代码4、完整代码总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——>Python办公自动化专…

AutoMQ 如何实现没有写性能劣化的极致冷读效率

前言 追赶读(Catch-up Read,冷读)是消息和流系统常见和重要的场景。 削峰填谷:对于消息来说,消息通常用作业务间的解耦和削峰填谷。削峰填谷要求消息队列能将上游发送的数据堆积住,让下游在容量范围内消费…

[AI]Mac本地部署Deepseek R1模型 — — 保姆级教程

[AI]Mac本地部署DeepSeek R1模型 — — 保姆级教程 DeepSeek R1是中国AI初创公司深度求索(DeepSeek)推出大模型DeepSeek-R1。 作为一款开源模型,R1在数学、代码、自然语言推理等任务上的性能能够比肩OpenAI o1模型正式版,并采用MI…

MariaDB *MaxScale*实现mysql8读写分离

1.MaxScale 是干什么的? MaxScale是maridb开发的一个mysql数据中间件,其配置简单,能够实现读写分离,并且可以根据主从状态实现写库的自动切换,对多个从服务器能实现负载均衡。 2.MaxScale 实验环境 中间件192.168.12…

Ollama 简单 好用 好玩

简介 Ollama https://github.com/ollama/ollama/ 是一个基于 Go 语言 的 本地大语言模型运行框架,专注于本地化运行大型语言模型(LLM)的开源工具。 类 Docker 产品(支持 list,pull,push,run 等命令),更好玩…

存储可靠性:从基于磁盘的RAID到分布式纠删码(EC),多副本

文章目录 0.简介1.RAID1.1 RAID 01.2 RAID 11.3 RAID 51.4 RAID 61.5 RAID 10 2.EC(纠删码)2.1 概念2.2 原理 3.多副本4. 总结和优缺点比较 0.简介 在选择数据存储方案时,一个绕不开的话题就是数据存储的可靠性(面对故障时的应对…

【自然语言处理】利用Memory Layer替换Transformer中的FFN

论文地址:https://arxiv.org/pdf/2412.09764 相关博客 【自然语言处理】利用Memory Layer替换Transformer中的FFN 【自然语言处理】【大模型】BitNet:用1-bit Transformer训练LLM 【自然语言处理】BitNet b1.58:1bit LLM时代 【自然语言处理】…

Redis持久化的两种方式:RDB和AOF

redis中的数据存储在缓存中,如果没有持久化的策略,Redis一旦宕机,那么将会导致数据丢失;因此redis提供了以下两种持久化方式:RDB和AOF 一般来说,大部分公司对这两种方式都是同时开启的 一、RDB RDB策略全…

linux查看所有程序占用的本地端口

sudo ss -tulwnp ss是Socket Statistics的缩写,用来替代旧的netstat工具,功能更强大,执行更快。它用于查看系统的网络连接情况,包括TCP、UDP等协议的信息。 查阅ss的帮助文档(man ss),发现选项…

组件库选择:ElementUI 还是 Ant Design

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

9 数据流图

9 数据流图 9.1数据平衡原则 子图缺少处理后的数据操作结果返回前端应用以及后端数据库返回操作结果到数据管理中间件。 9.2解题技巧 实件名 存储名 加工名 数据流

CEF132 编译指南 MacOS 篇 - 基础开发工具安装实战 (二)

1. 引言 在 macOS 平台上编译 CEF132 之前,首要任务是搭建一个完善的开发环境。与 Windows 和 Linux 环境不同,macOS 的开发环境主要以 Xcode 为核心。本篇将作为 CEF132 编译指南系列的第二篇,详细指导读者如何在 macOS 系统上安装和配置 X…

单片机简介

一、单片机简介 电脑和单片机性能对比 二、单片机发展历程 三、CISC VS RISC

Idea集成deepseek生成代码

今天我带大家在idea上安装CodeGpt插件,这个插件可以根据我们的提示词生产代码,我们一起试试。 1、安装插件 打开idea,再点击setting菜单,按以下步骤操作。 安装完成后,一定要点击第四步“ok”。再次点击菜单setting…

服务器使用宝塔面板Docker应用快速部署 DeepSeek-R1模型,实现Open WebUI访问使用

Deepseek这段时间非常火,最新推理模型Deepseek R1,都想装上试一试,特别是部署到服务器教程网上一堆教程好像没几个部署成功靠谱的,先说服务器上下载Ollama就难倒一堆人,每次都超时。今天终于在宝塔看到一篇 应用安装文…

json格式,curl命令,及轻量化处理工具

一. JSON格式 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于一个子集的JavaScript编程语言,使用人类易于阅读的文本格式来存储和表示数据。尽管名字中有“JavaScript”,但JSON是语言无关的,几…