当前位置: 首页 > news >正文

RAS--APEI 报错解析流程(2)

RAS--APEI 报错解析流程(1)

除了APEI 中除了GHES会记录错误,在Post过程中的错误通常是通过BERT Table汇报

 

1.BERT

Boot Error Record Table is used to report unhandled errors that occurred in a previous boot,it is reported as a ‘one-time polled’type error source.

Bert 用于记录post 过程中产生的 error 以及UCE hang 重启 BIOS 错误状态未进行清除在下次重启扫描出的error

具体结构如图所示:

使用BERT 的header  通过section type 区分错误类型 对应到不同的错误结构 都是通过block error status addrss 链接

内存 pcie cpu的错误汇报信息结构体

 

 

使用IASL 解析BERT table:

BIOS 在Post 过程中去扫描pcie error 内存 error  CPU error

NBIOErrorDetection 检测到错误 addbert ->GENERIC_PCIE_AER_ERR_ENTRY

MCAErrorDetection 检测到MCA Bank UMC 错误  addbert ->GENERIC_MEM_ERR_ENTRY

MCAErrorDetection 检测到MCA Bank PIE  错误  addbert ->GENERIC_PRO_ERR_ENTRY

CPU BERT OS 解析

内存OS 解析

PCIE OS 解析

 

Post过程中检测到多个BERT :有内存和CPU bank 的错误状态

BIOS 日志:两个MCA Bank 读取到错误MCA_Status

 

BERT Table: BIOS 汇报和OS 解析通过Boot Error Region Address 联系

 

Boot Error Region Address 对应到结构体

///

/// Generic Error Status Definition

///

typedef struct {

  EFI_ACPI_6_2_ERROR_BLOCK_STATUS    BlockStatus;

  UINT32                             RawDataOffset;

  UINT32                             RawDataLength;

  UINT32                             DataLength;

  UINT32                             ErrorSeverity;

} EFI_ACPI_6_2_GENERIC_ERROR_STATUS_STRUCTURE;

 

对于OS去打印HardWare error 只需要参考GHES 中的Error Block status 就会去打印 错误的GHES Table中的错误信息

typedef struct {

  UINT32    UncorrectableErrorValid     : 1;

  UINT32    CorrectableErrorValid       : 1;

  UINT32    MultipleUncorrectableErrors : 1;

  UINT32    MultipleCorrectableErrors   : 1;

  UINT32    ErrorDataEntryCount         : 10;

  UINT32    Reserved                    : 18;

} EFI_ACPI_6_2_ERROR_BLOCK_STATUS;

也就是当扫描到BlockStatus 存在错误状态 OS就会上报Hardware error  然后清除错误状态

后面接着结构体,后面的结构体会根据SectionType 接着内存/CPU/PCIE 的结构体

typedef struct {

  UINT8     SectionType[16];

  UINT32    ErrorSeverity;

  UINT16    Revision;

  UINT8     ValidationBits;

  UINT8     Flags;

  UINT32    ErrorDataLength;

  UINT8     FruId[16];

  UINT8     FruText[20];

  UINT8     Timestamp[8];

} EFI_ACPI_6_2_GENERIC_ERROR_DATA_ENTRY_STRUCTURE;

 

/*

 * Section type definitions, used in section_type field in struct

 * cper_section_descriptor

 *

 * Processor Generic

 */

#define CPER_SEC_PROC_GENERIC                       \

    GUID_INIT(0x9876CCAD, 0x47B4, 0x4bdb, 0xB6, 0x5E, 0x16, 0xF1,   \

          0x93, 0xC4, 0xF3, 0xDB)

/* Processor Specific: X86/X86_64 */

#define CPER_SEC_PROC_IA                        \

    GUID_INIT(0xDC3EA0B0, 0xA144, 0x4797, 0xB9, 0x5B, 0x53, 0xFA,   \

          0x24, 0x2B, 0x6E, 0x1D)

/* Processor Specific: IA64 */

#define CPER_SEC_PROC_IPF                       \

    GUID_INIT(0xE429FAF1, 0x3CB7, 0x11D4, 0x0B, 0xCA, 0x07, 0x00,   \

          0x80, 0xC7, 0x3C, 0x88, 0x81)

/* Processor Specific: ARM */

#define CPER_SEC_PROC_ARM                       \

    GUID_INIT(0xE19E3D16, 0xBC11, 0x11E4, 0x9C, 0xAA, 0xC2, 0x05,   \

          0x1D, 0x5D, 0x46, 0xB0)

