<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
        <title>FanZheng&#39;s Debug Blog</title>
        <link>https://debug.fanzheng.org</link>
        <description>发现问题本质，还原BUG真相！</description>
        <atom:link href="https://debug.fanzheng.org/rss.html" rel="self" />
        <language>zh-cn</language>
        <lastBuildDate>Sat, 09 May 2026 11:32:14 GMT</lastBuildDate>
        <item>
            <title>解决docker代理不生效问题</title>
            <link>https://debug.fanzheng.org/post/jie-jue-docker-dai-li-bu-sheng-xiao-wen-ti.html</link>
            <description><![CDATA[
            <div class="toc"></div><p>之前一直没有需求，没用过docker，今天尝试用了一下。</p>
<p>首先，在没有开启代理的时候，报错是这样的：</p>
<pre><code class="hljs lang-subunit"><span class="hljs-keyword">ERROR: </span>failed to build: failed to solve: xxx/yyy: failed to resolve source metadata for docker.io/xxx/yyy: failed to do request: Head &quot;https://registry<span class="hljs-string">-1</span>.docker.io/v2/xxxxx&quot;: dial tcp 67.15.100.252:443: connect: connection refused
</code></pre>
<p>按常规方式加上代理，新建文件<code>/etc/systemd/system/docker.service.d/proxy.conf</code>，填上代理配置，例如：</p>
<pre><code class="hljs lang-undefined">[Service]
Environment=&quot;HTTP_PROXY=http://192.168.31.2:1080&quot;
Environment=&quot;HTTPS_PROXY=http://192.168.31.2:1080&quot;
Environment=&quot;NO_PROXY=localhost,127.0.0.1&quot;
</code></pre>
<p>然后<code>sudo systemctl daemon-reload &amp;&amp; sudo systemctl restart docker</code>。</p>
<p>但是发现代理始终不生效，报错：</p>
<pre><code class="hljs lang-subunit"><span class="hljs-keyword">ERROR: </span>failed to build: failed to solve: failed to fetch anonymous token: Get &quot;https://auth.docker.io/token?scope=repository%3Axxx%3Apull&amp;service=registry.docker.io&quot;: dial tcp 128.242.240.117:443: connect: connection refused
</code></pre>
<p>尝试半天之后发现，是<code>auth.docker.io</code>这个地址的请求并不走docker的代理配置，所以需要结合<code>export http_proxy=http://192.168.31.2:1080 https_proxy=http://192.168.31.2:1080</code>才行。</p>
<p>附一些常见的docker命令：</p>
<pre><code class="hljs lang-bash">docker build -t firekylin .
docker images firekylin
docker run -d -p 8360:8360 firekylin
docker <span class="hljs-built_in">exec</span> -it 2a51518b8efe /bin/sh
docker stop 2a51518b8efe
</code></pre>

            ]]></description>
            <pubDate>Mon, 04 May 2026 09:41:50 GMT</pubDate>
            <guid>https://debug.fanzheng.org/post/jie-jue-docker-dai-li-bu-sheng-xiao-wen-ti.html</guid>
        </item>
        <item>
            <title>关于python与pytorch的各种配置问题与迷思</title>
            <link>https://debug.fanzheng.org/post/myth-of-python-and-pytorch.html</link>
            <description><![CDATA[
            <div class="toc"><ul>
<li><a href="#python">python</a><ul>
<li><a href="#toc-f36">为什么不要使用常规的系统级安装方式而选择conda</a></li>
<li><a href="#toc-a70">如何正确安装conda：选择miniforge而非anaconda/miniconda</a><ul>
<li><a href="#toc-6ca">Linux安装</a></li>
<li><a href="#toc-2d7">Windows安装</a></li>
<li><a href="#toc-704">基本用法</a></li>
</ul>
</li>
<li><a href="#toc-542"><code>.condarc</code>配置</a></li>
<li><a href="#toc-212">conda源（channel）详解</a></li>
<li><a href="#toc-224">miniforge与anaconda/miniconda在channel上默认行为的不同</a></li>
<li><a href="#toc-d9c">你需要哪些channel</a></li>
<li><a href="#toc-533">配置conda镜像源</a></li>
<li><a href="#toc-0e1">配置python镜像源</a></li>
</ul>
</li>
<li><a href="#pytorch">pytorch</a><ul>
<li><a href="#toc-fb4">通过pip安装</a></li>
<li><a href="#toc-6df">通过conda安装</a></li>
<li><a href="#toc-ff2">如何选择conda安装还是pip安装</a></li>
</ul>
</li>
</ul>
</div><p>最近开始深度搞搞AI相关东西，涉及到python和pytorch，第一步先把环境问题搞清楚。python的东西是真的乱……网上的信息几乎没有一个能完整说清楚的，大量的错误信息。</p>
<h1><a id="python" class="anchor" href="#python"></a>python</h1>
<h2><a id="toc-f36" class="anchor" href="#toc-f36"></a>为什么不要使用常规的系统级安装方式而选择conda</h2>
<p>首先安装python就是一个很大的问题，该选择什么样的安装方式呢？Linux各个发行版都自带python，Windows也可以下载安装<a href="https://www.python.org/downloads/">python windows installer</a>，但这种安装方式一律不建议，核心原因是：尽管我们可以通过venv这类环境管理软件来实现python env的创建与隔离，但每个python env所使用的python版本都只能是系统中安装的那个版本，无法灵活修改。更要命的是，Windows的installer还一大堆Bug，有无法正常卸载、卸载有残留等问题。</p>
<p>唯一正确的选择是使用conda。</p>
<h2><a id="toc-a70" class="anchor" href="#toc-a70"></a>如何正确安装conda：选择miniforge而非anaconda/miniconda</h2>
<p>老生常谈的问题。anaconda和miniconda是商业产品，区别是anaconda会预装很多包，miniconda仅预装必要的包，所以miniconda体积小很多。而miniforge是开源社区主导的对标miniconda的产品。<strong>选开源产品就对了！</strong></p>
<blockquote>
<p>曾经还有mamba，比miniforge性能更好，但mamba现已合并到miniforge中，所以直接用miniforge就好</p>
</blockquote>
<h3><a id="toc-6ca" class="anchor" href="#toc-6ca"></a>Linux安装</h3>
<p>在github上搜索<a href="https://github.com/conda-forge/miniforge">miniforge3</a>，按说明下载安装即可。安装时建议不要让它自动修改shell，手动在bashrc里添加<code>[[ -e &quot;$HOME/miniforge3/bin/conda&quot; ]] &amp;&amp; eval &quot;$($HOME/miniforge3/bin/conda shell.bash hook)&quot;</code>即可。安装完建议执行<code>conda config --set auto_activate false</code>，目的是不要让它在启动shell时自动激活。后面会详细讲<code>.condarc</code>的配置。</p>
<h3><a id="toc-2d7" class="anchor" href="#toc-2d7"></a>Windows安装</h3>
<p><a href="https://github.com/conda-forge/miniforge/releases">release</a>页下载安装Miniforge3-Windows-x86_64.exe即可。安装时建议不要勾选注册为系统python和添加到PATH这两个选项，自己手动配就好了。</p>
<p>手动将以下路径加到PATH中（注意这些PATH要添加在<code>%USERPROFILE%\AppData\Local\Microsoft\WindowsApps</code>的上面才行，否则会优先使用WindowsApps下的python）：</p>
<pre><code class="hljs lang-undefined">D:\work\library\win\miniforge3
D:\work\library\win\miniforge3\Library\mingw-w64\bin
D:\work\library\win\miniforge3\Library\usr\bin
D:\work\library\win\miniforge3\Library\bin
D:\work\library\win\miniforge3\Scripts
</code></pre>
<h3><a id="toc-704" class="anchor" href="#toc-704"></a>基本用法</h3>
<pre><code class="hljs lang-bash"><span class="hljs-comment"># 创建名为test的环境</span>
conda create -n <span class="hljs-built_in">test</span> python=3.14
<span class="hljs-comment"># 删除为test的环境</span>
conda remove -n <span class="hljs-built_in">test</span> --all
<span class="hljs-comment"># 进入名为test的环境</span>
conda activate <span class="hljs-built_in">test</span>
<span class="hljs-comment"># 退出当前python环境</span>
conda deactivate
</code></pre>
<h2><a id="toc-542" class="anchor" href="#toc-542"></a><code>.condarc</code>配置</h2>
<p>首先，conda是一个通用的包管理器，可以装各种软件和python包，而pip只能用来装python包。但conda和pip使用的是完全不同的源，管理方式也不同，即使是同名的python包内容也可能不同。</p>
<p>我们先来看一个典型的<code>.condarc</code>是什么样的：</p>
<pre><code class="hljs lang-yaml"><span class="hljs-attr">channels:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-string">conda-forge</span>
<span class="hljs-attr">show_channel_urls:</span> <span class="hljs-literal">true</span>
<span class="hljs-attr">auto_activate:</span> <span class="hljs-literal">false</span>
<span class="hljs-attr">default_channels:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-string">https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main</span>
  <span class="hljs-bullet">-</span> <span class="hljs-string">https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r</span>
  <span class="hljs-bullet">-</span> <span class="hljs-string">https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2</span>
<span class="hljs-attr">custom_channels:</span>
  <span class="hljs-attr">conda-forge:</span> <span class="hljs-string">https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud</span>
  <span class="hljs-attr">pytorch:</span> <span class="hljs-string">https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud</span>
</code></pre>
<p>配置细节详见<a href="https://docs.conda.io/projects/conda/en/latest/configuration.html">文档</a>。首先是两个建议配置：</p>
<ul>
<li><code>show_channel_urls</code>: 下载时显示是从哪个URL下载的</li>
<li><code>auto_activate</code>: 启动shell时自动激活python默认环境（base），很多地方写的配置都是<code>auto_activate_base</code>，其实是一样的</li>
</ul>
<p>剩下的三个配置是channel相关的，下面详细讲。</p>
<h2><a id="toc-212" class="anchor" href="#toc-212"></a>conda源（channel）详解</h2>
<p>首先要搞懂channel是个什么概念。channel是指conda包分发的通道，例如最大的channel是社区维护的<a href="https://anaconda.org/channels/conda-forge">conda-forge</a>，<a href="https://anaconda.org/channels/nvidia">nvidia</a>也有自己维护的channel。不同的channel提供了不同的软件集合（当然不同的channel里也可能有相同的软件）。相当于把软件包套了层namespace，不同组织各自维护自己的channel（当然一个组织也可能维护多个channel）。</p>
<p>接下来看<code>channels</code>、<code>default_channels</code>、<code>custom_channels</code>这三个channel相关的配置是在配什么：</p>
<ul>
<li><code>channels</code>: 指定使用<code>conda create</code>和<code>conda install</code>这些命令时从哪些channel里搜索和安装。这里只需要写channel的别名，例如conda-forge。其中defaults是一个特殊的别名，下面会讲。</li>
<li><code>custom_channels</code>：指定channel别名所对应的地址，<code>conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud</code>指在使用conda-forge这个channel时，需要访问<code>https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge</code>来搜索和安装。</li>
<li><code>default_channels</code>: 专门用于配置defaults的特殊配置项，它等价于在<code>custom_multichannels</code>（类似于上面的<code>custom_channels</code>，但是是用于配置别名与channel之间是一对多的情况）配置中定义defaults，例如：</li>
</ul>
<pre><code class="hljs lang-yaml"><span class="hljs-attr">custom_multichannels:</span>
  <span class="hljs-attr">defaults:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2</span>
</code></pre>
<p><strong>简单来说就是，<code>channels</code>指定channel别名，<code>custom_channels</code>中定义别名对应的地址，<code>default_channels</code>是定义defaults这个特殊别名所对应的地址，只不过这个别名对应了多个channel。</strong></p>
<p>对于没有写在<code>channels</code>里的<code>custom_channels</code>，默认不会进行检索，需要通过手动指定的方式来安装这些channel里的软件。手动指定有两个方法：</p>
<ol>
<li>通过<code>-c</code>参数，例如<code>conda install pytorch -c conda-forge</code>（本次conda install操作增加对conda-forge这个channel里软件的检索）</li>
<li>在包名前手动指定channel，例如<code>conda install conda-forge::pytorch</code>（从conda-forge这个channel里检索pytorch并安装，指向更加精准）</li>
</ol>
<h2><a id="toc-224" class="anchor" href="#toc-224"></a>miniforge与anaconda/miniconda在channel上默认行为的不同</h2>
<p>先介绍两个命令：</p>
<ul>
<li><code>conda config --show</code>: 查看补上了默认值之后的<code>.condarc</code>配置的值（当前用户配置的<code>.condarc</code>与conda默认的<code>.condarc</code>配置合并后所有的<code>.condarc</code>配置项的值）</li>
<li><code>conda info</code>: 查看conda本身的相关信息，我们可以用这个查到conda实际默认使用的channel对应的URLs（即<code>.condarc</code>中的<code>channels</code>中指定的channel别名所对应的URLs）</li>
</ul>
<p>我们再来看一下miniforge在没有在<code>.condarc</code>做任何配置时的各配置值：</p>
<pre><code class="hljs lang-yaml"><span class="hljs-attr">channels:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-string">conda-forge</span>
<span class="hljs-attr">channel_alias:</span> <span class="hljs-string">https://conda.anaconda.org</span>
<span class="hljs-attr">default_channels:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-string">https://repo.anaconda.com/pkgs/main</span>
  <span class="hljs-bullet">-</span> <span class="hljs-string">https://repo.anaconda.com/pkgs/r</span>
  <span class="hljs-bullet">-</span> <span class="hljs-string">https://repo.anaconda.com/pkgs/msys2</span>
<span class="hljs-attr">custom_channels:</span>
  <span class="hljs-attr">pkgs/main:</span> <span class="hljs-string">https://repo.anaconda.com</span>
  <span class="hljs-attr">pkgs/r:</span> <span class="hljs-string">https://repo.anaconda.com</span>
  <span class="hljs-attr">pkgs/msys2:</span> <span class="hljs-string">https://repo.anaconda.com</span>
  <span class="hljs-attr">pkgs/pro:</span> <span class="hljs-string">https://repo.anaconda.com</span>
</code></pre>
<p>可以看出，miniforge的<code>channels</code>默认使用conda-forge。</p>
<p>而剩下的<code>default_channels</code>所定义的defaults这个channel根本没用到，如果想用，可以在<code>.condarc</code>中的<code>channels</code>中把defaults加上，或者在需要时手动引入，也就是上面所说的<code>-c</code>参数例如<code>-c defaults</code>或者<code>-c pkgs/main</code>等等。</p>
<blockquote>
<p>这里需要说明一下<code>channel_alias</code>的作用是指定<code>channels</code>中配置的别名如果在<code>custom_channels</code>不存在的话，就会默认用<code>channel_alias</code>中的地址。这里就是默认用<a href="https://conda.anaconda.org/conda-forge/">https://conda.anaconda.org/conda-forge/</a>这个地址。</p>
</blockquote>
<p><strong>而miniforge与anaconda/miniconda在channel上的默认行为，唯一的不同就是：miniforge会在你配置的<code>channels</code>最后默认加上conda-forge，而anaconda/miniconda会默认加defaults！</strong></p>
<h2><a id="toc-d9c" class="anchor" href="#toc-d9c"></a>你需要哪些channel</h2>
<p>现在，我们该回答如何正确选择channel的问题了。</p>
<p><strong>先说结论，无论你用的是miniforge还是anaconda/miniconda（尽管并不推荐），一律建议使用conda-forge这个channel。</strong></p>
<p>再细说一下这些channel都有什么区别，都在哪里维护。</p>
<ul>
<li><a href="https://anaconda.org/">anaconda.org</a>作为统一的前端页面，可用于搜索包、浏览channel、查看版本和下载量等。例如查看<a href="https://anaconda.org/channels/conda-forge">conda-forge</a>、<a href="https://anaconda.org/channels/nvidia">nvidia</a>等channel的情况。<ul>
<li>anaconda商业官方包通过<a href="https://repo.anaconda.com/">repo.anaconda.com</a>（.com域名）分发，主要有<a href="https://repo.anaconda.com/pkgs/main/">pkgs/main</a>、<a href="https://repo.anaconda.com/pkgs/r/">pkgs/r</a>、<a href="https://repo.anaconda.com/pkgs/msys2/">pkgs/msys2</a>等，更详细的说明（例如anaconda官方还维护哪些包、哪些废弃了等）见<a href="https://repo.anaconda.com/pkgs/">pkgs页面</a>。</li>
<li>社区包通过<a href="https://conda.anaconda.org/">conda.anaconda.org</a>分发，例如<a href="https://conda.anaconda.org/conda-forge/">conda-forge</a>、<a href="https://conda.anaconda.org/nvidia/">nvidia</a>等。</li>
</ul>
</li>
</ul>
<p>conda-forge目前最为活跃，anaconda商业官方包基本上就只有<code>pkgs/main</code>还在维护，而<code>pkgs/r</code>在2025年11月4日已经停止更新，<code>pkgs/msys2</code>也早在2016年就已经停止更新（<code>pkgs/msys2</code>还有个社区版channel，但跟anaconda商业版内容是一样的），其他的也废弃的废弃，停更的停更。</p>
<p>这些包基本上在conda-forge都有，所以只用conda-forge就好了。如果真的需要anaconda商业官方包，可以在<code>channels</code>中加上defaults，或者通过<code>-c defaults</code>或<code>-c anaconda/pkgs/main</code>手动指定channel。但一定不要在<code>default_channels</code>里混配anaconda/pkgs和conda-forge，或者是在<code>channels</code>中配多个且<code>channel_priority</code>配成disabled，否则包检索会按不同源内版本高的来而非在相同channel中寻找依赖包，这可能会导致依赖冲突问题。</p>
<h2><a id="toc-533" class="anchor" href="#toc-533"></a>配置conda镜像源</h2>
<p>上面已经介绍了conda社区包和anaconda商业官方包的分发渠道：</p>
<ul>
<li>conda社区包：<a href="https://conda.anaconda.org/">conda.anaconda.org</a>，例如<a href="https://conda.anaconda.org/conda-forge/">https://conda.anaconda.org/conda-forge/</a></li>
<li>anaconda商业官方包：<a href="https://repo.anaconda.com/">repo.anaconda.com</a>，例如<a href="https://repo.anaconda.com/pkgs/main/">https://repo.anaconda.com/pkgs/main/</a></li>
</ul>
<p>我们要做的，就是把这两个分发渠道替换成国内的镜像站。具体的地址每个镜像站可能有略微不同。以清华tuna镜像站为例，它们都被放到了<a href="https://mirrors.tuna.tsinghua.edu.cn/anaconda">https://mirrors.tuna.tsinghua.edu.cn/anaconda</a>下：</p>
<ul>
<li>conda社区包：<a href="https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud">https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud</a>，都在cloud目录下</li>
<li>anaconda商业官方包：<a href="https://mirrors.tuna.tsinghua.edu.cn/anaconda/">https://mirrors.tuna.tsinghua.edu.cn/anaconda/</a>，由于官方包都以pkgs开头，所以都在pkgs目录下。</li>
</ul>
<p>因此典型的<code>.condarc</code>的<code>default_channels</code>和<code>custom_channels</code>镜像源配置如下（<code>default_channels</code>）：</p>
<pre><code class="hljs lang-yaml"><span class="hljs-attr">default_channels:</span> <span class="hljs-comment"># 没有别名也不会自动把别名添加到URL后面，所以直接写channel的具体地址</span>
  <span class="hljs-bullet">-</span> <span class="hljs-string">https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main</span>
  <span class="hljs-bullet">-</span> <span class="hljs-string">https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r</span>
  <span class="hljs-bullet">-</span> <span class="hljs-string">https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2</span>
<span class="hljs-attr">custom_channels:</span> <span class="hljs-comment"># 使用时自动把别名添加到URL后面，所以只需写channel源的URL前缀</span>
  <span class="hljs-attr">conda-forge:</span> <span class="hljs-string">https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud</span>
  <span class="hljs-attr">pytorch:</span> <span class="hljs-string">https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud</span>
</code></pre>
<h2><a id="toc-0e1" class="anchor" href="#toc-0e1"></a>配置python镜像源</h2>
<p>上面说的都是conda源，但是python库有自己的源，也就是pip安装python包的pypi。</p>
<p>这个没什么乱七八糟特殊逻辑，直接配置就好。</p>
<ul>
<li>通过命令配置：<code>pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple</code></li>
<li>手动修改配置文件：修改<code>~/.config/pip/pip.conf</code>或<code>%APPDATA%\pip\pip.ini</code>，写入如下配置</li>
</ul>
<pre><code class="hljs lang-ini"><span class="hljs-section">[global]</span>
<span class="hljs-attr">index-url</span> = https://pypi.tuna.tsinghua.edu.cn/simple
</code></pre>
<h1><a id="pytorch" class="anchor" href="#pytorch"></a>pytorch</h1>
<p>先澄清一点，pytorch的名字就叫pytorch，但是它在pypi的名字叫torch（没有py前缀）。pytorch在conda的channel名，以及包名（包括pytorch和conda-forge这两个channel下的包）都叫pytorch。</p>
<p>pytorch主要有两种安装方式，分别是通过pip安装和通过conda安装。</p>
<h2><a id="toc-fb4" class="anchor" href="#toc-fb4"></a>通过pip安装</h2>
<p><a href="https://pytorch.org/">pytorch官网</a>给了非常详细的安装指引，根据平台、CPU/GPU版本的不同，给了不同的pip安装命令。</p>
<p><img src="https://debug.fanzheng.org/static/upload/20260420/upload_af8fb93c7480a4ea930fbef86f1bc3b8.png" alt="image.png"></p>
<p>例如：<code>pip3 install torch torchvision --index-url https://download.pytorch.org/whl/cu130</code>。其含义是以download.pytorch.org作为pip源进行安装。</p>
<p>需要使用pytorch自己的pip源安装的核心原因是，其在pypi同名同版本只能有一个包，这就导致只能发布CPU/GPU等多个版本中的一个。指定pip源的方式就可以解决这个问题，不同版本用不同的源地址即可。</p>
<p>但这样也有坏处，各个镜像站基本上都没有针对pytorch的pip源的镜像。</p>
<p>我们知道pypi一般是有镜像的，pytorch在pypi上的包也存在一些特殊处理：</p>
<ul>
<li>Linux: 包是GPU版本的pytorch，并且自带CUDA runtime。例如PyTorch 2.11用CUDA 13.0，PyTorch 2.10用CUDA 12.x。</li>
<li>Windows: 包是CPU版本的pytorch，当然也不会有CUDA runtime。</li>
</ul>
<p>通过pip安装的GPU版本的pytorch，CUDA runtime会安装在<code>miniforge3\envs\${ENV}\Lib\site-packages\torch\lib</code>。</p>
<blockquote>
<p>GPU版本的pytorch安装完后会看到类似于<code>2.11.0+cu130</code>的版本样式，尽管如此，也无法通过<code>pip install torch==2.11.0+cu130</code>这种方式通过pypi源安装，因为pypi源里就没有这种命名方式。</p>
</blockquote>
<p><strong>总结一下，如果是通过pip安装GPU版本的pytorch，Linux在pytorch官方源或pypi（含pypi镜像）均可，Windows只能通过pytorch官方源安装。</strong></p>
<h2><a id="toc-6df" class="anchor" href="#toc-6df"></a>通过conda安装</h2>
<p><strong>先说最建议的方式</strong>，就是从conda-forge这个channel中安装。</p>
<p>执行<code>conda install pytorch</code>即可安装，会识别显卡驱动自动决定是否安装GPU版。</p>
<blockquote>
<p>要确保是从conda-forge安装的pytorch，如果配置了其他channel，可以通过<code>conda install conda-forge::pytorch</code>显式指定。</p>
</blockquote>
<p>通过conda安装的GPU版本的pytorch，CUDA runtime会安装在<code>miniforge3\envs\${ENV}\Library\bin</code>。</p>
<p>如果想要强制指定安装GPU版本，可以安装<code>conda-forge::pytorch-gpu</code>，<code>pytorch-gpu</code>是个元包，作用就是强制安装pytorch的GPU版。</p>
<p><strong>再说一个广为流传但已经过时的安装方式</strong>，<code>conda install pytorch torchvision torchaudio pytorch-cuda=12.4 -c pytorch -c nvidia</code>，我们对它拆解一下：</p>
<ul>
<li><code>pytorch</code>、<code>torchvision</code>、<code>torchaudio</code>、<code>pytorch-cuda</code>这几个包都是<code>pytorch</code>这个channel下的包，<code>-c pytorch</code>的作用就是在<code>pytorch</code>这个channel里找这些包</li>
<li><code>pytorch-cuda</code>这个包是个元包，其为<code>nvidia</code>这个channel里CUDA runtime的合集，所以需要<code>-c nvidia</code>才能找到这些CUDA runtime文件才能装这个包，<code>pytorch-cuda=12.4</code>就是在指定安装的CUDA runtime版本</li>
<li><code>pytorch::pytorch</code>只包含pytorch，<code>conda install</code>时带上<code>-c nvidia</code>就会安装GPU版本的pytorch，但是不带CUDA runtime，需要通过<code>pytorch::pytorch-cuda</code>包安装CUDA runtime，最终形成上面那个完整的一条命令</li>
</ul>
<p>为什么说这个安装方式已经过时呢？因为conda的<a href="https://anaconda.org/channels/pytorch">pytorch这个channel</a>上的pytorch相关包早在24年10月底就不再更新（<a href="https://github.com/pytorch/pytorch/issues/138506">官方说明</a>），只在<a href="https://anaconda.org/channels/conda-forge/packages/pytorch/overview"><code>conda-forge</code></a>继续维护。最终版本锁定在了pytorch 2.5.1，python 3.12，cuda 12.4。不过这里说的是pytorch这个包，其他包可能仍在更新。</p>
<p><strong>总结一下，如果是通过conda安装，直接从<code>conda-forge</code>安装pytorch包即可，会自动识别决定是否安装GPU版。不要安装<code>pytorch</code>这个channel里的任何包。</strong></p>
<h2><a id="toc-ff2" class="anchor" href="#toc-ff2"></a>如何选择conda安装还是pip安装</h2>
<p>conda-forge里的pytorch版本没有pytorch官网（自己的pip源）更新快。</p>
<p><strong>因此，Linux系统上用哪个都可以；但Windows上考虑到是否有GPU版的镜像源的问题，优先考虑conda安装，如果对pytorch新版本有要求，就用pip走官方源安装。</strong></p>
<p><strong>无论选择哪种安装方式，都不需要去<a href="https://developer.nvidia.com/cuda-toolkit-archive">NVIDIA官网下载安装CUDA Toolkit</a>和<a href="https://developer.nvidia.com/cudnn-archive">cuDNN</a>！</strong></p>

            ]]></description>
            <pubDate>Wed, 15 Apr 2026 15:04:55 GMT</pubDate>
            <guid>https://debug.fanzheng.org/post/myth-of-python-and-pytorch.html</guid>
        </item>
        <item>
            <title>一波三折：频繁USB设备断开的IRQL_NOT_LESS_OR_EQUAL蓝屏问题分析与解决</title>
            <link>https://debug.fanzheng.org/post/pin-fan-USB-she-bao-duan-kai-de-IRQL_NOT_LESS_OR_EQUAL-lan-ping-wen-ti-fen-xi-yu-jie-jue.html</link>
            <description><![CDATA[
            <div class="toc"><ul>
<li><a href="#toc-a04">现象</a></li>
<li><a href="#toc-772">排查</a><ul>
<li><a href="#toc-3b9">怀疑主板问题</a></li>
<li><a href="#toc-c65">感觉不太对劲，不一定是主板的问题</a></li>
<li><a href="#toc-69f">先解决蓝屏问题</a></li>
<li><a href="#toc-c6d">为什么插前面板没问题</a></li>
</ul>
</li>
<li><a href="#toc-25f">总结</a></li>
</ul>
</div><h1><a id="toc-a04" class="anchor" href="#toc-a04"></a>现象</h1>
<p>在玩游戏的时候，电脑突然出现了一下USB设备断开的音效，紧接着就蓝屏了。再重启，刚进系统继续蓝屏。再重启，系统启动的主板LOGO转半天才进系统，然后就一直重复响USB设备断开的音效然后过一段时间蓝屏。</p>
<p>打开设备管理器，看到有个USB设备有黄色叹号，枚举了一下设备，确认是无线网卡。但是拔出后系统仍然有频繁USB弹出音效并会导致蓝屏。</p>
<h1><a id="toc-772" class="anchor" href="#toc-772"></a>排查</h1>
<h2><a id="toc-3b9" class="anchor" href="#toc-3b9"></a>怀疑主板问题</h2>
<p>把所有USB设备拔掉，测试了还是有USB弹出音效并蓝屏（后续回想了一下，这里我只把所有有线设备都拔掉了，只留下了一个鼠标的无线接收器）。</p>
<p>考虑到我的主板已经用了很久了，因此怀疑南桥芯片供电之类的不稳。并且第二天早上起床后拆机看了一眼，没有发现有电容鼓包的问题。</p>
<p>考虑到不想买到有暗病的主板，担心还要折腾，因此在最终京东寻觅并购买新主板。</p>
<h2><a id="toc-c65" class="anchor" href="#toc-c65"></a>感觉不太对劲，不一定是主板的问题</h2>
<p>我尝试把所有USB全拔了，发现这下就不USB弹出和蓝屏了。之前全拔的时候，我只把所有有线的拔了，就剩一个鼠标的接收器没拔，一是这个不拔不影响我拆机，二是觉得一个鼠标接收器能有啥问题。</p>
<p>结果情况就是：我把这个接收器插背板的其他USB口上，一样会USB断开然后蓝屏，试了好几个口，2.0 3.0 3.1的口都试了。但是我插到前面板上就没问题了。</p>
<h2><a id="toc-69f" class="anchor" href="#toc-69f"></a>先解决蓝屏问题</h2>
<p>我想到这次蓝屏每次都是一样的代码IRQL_NOT_LESS_OR_EQUAL，而且这次我其实没有去看蓝屏分析。我就把蓝屏dump文件拿去分析了一下，发现每次都是一个叫<code>PECKP_x64.SYS</code>的驱动文件导致的（签名企业是<code>Client Server International. Inc. Beijing Branch</code>）。</p>
<p><img src="https://debug.fanzheng.org/static/upload/20260314/upload_df4b90d63a53004e2aa11abb36ff9a14.png" alt="PixPin_2026-03-14_16-37-00.jpg"></p>
<p><img src="https://debug.fanzheng.org/static/upload/20260314/upload_da03eaf650ccd4589e217344e56ddb1c.png" alt="PixPin_2026-03-14_16-45-25.jpg"></p>
<p>然后我就去找，结果发现是个U盾的驱动，用来提供虚拟键盘能力的，估计是在USB这里做了一些操作。在频繁USB设备退出时可能有BUG，导致蓝屏。关键之前我已经把所有这种东西全卸载了，结果还有残留。</p>
<p>首先尝试使用ProcessExplorer搜索进程看看是哪个进程在占用该文件，结果没找到。于是在注册表的services中搜索，发现<code>计算机\HKEY_LOCAL_MACHINE\SYSTEM\Setup\FirstBoot\Services\PECKbdProtector</code>下有这个内核态服务，执行<code>sc qc PECKbdProtector</code>发现确实存在。</p>
<p>接着去安全模式下，执行<code>sc delete PECKbdProtector</code>删除服务，然后就可以正常删掉<code>PECKP_x64.SYS</code>文件了。</p>
<p>此时蓝屏问题已彻底解决。现在的情况是，只要鼠标插后面板，就会频繁USB设备退出，但绝对不会蓝屏了！</p>
<p>PS: 我还在系统中找了一下我安装的网银文件（中国银行和农行的），找到以下目录，全给删掉了：</p>
<pre><code class="hljs lang-undefined">&quot;C:\Windows\System32\drivers\PECKP_x64.SYS&quot;
&quot;C:\Windows\System32\CryptoKit.BOC.x64.dll&quot;
&quot;C:\Windows\SysWOW64\CryptoKit.BOC.x86.dll&quot;
&quot;C:\Windows\SysWOW64\BOCControl\CryptoKitHost.BOC.x86.exe&quot;
&quot;C:\Windows\SysWOW64\BOCControl\npCryptoKit.BOC.x86.exe&quot;
&quot;C:\Windows\SysWOW64\ES_BOCToken.x86.dll&quot;
&quot;C:\Windows\SysWOW64\FT_BOCToken.x86.dll&quot;
&quot;C:\Windows\SysWOW64\HB_BOCToken.x86.dll&quot;
&quot;C:\Windows\SysWOW64\TDR_BOCToken.x86.dll&quot;
&quot;C:\Windows\SysWOW64\WD_BOCToken.x86.dll&quot;

以及
&quot;C:\Program Files (x86)\ABC IBS Security Suite 2.3\PowerEnterABC_x64.ocx&quot;
</code></pre>
<p>以后只在虚拟机里用网银和装这些东西。</p>
<h2><a id="toc-c6d" class="anchor" href="#toc-c6d"></a>为什么插前面板没问题</h2>
<p>我联想到插前面板没问题，所以我又尝试了一下，用在后面板相同的口上，用USB延长线延长出来，再插接收器，结果一点问题没有！</p>
<p>问了下豆包，说有可能是2.4G频段干扰导致的：</p>
<p><img src="https://debug.fanzheng.org/static/upload/20260314/upload_ce2021f0738c77db130c955c7130879e.png" alt=""></p>
<p>确实有可能是干扰问题，但是之前也没遇到这个问题啊，也太神奇了。</p>
<p>WXC说，是不是隔壁整了个大功率2.4干扰仪，我无线网卡一直走的5G，所以没感觉到。确实不排除这种可能啊！</p>
<h1><a id="toc-25f" class="anchor" href="#toc-25f"></a>总结</h1>
<p>本次蓝屏，为鼠标USB无线接收器频繁断开，诱发了系统中残留的U盾驱动的BUG导致。至于鼠标USB无线接收器频繁断开，可能是接收器自身体质有问题，在受到了一些扰动时会触发USB断开。这种扰动可能是外界的（例如2.4G频段干扰），也可能来自机箱内部。</p>
<p>具体原因目前仍不得而知，但USB接收器大概率是有问题的。结合我<a href="https://debug.fanzheng.org/post/solve-the-problem-of-IRQL_NOT_LESS_OR_EQUAL-blue-screen-caused-by-Razer-mouse-driver.html">之前经历的蓝屏问题</a>，可以更加确信这一点。当时的蓝屏肯定也是因为这个U盾驱动导致的，但是USB接收器插在底座上应该也是会触发USB断开，跟这两天遇到的这个问题估计是一样的，接收器大概率有问题。</p>
<blockquote>
<p>2026-03-15 16:43:51 UPDATE：现在鼠标接收器插前面板也会出现USB断开的情况了，基本实锤确实是鼠标的问题。</p>
</blockquote>
<blockquote>
<p>2026-03-15 23:25:33 UPDATE：去雷蛇官网查了一下，它在<a href="https://mysupport-chsi.razer.com/app/answers/detail/a_id/11254">2023.12.22有个固件更新（1.06-&gt;1.07）</a>，下载更新程序把鼠标和接收器的固件都更新一下，用了一个小时，不再有任何USB断开的情况出现。</p>
<p><img src="https://debug.fanzheng.org/static/upload/20260315/upload_75b42075ee629360b8694d18f53f037d.png" alt="PixPin_2026-03-15_21-45-04.jpg"></p>
</blockquote>
<blockquote>
<p>2026-03-16 23:32:41 UPDATE：又出现一样的情况了，感觉必须得换鼠标了。</p>
</blockquote>
<blockquote>
<p>2026-03-18 22:46:09 UPDATE：找客服提供了另一个方案，“另外您也可以尝试重新配对接收器：您可以使用配对实用程序v1.00.06_r1：<a href="https://rzr.to/34dvl2">https://rzr.to/34dvl2</a>”。再试一下看看。</p>
</blockquote>

            ]]></description>
            <pubDate>Sat, 14 Mar 2026 14:59:20 GMT</pubDate>
            <guid>https://debug.fanzheng.org/post/pin-fan-USB-she-bao-duan-kai-de-IRQL_NOT_LESS_OR_EQUAL-lan-ping-wen-ti-fen-xi-yu-jie-jue.html</guid>
        </item>
        <item>
            <title>更新中银e盾安全证书</title>
            <link>https://debug.fanzheng.org/post/geng-xin-zhong-yin-e-dun-an-quan-zheng-shu.html</link>
            <description><![CDATA[
            <div class="toc"></div><p>一直以来，其他银行的U盾/K宝之类的产品，我在更新证书时基本没有问题，但是近期中国银行的e盾证书快到期了，想自助更新证书遇到的问题。</p>
<p>进入中国银行网银登录界面，旁边有个<a href="https://bocnetca.boc.cn/certself/index.jsp">CA证书下载和更新 </a>的入口，点击进去之后按<a href="https://www.boc.cn/ebanking/service/cs1/201107/t20110705_1441889.html">操作说明</a>中的要求，安装证书更新控件，一开始在Win10+Edge的IE兼容模式尝试发现页面根本点不进去。然后又试了在Win7中+IE8算是成功进入了系统，在输入了USBKey序列号、姓名、身份证号，点击更新证书按钮时，报错证书库中没有可用的证书。</p>
<p><img src="https://debug.fanzheng.org/static/upload/20260306/upload_8ad18cd10ca2b100006660ce29ecd7ab.png" alt="PixPin_2026-03-06_00-07-08.jpg"></p>
<p>在中国银行APP中问客服，智能客服也回答需要去线下网点才能更新。但这个明显不合理也不科学，其他银行都可以，而且这玩意一堆公司的财务日常都要用，不可能每次证书过期都到银行去处理。</p>
<p>偶然发现中国银行还有个<a href="https://netc1.igtb.bankofchina.com/#/login-page">企业登录的入口</a>，点进去之后看到页面上提示登录时请先下载安装网银助手，果断下载之后就找到更新证书的入口了。不过这里我第一次点击更新证书的时候提示失败了，又重新尝试了一次才成功。</p>
<p><img src="https://debug.fanzheng.org/static/upload/20260306/upload_8a964cd51299b8c0f59646a2812786b3.png" alt="PixPin_2026-03-06_09-55-54.jpg"></p>

            ]]></description>
            <pubDate>Fri, 06 Mar 2026 15:01:34 GMT</pubDate>
            <guid>https://debug.fanzheng.org/post/geng-xin-zhong-yin-e-dun-an-quan-zheng-shu.html</guid>
        </item>
        <item>
            <title>易美逊G28U9显示器维修</title>
            <link>https://debug.fanzheng.org/post/yi-mei-xun-G28U9-xian-shi-qi-wei-xiu.html</link>
            <description><![CDATA[
            <div class="toc"><ul>
<li><a href="#toc-8a1">故障现象</a></li>
<li><a href="#toc-f30">寻找解决方案</a></li>
<li><a href="#toc-324">维修</a></li>
<li><a href="#toc-309">想到一个问题</a></li>
</ul>
</div><h1><a id="toc-8a1" class="anchor" href="#toc-8a1"></a>故障现象</h1>
<p>我的显示器突然无法使用，具体表现是按下开关后，电源LED灯一亮一灭（间隔0.几秒）。</p>
<p>我的易美逊G28U9显示器，是AOC U28G2X/D的马甲型号，当时买这个易美逊也是比AOC的便宜1000块，而且看起来两款没什么区别（事实上也确实基本没什么区别），这次坏掉感觉也是纯属意外。</p>
<h1><a id="toc-f30" class="anchor" href="#toc-f30"></a>寻找解决方案</h1>
<p>本来是想拿到中关村科贸电子城送店维修，闲鱼上搜了下没找到修台式机显示器的商家，只找到修笔记本液晶屏的商家。搜到一家稍微远了一些，要价300。最坑的是官方售后（就是AOC的售后），不仅远（北清路），态度还巨差，无论怎么问都不说大概要多少钱（事实上只要面板没坏，维修成本大差不差），一口咬定必须来了之后检测才知道，这不明摆着坑人吗！</p>
<p>于是搜了一下，发现显示器核心就三个部件——电源板、驱动板、面板。电源板就是电源适配器，如果是外置电源适配器，显示器上直接是直流DC口的，那就没有这个部件。驱动板是提供DP/HDMI接口，与面板连接解码数字信号后驱动面板显示的。面板就是用来显示的屏幕了。</p>
<p>抖音和B站上有很多显示器维修的视频，大多数都是电源板坏了导致的。在<a href="https://www.bilibili.com/video/BV1sy4y1W7QM/">B站上找到一个视频</a>，跟我的现象一模一样，他就是电源板上有个电容鼓包了。</p>
<p>思考了一下立刻决定自己拆开看看情况，看看自己能不能直接给修了。</p>
<p><img src="https://debug.fanzheng.org/static/upload/20260124/upload_7a442e303731f2efa32a091cbc0af302.png" alt="PixPin_2026-01-24_16-37-48.jpg"></p>
<h1><a id="toc-324" class="anchor" href="#toc-324"></a>维修</h1>
<p>拆开后发现，果然是电源板上的一个35V 1000uF电容鼓包了。电源板型号是<code>715GB018-P01-001-001S</code>，与AOC 28G2 U28G2U U28P2U U28G2X等型号用的是一个电源板。</p>
<p><img src="https://debug.fanzheng.org/static/upload/20260124/upload_5b3ae53e032cb8ae1d8cbc68df871545.png" alt="PixPin_2026-01-24_16-44-09.jpg"></p>
<p><img src="https://debug.fanzheng.org/static/upload/20260124/upload_86c2f018f0c3659697e08341f5bb4616.png" alt="image.png"></p>
<blockquote>
<p>[!CAUTION]
注意，即使显示器不插电，由于有大容量电容的存在，电源板上依然会有高压电存在，需要注意安全。我的显示器电源板上就有一颗450V 68uF的大电容，在静置一天的情况下用万用表测依然有200V的电压。需要先将万用表调至大电阻欧姆档，对所有电容进行放电后再操作。</p>
</blockquote>
<p>于是淘宝买了个艾华的电容焊上去，问题解决！总共花了5块钱（运费3块，电容买了5个，0.4元一个），大概5个小时。其中最难的地方在于把显示器拆开，需要有耐心慢慢撬开。</p>
<p><img src="https://debug.fanzheng.org/static/upload/20260124/upload_90a4ba2941e72117537d0591fe4a6a43.png" alt="image.png"></p>
<p><img src="https://debug.fanzheng.org/static/upload/20260124/upload_de23ef0529ec310ca8d33e80bdb2f39b.png" alt="image.png"></p>
<h1><a id="toc-309" class="anchor" href="#toc-309"></a>想到一个问题</h1>
<p>小时候家里的三星CCFL LCD显示器也坏过，我在<a href="https://www.bilibili.com/video/BV1Qv411171W/">B站上看到了个视频</a>，里面显示器跟那个一模一样，故障现象也一模一样，结果就是个开关坏了，维修成本最多5块钱，我是真晕了。</p>

            ]]></description>
            <pubDate>Sat, 24 Jan 2026 08:22:43 GMT</pubDate>
            <guid>https://debug.fanzheng.org/post/yi-mei-xun-G28U9-xian-shi-qi-wei-xiu.html</guid>
        </item>
        <item>
            <title>技嘉B450 AORUS M主板安装EC FW Update Tool后卡logo界面</title>
            <link>https://debug.fanzheng.org/post/ji-jia-B450 AORUS M-zhu-ban-an-zhuang-EC FW Update Tool-hou-ka-logo-jie-mian.html</link>
            <description><![CDATA[
            <div class="toc"></div><p>继上次<a href="https://debug.fanzheng.org/post/yi-ge-kun-rao-yi-jiu-de-nei-cun-xiang-guan-de-lan-ping-wen-ti-%EF%BC%8C-zui-kui-huo-shou-ju-ran-shi-yuan-shen.html">找到频繁蓝屏的原因</a>后，最近虽然不频繁蓝屏了，但是仍然偶现蓝屏。能用的方法全用上了，最近想更新一下BIOS再试试。</p>
<p>在<a href="https://www.gigabyte.cn/Motherboard/B450-AORUS-M-rev-1x/support#support-dl-bios">B450 AORUS M (rev. 1.x)</a>页面，有写“更新BIOS F40之前, 請務必先安裝EC FW Update Tool (B19.0517.1或更新版本)以避免第三代AMD Ryzen™處理器導致的4根DDR記憶體相容性”，虽然我的BIOS版本比F40高，但是想着反正装一下装一下，反正也没影响。</p>
<p>结果装完后过了一会直接给我关机了，再开机就在滴的一声之后就卡在AORUS的logo界面了，也进不去BIOS。跟我<a href="https://debug.fanzheng.org/post/ji-jia-B450%20AORUS%20M-zhu-ban-sheng-ji-BIOS-hou-gu-zhang-chu-li.html">上次BIOS刷失败的表现</a>一模一样。</p>
<p>我就以为也是BIOS被重置到F1了，去中关村花了67大洋买了块Ryzen 5 1400。回来装上去之后能正常进系统了，进BIOS一看BIOS版本没变，并没有重置回F1。然后我又装了一下这个ECFwUpdate，结果重置后又卡logo了，这明显不合理。我就感觉是只需要重置一下BIOS设置就行了，根本不用更换F1版本支持的CPU。</p>
<p>于是直接把CPU换回我的3900X，由于更换CPU会自动重置BIOS，所以这次直接顺利进入系统了。所以确实是只需重置BIOS即可。</p>
<p>好在问题是解决了，而且这次顺利把BIOS从之前去技嘉售后装的F64升级到F67。后续再持续观察一下。</p>
<p><img src="https://debug.fanzheng.org/static/upload/20251220/upload_dac6be07d308fa4138e78285ded414a4.png" alt="PixPin_2025-12-20_14-54-52.jpg"></p>
<blockquote>
<p>2026-01-08 UPDATE：蓝屏问题还是没解决，决定把内存XMP关掉（从3000改成2400）再观察一下看看。</p>
</blockquote>

            ]]></description>
            <pubDate>Sat, 20 Dec 2025 05:35:57 GMT</pubDate>
            <guid>https://debug.fanzheng.org/post/ji-jia-B450 AORUS M-zhu-ban-an-zhuang-EC FW Update Tool-hou-ka-logo-jie-mian.html</guid>
        </item>
        <item>
            <title>一个困扰已久的内存相关的蓝屏问题，罪魁祸首居然是原神</title>
            <link>https://debug.fanzheng.org/post/yi-ge-kun-rao-yi-jiu-de-nei-cun-xiang-guan-de-lan-ping-wen-ti-，-zui-kui-huo-shou-ju-ran-shi-yuan-shen.html</link>
            <description><![CDATA[
            <div class="toc"><ul>
<li><a href="#toc-8e1">背景</a></li>
<li><a href="#toc-8d2">现象与初期分析</a></li>
<li><a href="#toc-9e2">初期尝试的解决方案</a></li>
<li><a href="#toc-8a5">某一天的发现</a></li>
<li><a href="#toc-520">问题解决</a></li>
<li><a href="#toc-28b">我的猜测</a></li>
</ul>
</div><h1><a id="toc-8e1" class="anchor" href="#toc-8e1"></a>背景</h1>
<p>近一年，我的电脑频繁出现蓝屏现象。蓝屏代码有很多种，PROCESS_NAME也很随机，一直没有找到原因。</p>
<h1><a id="toc-8d2" class="anchor" href="#toc-8d2"></a>现象与初期分析</h1>
<p>通过对minidump文件用WinDbg进行分析，蓝屏代码主要有以下这些：</p>
<pre><code class="hljs lang-undefined">MEMORY_MANAGEMENT (1a)
ATTEMPTED_EXECUTE_OF_NOEXECUTE_MEMORY (fc)
PFN_LIST_CORRUPT (4e)
PAGE_FAULT_IN_NONPAGED_AREA (50)
IRQL_NOT_LESS_OR_EQUAL (a)
CRITICAL_PROCESS_DIED (ef)
</code></pre>
<p>PROCESS_NAME也不固定，列举近期发生的几次蓝屏的PROCESS_NAME如下：</p>
<pre><code class="hljs lang-undefined">csrss.exe
svchost.exe
WeixinUpdate.e
chrome.exe
YuanShen.exe
System
</code></pre>
<p>从蓝屏代码上看，问题大多指向内存：要么页表本身PTE/PFN问题，要么访存相关（非分页内存、执行非可执行内存、中断访问无效内存）问题。</p>
<h1><a id="toc-9e2" class="anchor" href="#toc-9e2"></a>初期尝试的解决方案</h1>
<p>一度尝试过各种各样的解决方案。包括但不限于：</p>
<ul>
<li>修复系统完整性：<code>DISM.exe /Online /Cleanup-image /Restorehealth</code> &amp; <code>sfc /scannow</code></li>
<li>虚拟内存调整：由于安装了多块磁盘，怀疑某块磁盘有问题，影响虚拟内存，于是更换虚拟内存所在位置</li>
<li>内存条清理：重新插拔内存条并清理金手指</li>
<li>重新安装 &amp; 更新显卡驱动</li>
</ul>
<p>但都不解决问题。</p>
<blockquote>
<p>更新显卡驱动还有个小插曲，我台式机最早装的511.65 NVIDIA驱动。更新到581.80后，由于一些原因（下面会讲）打算卸载重装。我在控制面板卸载NVIDIA驱动程序后，重启发现显卡驱动居然还在，一看版本是560.94，十分奇怪。最后没有想到是Windows Update给我装的，这玩意居然卸载新装的驱动后能自动给我恢复到Windows Update装的版本，也是挺神奇的。</p>
</blockquote>
<p><img src="https://debug.fanzheng.org/static/upload/20251113/upload_8f489e39fde130ca53389739099e397f.png" alt="PixPin_2025-11-13_13-58-04.png"></p>
<p><img src="https://debug.fanzheng.org/static/upload/20251113/upload_fbe9223a28b16314964f59483d737c38.png" alt="PixPin_2025-11-13_13-58-46.png"></p>
<p><img src="https://debug.fanzheng.org/static/upload/20251113/upload_893fe268a037412d76531887c37e4732.png" alt="K6RC7Q6N7JYRRH6J667XUQ.png"></p>
<h1><a id="toc-8a5" class="anchor" href="#toc-8a5"></a>某一天的发现</h1>
<p>昨天又一次蓝屏了，于是照常进行minidump分析，发现这次PROCESS_NAME发生在原神上。</p>
<p><img src="https://debug.fanzheng.org/static/upload/20251113/upload_b2457c1a7319f7a24a26f9fc32ee64d0.png" alt="TM8PGUNTHLY9E4SAXP88BW7.jpg"></p>
<p>我一开始还不觉得是原神的问题，心想就是一个普通游戏怎么还会产生蓝屏的呢。于是发到群里，WXC说“一开原神就报错就好办多了啊”，让我看下原神报错。这上哪去看原神的报错呢？而且我还是不太相信是原神导致的。于是我又试了一下，结果打开原神又蓝屏了。这下我开始相信了。</p>
<p>回想之前的蓝屏经历，确实很多时候都是打开原神时触发的，只是我没有把蓝屏跟原神联系在一起。</p>
<p>接着WXC给我发来一个米游社的<a href="https://www.miyoushe.com/bh3/article/38367958">帖子</a>，里面说<code>HoYoKProtect.sys驱动在开启了“内核模式硬件强制堆栈保护”功能的电脑上会触发蓝屏</code>。</p>
<p>虽然我的CPU并不具备该功能，也就是说这个问题与我的情况无关，但是原神侵入式地在系统里安装了驱动这一发现，联系上之前我的两次严重的蓝屏问题（<a href="https://debug.fanzheng.org/post/144-LiveKernelEvent-and-1000007e-blue-screen.html">144 LiveKernelEvent / 1000007e BlueScreen 蓝屏问题解决</a> &amp; <a href="https://debug.fanzheng.org/post/solve-the-problem-of-IRQL_NOT_LESS_OR_EQUAL-blue-screen-caused-by-Razer-mouse-driver.html">解决雷蛇鼠标驱动导致IRQL_NOT_LESS_OR_EQUAL蓝屏问题</a>，尤其是前者，是完美世界反作弊程序导致的蓝屏），让我更加确信蓝屏与原神关系很大。而且.sys文件的存在，使得蓝屏也可能会在未运行原神时发生（只是有这种可能）。</p>
<p>检索了一下<code>HoYoKProtect.sys</code>相关内容，找到reddit上的两个帖子（<a href="https://www.reddit.com/r/Genshin_Impact/comments/12rmnz2/genshin_and_windows_security_bsod_warning/">帖子1</a>、<a href="https://www.reddit.com/r/Genshin_Impact/comments/1c3ensa/genshin_causing_bsod_help/?tl=zh-hans">帖子2</a>），看起来这一问题并不是个案。</p>
<blockquote>
<p>这里我在研究过程中还发生了一件很奇怪的事情。上文提到我由于一些原因想要卸载新安装的581.80 NVIDIA显卡驱动，这是因为发生了一件事情。我在安装581.80完后，想要关闭掉系统托盘图标，关闭后，在打开米哈游启动器的一瞬间图标又回来了，并且稳定触发。我一度怀疑是NVIDIA控制面板有问题。想重启下再看看有没有问题，结果重启的过程中蓝屏了。重启后，NVIDIA控制面板中的系统托盘图标开关就再也点不动了。于是不得已才卸载驱动想要重新安装。这里面，我也不是很理解为什么NVIDIA驱动跟米哈游启动器会产生联系。</p>
</blockquote>
<h1><a id="toc-520" class="anchor" href="#toc-520"></a>问题解决</h1>
<p>最近一段时间没有打开米哈游启动器和原神，确实没有再发生蓝屏了。后续再持续观察一下。</p>
<blockquote>
<p>2025-12-20 UPDATE: 近期仍然偶现蓝屏，但出现频率低了很多，不像之前在启动原神时高概率蓝屏，持续观察想办法解决中。</p>
</blockquote>
<h1><a id="toc-28b" class="anchor" href="#toc-28b"></a>我的猜测</h1>
<p>这个问题不一定就是<code>HoYoKProtect.sys</code>导致的，毕竟它是有微软签名的。但是它确实很有可能跟其他驱动或程序产生冲突，例如显卡驱动，于是最终导致了蓝屏。但无论如何，肯定跟它脱不了干系。</p>

            ]]></description>
            <pubDate>Fri, 28 Nov 2025 11:39:16 GMT</pubDate>
            <guid>https://debug.fanzheng.org/post/yi-ge-kun-rao-yi-jiu-de-nei-cun-xiang-guan-de-lan-ping-wen-ti-，-zui-kui-huo-shou-ju-ran-shi-yuan-shen.html</guid>
        </item>
        <item>
            <title>SSH报错Load key &quot;~/.ssh/id_rsa&quot;: error in libcrypto</title>
            <link>https://debug.fanzheng.org/post/SSH-bao-cuo-Load-key-error-in-libcrypto.html</link>
            <description><![CDATA[
            <div class="toc"></div><p>今天在一个机器上SSH时遇到报错<code>Load key &quot;/root/.ssh/id_rsa&quot;: error in libcrypto</code>。查了半天，各种方法都试过了，包括检查和更新openssh、libcrypto版本等，都不解决问题。</p>
<p>一次偶然测试发现，如果我是cat写入的<code>~/.ssh/id_rsa</code>私钥文件，就没这个问题。于是我通过<code>cat -v</code>打出来含隐藏字符的原先的私钥文件，发现里面的换行符使用的是Windows的<code>CRLF</code>(<code>\r\n</code>)。SSH不识别，所以报错。</p>
<p>出现这个问题的具体原因是，我的密钥文件是通过网页提交到DB中的，然后读DB把密钥写了出来。如果我是在Windows系统中通过网页提交，会自动把换行符以<code>CRLF</code>的形式写入DB中，而且是看不出来换行符是什么的。这个问题非常隐蔽，确实很难发现。</p>

            ]]></description>
            <pubDate>Tue, 16 Sep 2025 02:21:13 GMT</pubDate>
            <guid>https://debug.fanzheng.org/post/SSH-bao-cuo-Load-key-error-in-libcrypto.html</guid>
        </item>
        <item>
            <title>VSCode的Ctrl+F2快捷键不生效，被无畏契约登录器占用</title>
            <link>https://debug.fanzheng.org/post/VSCode-de-Ctrl+F2-kuai-jie-jian-bu-sheng-xiao-，-bei-wu-wei-qi-yue-deng-lu-qi-zhan-yong.html</link>
            <description><![CDATA[
            <div class="toc"></div><p>最近我用VSCode的Ctrl+F2快捷键一直没反应，无法实现批量选中。使用OpenArk排查后发现，是无畏契约登录器的无畏时刻的手动截图功能，占用了Ctrl+F2快捷键。同理还有F7、Alt+X。这个快捷键还没法直接删掉，只能修改成别的。修改后恢复了。</p>
<p><img src="https://debug.fanzheng.org/static/upload/20250901/upload_0695006c3b68632c283974546938e5fd.png" alt="PixPin_2025-09-01_20-09-17.jpg"></p>

            ]]></description>
            <pubDate>Mon, 01 Sep 2025 13:28:21 GMT</pubDate>
            <guid>https://debug.fanzheng.org/post/VSCode-de-Ctrl+F2-kuai-jie-jian-bu-sheng-xiao-，-bei-wu-wei-qi-yue-deng-lu-qi-zhan-yong.html</guid>
        </item>
        <item>
            <title>Steam更新游戏提示磁盘写入错误</title>
            <link>https://debug.fanzheng.org/post/Steam-geng-xin-you-xi-ti-shi-ci-pan-xie-ru-cuo-wu.html</link>
            <description><![CDATA[
            <div class="toc"></div><p>在更新CS2的时候提示磁盘写入错误。试了各种验证完整性、修复Steam库、用管理员身份启动Steam等方法还是不行，最终找到一个方案是，在任务栏右下角Steam图标右键，强行启动要更新的游戏，会弹出来一个框，提示出具体写入失败的文件是什么，如图：</p>
<p><img src="https://debug.fanzheng.org/static/upload/20250816/upload_5ec6cceb5bbb2131397c9cc11fb06044.png" alt="PixPin_2025-08-15_23-50-27.jpg"></p>
<p>通常来说就是权限问题、磁盘损坏等问题。对我来说，我发现CS2的appmanifest文件权限被改成只读了，我手动把只读权限去掉就好了：</p>
<p><img src="https://debug.fanzheng.org/static/upload/20250816/upload_ae88616b753ab50168881ec5c92ef67f.png" alt="PixPin_2025-08-15_23-53-09.jpg"></p>
<p>但是不知道为什么会被改成只读，很不合理。</p>

            ]]></description>
            <pubDate>Sat, 16 Aug 2025 02:12:47 GMT</pubDate>
            <guid>https://debug.fanzheng.org/post/Steam-geng-xin-you-xi-ti-shi-ci-pan-xie-ru-cuo-wu.html</guid>
        </item>
    </channel>
</rss>