/* Platform Memory */

#define CPER_SEC_PLATFORM_MEM                       \

    GUID_INIT(0xA5BC1114, 0x6F64, 0x4EDE, 0xB8, 0x63, 0x3E, 0x83,   \

          0xED, 0x7C, 0x83, 0xB1)

#define CPER_SEC_PCIE                           \

    GUID_INIT(0xD995E954, 0xBBC1, 0x430F, 0xAD, 0x91, 0xB4, 0x4D,   \

          0xCB, 0x3C, 0x6F, 0x35)

/* Firmware Error Record Reference */

Section Type=CPER_SEC_PROC_GENERIC 对应到 CPU 的错误结构体

 

 

对于GHES 的错误OS需要使用定时器,BERT 只需要在Kernel 加载时跑一边即可。

OS 下错误解析  ghes.c bert.c  cper.c

GHES 驱动:

static struct platform_driver ghes_platform_driver = {

    .driver     = {

        .name   = "GHES",

    },

    .probe      = ghes_probe,

    .remove     = ghes_remove,

};

ghes_init 加载GHES的驱动 ,系统下的解析策略和Notify 的结构体相关联,BIOS中会设置Notify Type ,Pollinterval

系统下扫描GHES 的驱动 是通过定时器周期性去扫描错误状态,Pollinterval 是定时器的参考时间

 

    switch (generic->notify.type) {

    case ACPI_HEST_NOTIFY_POLLED:

    case ACPI_HEST_NOTIFY_EXTERNAL:

    case ACPI_HEST_NOTIFY_SCI:

    case ACPI_HEST_NOTIFY_GSIV:

    case ACPI_HEST_NOTIFY_GPIO:

        break;

    case ACPI_HEST_NOTIFY_SEA:

        if (!IS_ENABLED(CONFIG_ACPI_APEI_SEA)) {

            pr_warn(GHES_PFX "Generic hardware error source: %d notified via SEA is not supported\n",

                generic->header.source_id);

            rc = -ENOTSUPP;

            goto err;

        }

        break;

    case ACPI_HEST_NOTIFY_NMI:

        if (!IS_ENABLED(CONFIG_HAVE_ACPI_APEI_NMI)) {

            pr_warn(GHES_PFX "Generic hardware error source: %d notified via NMI interrupt is not supported!\n",

                generic->header.source_id);

            goto err;

        }

        break;

    case ACPI_HEST_NOTIFY_LOCAL:

        pr_warning(GHES_PFX "Generic hardware error source: %d notified via local interrupt is not supported!\n",

               generic->header.source_id);

        goto err;

 

 

timer_setup(&ghes->timer, ghes_poll_func, TIMER_DEFERRABLE);

ghes_proc(ghes);

    ghes_read_estatus(ghes, 0);//-->apei_read(&buf_paddr, &g->error_status_address);

    ghes_print_estatus

    cper_estatus_print(pfx_seq, estatus);

 

 

这就对应到Dmesg 中的HardWare error 错误,就可以识别到错误的source id ,既可以大致定位错误信息来源 Source id = 512 对应到PCIE 错误

后续通过Section error type 定位到更加详细的信息

前面的信息都是来自于固定结构体

///

/// Generic Error Data Entry Definition

///

typedef struct {

  UINT8     SectionType[16];

  UINT32    ErrorSeverity;

  UINT16    Revision;

  UINT8     ValidationBits;

  UINT8     Flags;

  UINT32    ErrorDataLength;

  UINT8     FruId[16];

  UINT8     FruText[20];

  UINT8     Timestamp[8];

} EFI_ACPI_6_2_GENERIC_ERROR_DATA_ENTRY_STRUCTURE;

static void

cper_estatus_print_section(const char *pfx, struct acpi_hest_generic_data *gdata,

               int sec_no)

{

    guid_t *sec_type = (guid_t *)gdata->section_type;

    __u16 severity;

    char newpfx[64];

    if (acpi_hest_get_version(gdata) >= 3)

        cper_print_tstamp(pfx, (struct acpi_hest_generic_data_v300 *)gdata);

    severity = gdata->error_severity;

    printk("%s""Error %d, type: %s\n", pfx, sec_no,

           cper_severity_str(severity));

    if (gdata->validation_bits & CPER_SEC_VALID_FRU_ID)

        printk("%s""fru_id: %pUl\n", pfx, gdata->fru_id);

    if (gdata->validation_bits & CPER_SEC_VALID_FRU_TEXT)

        printk("%s""fru_text: %.20s\n", pfx, gdata->fru_text);

}

 

对于后续的结构体包括内存PCIE CPU 有着不同的结构体主要包括三个函数打印错误信息,通过匹配Section type Guid 判断

  cper_print_proc_generic(); cper_print_mem(); cper_print_pcie()

if (guid_equal(sec_type, &CPER_SEC_PROC_GENERIC)) {

        struct cper_sec_proc_generic *proc_err = acpi_hest_get_payload(gdata);

        printk("%s""section_type: general processor error\n", newpfx);

        if (gdata->error_data_length >= sizeof(*proc_err))

            cper_print_proc_generic(newpfx, proc_err);

        else

            goto err_section_too_small;

    } else if (guid_equal(sec_type, &CPER_SEC_PLATFORM_MEM)) {

        struct cper_sec_mem_err *mem_err = acpi_hest_get_payload(gdata);

        printk("%s""section_type: memory error\n", newpfx);

        if (gdata->error_data_length >=

            sizeof(struct cper_sec_mem_err_old))

            cper_print_mem(newpfx, mem_err,

                       gdata->error_data_length);

        else

            goto err_section_too_small;

    } else if (guid_equal(sec_type, &CPER_SEC_PCIE)) {

        struct cper_sec_pcie *pcie = acpi_hest_get_payload(gdata);

        printk("%s""section_type: PCIe error\n", newpfx);

        if (gdata->error_data_length >= sizeof(*pcie))

            cper_print_pcie(newpfx, pcie, gdata);

        else

            goto err_section_too_small;

#if defined(CONFIG_ARM64) || defined(CONFIG_ARM)

    } else if (guid_equal(sec_type, &CPER_SEC_PROC_ARM)) {

        struct cper_sec_proc_arm *arm_err = acpi_hest_get_payload(gdata);

        printk("%ssection_type: ARM processor error\n", newpfx);

        if (gdata->error_data_length >= sizeof(*arm_err))

            cper_print_proc_arm(newpfx, arm_err);

        else

            goto err_section_too_small;

 

CPU错误信息结构体:

typedef struct _PLATFORM_PROC_ERR_SEC {

  PROC_ERR_VALID_BIT    ValidBits;              ///< Validation Bits

  UINT64                LocalApicID;            ///< Processor APIC ID

  UINT64                CpuIdInfo_EAX;          ///< CPUID Information output value from EAX

  UINT64                CpuIdInfo_EBX;          ///< CPUID Information output value from EBX

  UINT64                CpuIdInfo_ECX;          ///< CPUID Information output value from ECX

  UINT64                CpuIdInfo_EDX;          ///< CPUID Information output value from EDX

  UINT64                CpuIdInfo_PD1;          ///< CPUID Information Padding 1

  UINT64                CpuIdInfo_PD2;          ///< CPUID Information Padding 2

} PLATFORM_PROC_ERR_SEC;

内存错误信息结构体:

typedef struct _PLATFORM_MEM_ERR_SEC {

  MEM_ERR_VALID_BIT    ValidBits;   ///< Valid bits Bitmp

  UINT64               ErrStatus;   ///< Error Status

  UINT64               PhyAddr;     ///< Physical memory address of detected error

  UINT64               PhyAddrMask; ///< Physical Error Address mask

  UINT16               Node;        ///< Node Number

  UINT16               Card;        ///< Card Number

  UINT16               Module;      ///< Module Number

  UINT16               Bank;        ///< Bank Number

  UINT16               Device;      ///< Device Number

  UINT16               Row;         ///< Row Number

  UINT16               Column;      ///< Column Number

  UINT16               BitPosition; ///< Bit Position

  UINT64               RequestorID; ///< Requestor ID

  UINT64               ResponderID; ///< Responder ID

  UINT64               TargetID;    ///< Target ID

  UINT8                MemErrType;  ///< Memory Error Type

  UINT8                Extend;      ///< Extened

  UINT16               RankNumber;  ///< Rank Number

  UINT16               CardHandle;  ///< Card Number

  UINT16               ModuleHandle;///< Module Number

} PLATFORM_MEM_ERR_SEC;

 

PCIE 错误信息结构体:

///

/// PCIE Error Section

///

typedef struct {

  PCIE_ERR_VALID_BIT    Validation;                                  ///< Validation Bits

  UINT32                PortType;                                    ///< Port Type

  UINT32                Revision;                                    ///< Revision

  UINT32                CommandStatus;                               ///< Command Status

  UINT32                Reserved;                                    ///< Reserved

  DEVICE_ID             DeviceId;                                    ///< Device Id

  UINT8                 SerialNum[8];                                ///< Serial Num

  UINT32                BridgeCtrlStatus;                            ///< Bridge Control Status

  CAP_STRUCTURE         CapabilityStructure;                         ///< Capability Structure

  AER_INFO              AerInfo;                                     ///< AER Info

} PCIE_ERROR_SECTION;

 

对于BERT 错误不需要使用定时器在Kernel 加载的时候会去初始化一遍BERT

BERT   \drivers\acpi\apei\bert.c

bert_init  -->

pr_info_once("Error records from previous boot:\n");

bert_print_all(boot_error_region, region_len);

cper_estatus_print(KERN_INFO HW_ERR, estatus);

错误解析和HEST GHES 类似

相关文章:

RAS--APEI 报错解析流程(2)

RAS--APEI 报错解析流程(1) 除了APEI 中除了GHES会记录错误&#xff0c;在Post过程中的错误通常是通过BERT Table汇报 1.BERT Boot Error Record Table is used to report unhandled errors that occurred in a previous boot&#xff0c;it is reported as a ‘one-time polle…...

微软蓝屏事件对企业数字化转型有什么影响?

引言&#xff1a;从北京时间2024年7月19日&#xff08;周五&#xff09;下午2点多开始&#xff0c;全球大量Windows用户出现电脑崩溃、蓝屏死机、无法重启等情况。事发后&#xff0c;网络安全公司CrowdStrike称&#xff0c;收到大量关于Windows电脑出现蓝屏报告&#xff0c;公司…...

【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(上)

【Gin】精准应用&#xff1a;Gin框架中工厂模式的现代软件开发策略与实施技巧(上) 大家好 我是寸铁&#x1f44a; 【Gin】精准应用&#xff1a;Gin框架中工厂模式的现代软件开发策略与实施技巧(上)✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 本次文章分为上下两部分&…...

浅谈Devops

1.什么是Devops DevopsDev&#xff08;Development&#xff09;Ops&#xff08;Operation&#xff09; DevOps&#xff08;Development和Operations的混合词&#xff09;是一种重视“软件开发人员&#xff08;Dev&#xff09;”和“IT运维技术人员&#xff08;Ops&#xff09;”…...

大文件分片上传(前端TS实现)

大文件分片上传 内容 一般情况下&#xff0c;前端上传文件就是new FormData,然后把文件 append 进去&#xff0c;然后post发送给后端就完事了&#xff0c;但是文件越大&#xff0c;上传的文件也就越长&#xff0c;如果在上传过程中&#xff0c;突然网络故障&#xff0c;又或者…...

unity2D游戏开发02添加组件移动玩家

添加组件 给PlayGame和EnemyObject添加组件BoxCollider 2D碰撞器&#xff0c;不用修改参数 给PlayGame添加组件Rigibody 2D 设置数据 添加EnemyObject&#xff0c;属性如下 Edit->project setting->Physics 2D 将 y的值改为0 给playerObject添加标签 新建层 将PlayerObj…...

设计模式 之 —— 单例模式

目录 什么是单例模式&#xff1f; 定义 单例模式的主要特点 单例模式的几种设计模式 1.懒汉式&#xff1a;线程不安全 2.懒汉式&#xff1a;线程安全 3.饿汉式 4.双重校验锁 单例模式的优缺点 优点&#xff1a; 缺点&#xff1a; 适用场景&#xff1a; 什么是单例模…...

深入浅出WebRTC—ULPFEC

FEC 通过在发送端添加额外的冗余信息&#xff0c;使接收端即使在部分数据包丢失的情况下也能恢复原始数据&#xff0c;从而减轻网络丢包的影响。在 WebRTC 中&#xff0c;FEC 主要有两种实现方式&#xff1a;ULPFEC 和 FlexFEC&#xff0c;FlexFEC 是 ULPFEC 的扩展和升级&…...

Python从0到100(四十三):数据库与Django ORM 精讲

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…...

Redis-主从模式

目录 前言 一.主从节点介绍 二.配置redis主从结构 二.主从复制 四.拓扑结构 五.数据同步 全量复制&#xff08;Full Sync Replication&#xff09; 局部复制&#xff08;Partial Replication&#xff09; Redis的学习专栏&#xff1a;http://t.csdnimg.cn/a8cvV 前言 …...

加速决策过程:企业级爬虫平台的实时数据分析

摘要 在当今数据驱动的商业环境中&#xff0c;企业如何才能在海量信息中迅速做出精准决策&#xff1f;本文将探讨企业级爬虫平台如何通过实时数据分析加速决策过程&#xff0c;实现数据到决策的无缝衔接。我们聚焦于技术如何赋能企业&#xff0c;提升数据处理效率&#xff0c;…...

字典树(前缀树)数组实现(只能查26个单词)

这段代码实现了一个基于 Trie 树的字典树&#xff08;Trie&#xff09;数据结构&#xff0c;用于存储和检索字符串。其中包含以下几个方法. insert(String word): 向 Trie 树中插入一个单词。首先将单词转换为字符数组&#xff0c;然后遍历字符数组&#xff0c;逐个字符在 Trie…...

CTF-pwn-虚拟化-vmmware 前置

文章目录 参考vmware逃逸简介虚拟机和主机通信机制(guest to host)共享内存&#xff08;弃用&#xff09;backdoor机制Message_Send和Message_RecvGuestRPC实例RpcOutSendOneRawWork实例 vmware-rpctool info-get guestinfo.ip各个步骤对应的backdoor操作Open RPC channelSend …...

thinkphp8结合layui2.9 图片上传验证

<?php declare (strict_types 1);namespace app\index\validate;use think\Validate;class Upload extends Validate {/*** 定义验证规则* 格式&#xff1a;字段名 > [规则1,规则2...]** var array*/protected $rule [image > fileExt:jpg,png|fileSize:204800|fi…...

农村污水处理难题:探索低成本高效解决方案

农村污水处理难题&#xff1a;探索低成本高效解决方案 农村污水处理作为国家生态文明建设的重要一环&#xff0c;面临着诸多挑战&#xff0c;尤其是技术落后、管理分散、资源匮乏等问题。物联网技术的引入&#xff0c;为解决这些痛点提供了创新途径&#xff0c;实现了对污水处…...

lightningcss介绍及使用

lightningcss介绍及使用 一款使用 rust 编写的 css 解析器&#xff0c;转换器、及压缩器。 特性 特别快&#xff1a;可以在毫秒级别解析、压缩大量的 css 文件&#xff0c;而且比其他工具的打包结果更小给值添加类型&#xff1a;许多其他css解析器会将值解析成一个无类型的 …...

HTTP服务的应用

1、编辑json请求参数&#xff1b; 2、把json发送到服务url&#xff0c;接收服务的返回参数&#xff1b; 3、解析返回参数。 procedure TfrmCustomQuery.btnFullUpdateClick(Sender: TObject); varfrm: TfrmInputQueryConditionEX;b_OK: Boolean;sBeginDate, sEndDate, sJSON…...

uni-app:踩坑路---scroll-view内使用fixed定位,无效的问题

前言&#xff1a; emmm&#xff0c;说起来这个问题整得还挺好笑的&#xff0c;本人在公司内&#xff0c;奋笔疾书写代码&#xff0c;愉快的提交测试的时候&#xff0c;测试跟我说&#xff0c;在苹果手机上你这个样式有bug&#xff0c;我倒是要看看&#xff0c;是什么bug。 安卓…...

MySQL4.索引及视图

1.建库 create database mydb15_indexstu; use mydb15_indexstu;2.建表 2.1 student表学&#xff08;sno&#xff09;号为主键&#xff0c;姓名&#xff08;sname&#xff09;不能重名&#xff0c;性别&#xff08;ssex&#xff09;仅能输入男或女&#xff0c;默认所在系别&a…...

MongoDB - 聚合阶段 $match、$sort、$limit

文章目录 1. $match 聚合阶段1. 构造测试数据2. $match 示例3. $match 示例 2. $sort 聚合阶段1. 排序一致性问题2. $sort 示例 3. $limit 聚合阶段 1. $match 聚合阶段 $match 接受一个指定查询条件的文档。 $match 阶段语法&#xff1a; { $match: { <query> } }$ma…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…...