[单片机框架][调试功能] 回溯案发现场
程序莫名死机跑飞,不知道问题,那么下面教你回溯错误源
回溯案发现场
- 一、修改HardFault_Handler
- 1. xx.s 在启动文件,找到HardFault_Handler。并修改。
- 2. 定义HardFault_Handler_C函数。(主要是打印信息并存储Flash)
- 3. 根据回读PC和LR地址,通过MAP文件找到对应位置,判断引起硬件错误的原因。
- 二、定义DefaultISR,查看是否有中断未声明
- 三、如果使用了RTX,则需要重定义osRtxErrorNotify函数。
- 四、读取错误信息
- 举例
jianqiang.xue
一、修改HardFault_Handler
1. xx.s 在启动文件,找到HardFault_Handler。并修改。
HardFault_Handler\PROCEXPORT HardFault_Handler [WEAK]MOV R0, spIMPORT HardFault_Handler_CBL HardFault_Handler_CENDP
2. 定义HardFault_Handler_C函数。(主要是打印信息并存储Flash)
void HardFault_Handler_C(unsigned int* hardfault_args) {HardFault_t info;info.r0 = ((unsigned long)hardfault_args[0]);info.r1 = ((unsigned long)hardfault_args[1]);info.r2 = ((unsigned long)hardfault_args[2]);info.r3 = ((unsigned long)hardfault_args[3]);info.r12 = ((unsigned long)hardfault_args[4]);info.lr = ((unsigned long)hardfault_args[5]);info.pc = ((unsigned long)hardfault_args[6]);info.psr = ((unsigned long)hardfault_args[7]);info.BFAR = (*((volatile unsigned long*)(0xE000ED38)));info.CFSR = (*((volatile unsigned long*)(0xE000ED28)));info.HFSR = (*((volatile unsigned long*)(0xE000ED2C)));info.DFSR = (*((volatile unsigned long*)(0xE000ED30)));info.AFSR = (*((volatile unsigned long*)(0xE000ED3C)));info.SCB_SHCSR = SCB->SHCSR;uint8_t data[70], len = 0;len = snprintf((char *)data,70, "\n[Hard fault handler - all num in hex] %x\r\n", *hardfault_args);McuUartWriteString(&ble_uart, data, len);len = snprintf((char *)data,70, "R0 = %x\r\nR1 = %x\r\nR2 = %x\r\nR3 = %x\r\n", info.r0, info.r1, info.r2, info.r3);McuUartWriteString(&ble_uart, data, len);len = snprintf((char *)data,70, "R12 = %x\r\n", info.r12);McuUartWriteString(&ble_uart, data, len);len = snprintf((char *)data,70, "LR [R14] = %x,subroutine call return address\r\n", info.lr);McuUartWriteString(&ble_uart, data, len);len = snprintf((char *)data,70, "PC [R15] = %x,program counter\r\n", info.pc);McuUartWriteString(&ble_uart, data, len);len = snprintf((char *)data,70, "PSR = %x\r\nBFAR = %lx\r\n", info.psr, (*((volatile unsigned long*)(0xE000ED38))));McuUartWriteString(&ble_uart, data, len);len = snprintf((char *)data,70, "CFSR = %lx\r\nHFSR = %lx\r\nDFSR = %lx\r\n",(*((volatile unsigned long*)(0xE000ED28))), (*((volatile unsigned long*)(0xE000ED2C))), (*((volatile unsigned long*)(0xE000ED30))));McuUartWriteString(&ble_uart, data, len);len = snprintf((char *)data,70, "AFSR = %lx\r\nSCB_SHCSR = %x\r\n",(*((volatile unsigned long*)(0xE000ED3C))), SCB->SHCSR);McuUartWriteString(&ble_uart, data, len);info.event = 0;kv_set_env(0xFF00, &info, sizeof(HardFault_t)); // 记录到Flashwhile (1);
}
3. 根据回读PC和LR地址,通过MAP文件找到对应位置,判断引起硬件错误的原因。
二、定义DefaultISR,查看是否有中断未声明
#define VECTORNUM (*(volatile uint32_t*)(0xE000ED04))
void DefaultISR(void) {HardFault_t info;uint8_t data[50], len;len = sprintf((char *)data, "\n default_isr %d,%x \n", (uint8_t)VECTORNUM, (uint32_t)VECTORNUM);McuUartWriteString(&ble_uart, data, len);info.event = 1;info.VECTORNUM_ADDR = VECTORNUM;kv_set_env(0xFF00, &info, sizeof(HardFault_t)); // 记录到Flashwhile(1);
}
根据打印出来的数据,判断VECTOR,是怎么原因触发中断的。查对应芯片向量表,得知导致原因。
三、如果使用了RTX,则需要重定义osRtxErrorNotify函数。
uint32_t osRtxErrorNotify(uint32_t code, void* object_id) {HardFault_t info;(void)object_id;uint8_t data[100], len = 0;switch (code) {case osRtxErrorStackOverflow:len = sprintf((char *)data, "\n Stack overflow detected for thread (thread_id=0x%x)\n", (uint32_t)object_id);McuUartWriteString(&ble_uart, data, len);// Stack overflow detected for thread (thread_id=object_id)break;case osRtxErrorISRQueueOverflow:len = sprintf((char *)data, "\n ISR Queue overflow detected when inserting object 0x%x\n", (uint32_t)object_id);McuUartWriteString(&ble_uart, data, len);// ISR Queue overflow detected when inserting object (object_id)break;case osRtxErrorTimerQueueOverflow:len = sprintf((char *)data, "\n User Timer Callback Queue overflow detected for timer (timer_id=0x%x)\n", (uint32_t)object_id);McuUartWriteString(&ble_uart, data, len);// User Timer Callback Queue overflow detected for timer (timer_id=object_id)break;case osRtxErrorClibSpace:len = sprintf((char *)data, "\n Standard C/C++ library libspace not available: increase OS_THREAD_LIBSPACE_NUM 0x%x\n", (uint32_t)object_id);McuUartWriteString(&ble_uart, data, len);// Standard C/C++ library libspace not available: increase OS_THREAD_LIBSPACE_NUMbreak;case osRtxErrorClibMutex:len = sprintf((char *)data, "\n Standard C/C++ library mutex initialization failed 0x%x\n", (uint32_t)object_id);McuUartWriteString(&ble_uart, data, len);// Standard C/C++ library mutex initialization failedbreak;default:// Reservedbreak;}info.event = 2;info.RTX_CODE = code;info.RTX_OBJ_ID = (uint32_t)object_id;kv_set_env(0xFF00, &info, sizeof(HardFault_t)); // 记录到Flashfor (;;) {}// return 0U;
}
四、读取错误信息
采用ATCMD读取,如下
#ifdef ATCMD_EN
// 在功能模块中定义一个标准函数
static int atcmd_backtrack(atcmd_pack_t *pack) {HardFault_t *info = NULL;uint8_t buff[100], len;info = kv_get_env(0xFF00);if (info == NULL) {strcat((char*)buff, AT_ERROR);} else {if (info->event == 0) {len = snprintf((char *)buff, 100, "R0 = %x\r\nR1 = %x\r\nR2 = %x\r\nR3 = %x\r\nR12 = %x\r\n", info->r0, info->r1, info->r2, info->r3, info->r12);pack->reply(buff, strlen((char*)buff));len = snprintf((char *)buff, 100, "LR [R14] = %x,subroutine call return address\r\n", info->lr);pack->reply(buff, strlen((char*)buff));len = snprintf((char *)buff, 100, "PC [R15] = %x,program counter\r\n", info->pc);pack->reply(buff, strlen((char*)buff));len = snprintf((char *)buff, 100, "PSR = %x\r\nBFAR = %lx\r\n", info->psr, (*((volatile unsigned long*)(0xE000ED38))));pack->reply(buff, strlen((char*)buff));len = snprintf((char *)buff, 100, "CFSR = %lx\r\nHFSR = %lx\r\nDFSR = %lx\r\n",(*((volatile unsigned long*)(0xE000ED28))), (*((volatile unsigned long*)(0xE000ED2C))), (*((volatile unsigned long*)(0xE000ED30))));pack->reply(buff, strlen((char*)buff));len = snprintf((char *)buff, 100, "AFSR = %lx\r\nSCB_SHCSR = %x\r\n",(*((volatile unsigned long*)(0xE000ED3C))), SCB->SHCSR);pack->reply(buff, strlen((char*)buff));memset(buff, 0, 100);} else if (info->event == 1) {len = snprintf((char *)buff, 100, "\n default_isr %d,%x \n", (uint8_t)info->VECTORNUM_ADDR, (uint32_t)info->VECTORNUM_ADDR);} else if (info->event == 2) {len = snprintf((char *)buff, 100, "\n RTX_ERR CODE=0x%x, OBJ_ID=0x%x \n", (uint8_t)info->RTX_CODE, (uint32_t)info->RTX_OBJ_ID);}strcat((char*)buff, AT_OK);}pack->reply(buff, strlen((char*)buff));return 0;
}// 注册AT指令,传入标准函数
ATCMD_INIT("AT+BACKTRACK?", atcmd_backtrack);
#endif
举例
/********************************************************************************* @file backtrack.c* @author jianqiang.xue* @Version V1.0.0* @Date 2023-02-10* @brief 记录错误原因,方便追溯问题源********************************************************************************/
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>#include "cmsis_os2.h"
#include "os_api.h"
#include "SKEAZ1284.h"
#include "atcmd_slave.h" // 自行添加[Module\atcmd\atcmd_slave.c]#include "kv_sys.h"
#include "mcu_uart.h"
#include "ecu_cc2642.h"
#include "edebug.h"typedef struct __PACKED {uint32_t event; // 0--HardFault 1--DefaultISR 2--osRtxErrorNotify// HardFault_Handleruint32_t r0;uint32_t r1;uint32_t r2;uint32_t r3;uint32_t r12;uint32_t lr;uint32_t pc;uint32_t psr;uint64_t BFAR;uint64_t CFSR;uint64_t HFSR;uint64_t DFSR;uint64_t AFSR;uint64_t SCB_SHCSR;// DefaultISRuint32_t VECTORNUM_ADDR;// osRtxErrorNotifyuint32_t RTX_CODE;uint32_t RTX_OBJ_ID;
} HardFault_t;void HardFault_Handler_C(unsigned int* hardfault_args) {HardFault_t info;info.r0 = ((unsigned long)hardfault_args[0]);info.r1 = ((unsigned long)hardfault_args[1]);info.r2 = ((unsigned long)hardfault_args[2]);info.r3 = ((unsigned long)hardfault_args[3]);info.r12 = ((unsigned long)hardfault_args[4]);info.lr = ((unsigned long)hardfault_args[5]);info.pc = ((unsigned long)hardfault_args[6]);info.psr = ((unsigned long)hardfault_args[7]);info.BFAR = (*((volatile unsigned long*)(0xE000ED38)));info.CFSR = (*((volatile unsigned long*)(0xE000ED28)));info.HFSR = (*((volatile unsigned long*)(0xE000ED2C)));info.DFSR = (*((volatile unsigned long*)(0xE000ED30)));info.AFSR = (*((volatile unsigned long*)(0xE000ED3C)));info.SCB_SHCSR = SCB->SHCSR;uint8_t data[70], len = 0;len = snprintf((char *)data,70, "\n[Hard fault handler - all num in hex] %x\r\n", *hardfault_args);McuUartWriteString(&ble_uart, data, len);len = snprintf((char *)data,70, "R0 = %x\r\nR1 = %x\r\nR2 = %x\r\nR3 = %x\r\n", info.r0, info.r1, info.r2, info.r3);McuUartWriteString(&ble_uart, data, len);len = snprintf((char *)data,70, "R12 = %x\r\n", info.r12);McuUartWriteString(&ble_uart, data, len);len = snprintf((char *)data,70, "LR [R14] = %x,subroutine call return address\r\n", info.lr);McuUartWriteString(&ble_uart, data, len);len = snprintf((char *)data,70, "PC [R15] = %x,program counter\r\n", info.pc);McuUartWriteString(&ble_uart, data, len);len = snprintf((char *)data,70, "PSR = %x\r\nBFAR = %lx\r\n", info.psr, (*((volatile unsigned long*)(0xE000ED38))));McuUartWriteString(&ble_uart, data, len);len = snprintf((char *)data,70, "CFSR = %lx\r\nHFSR = %lx\r\nDFSR = %lx\r\n",(*((volatile unsigned long*)(0xE000ED28))), (*((volatile unsigned long*)(0xE000ED2C))), (*((volatile unsigned long*)(0xE000ED30))));McuUartWriteString(&ble_uart, data, len);len = snprintf((char *)data,70, "AFSR = %lx\r\nSCB_SHCSR = %x\r\n",(*((volatile unsigned long*)(0xE000ED3C))), SCB->SHCSR);McuUartWriteString(&ble_uart, data, len);info.event = 0;kv_set_env(0xFF00, &info, sizeof(HardFault_t)); // 记录到Flashwhile (1);
}#define VECTORNUM (*(volatile uint32_t*)(0xE000ED04))
void DefaultISR(void) {HardFault_t info;uint8_t data[50], len;len = sprintf((char *)data, "\n default_isr %d,%x \n", (uint8_t)VECTORNUM, (uint32_t)VECTORNUM);McuUartWriteString(&ble_uart, data, len);info.event = 1;info.VECTORNUM_ADDR = VECTORNUM;kv_set_env(0xFF00, &info, sizeof(HardFault_t)); // 记录到Flashwhile(1);
}uint32_t osRtxErrorNotify(uint32_t code, void* object_id) {HardFault_t info;(void)object_id;uint8_t data[100], len = 0;switch (code) {case osRtxErrorStackOverflow:len = sprintf((char *)data, "\n Stack overflow detected for thread (thread_id=0x%x)\n", (uint32_t)object_id);McuUartWriteString(&ble_uart, data, len);// Stack overflow detected for thread (thread_id=object_id)break;case osRtxErrorISRQueueOverflow:len = sprintf((char *)data, "\n ISR Queue overflow detected when inserting object 0x%x\n", (uint32_t)object_id);McuUartWriteString(&ble_uart, data, len);// ISR Queue overflow detected when inserting object (object_id)break;case osRtxErrorTimerQueueOverflow:len = sprintf((char *)data, "\n User Timer Callback Queue overflow detected for timer (timer_id=0x%x)\n", (uint32_t)object_id);McuUartWriteString(&ble_uart, data, len);// User Timer Callback Queue overflow detected for timer (timer_id=object_id)break;case osRtxErrorClibSpace:len = sprintf((char *)data, "\n Standard C/C++ library libspace not available: increase OS_THREAD_LIBSPACE_NUM 0x%x\n", (uint32_t)object_id);McuUartWriteString(&ble_uart, data, len);// Standard C/C++ library libspace not available: increase OS_THREAD_LIBSPACE_NUMbreak;case osRtxErrorClibMutex:len = sprintf((char *)data, "\n Standard C/C++ library mutex initialization failed 0x%x\n", (uint32_t)object_id);McuUartWriteString(&ble_uart, data, len);// Standard C/C++ library mutex initialization failedbreak;default:// Reservedbreak;}info.event = 2;info.RTX_CODE = code;info.RTX_OBJ_ID = (uint32_t)object_id;kv_set_env(0xFF00, &info, sizeof(HardFault_t)); // 记录到Flashfor (;;) {}// return 0U;
}#ifdef ATCMD_EN
// 在功能模块中定义一个标准函数
static int atcmd_backtrack(atcmd_pack_t *pack) {HardFault_t *info = NULL;uint8_t buff[100], len;info = kv_get_env(0xFF00);if (info == NULL) {strcat((char*)buff, AT_ERROR);} else {if (info->event == 0) {len = snprintf((char *)buff, 100, "R0 = %x\r\nR1 = %x\r\nR2 = %x\r\nR3 = %x\r\nR12 = %x\r\n", info->r0, info->r1, info->r2, info->r3, info->r12);pack->reply(buff, strlen((char*)buff));len = snprintf((char *)buff, 100, "LR [R14] = %x,subroutine call return address\r\n", info->lr);pack->reply(buff, strlen((char*)buff));len = snprintf((char *)buff, 100, "PC [R15] = %x,program counter\r\n", info->pc);pack->reply(buff, strlen((char*)buff));len = snprintf((char *)buff, 100, "PSR = %x\r\nBFAR = %lx\r\n", info->psr, (*((volatile unsigned long*)(0xE000ED38))));pack->reply(buff, strlen((char*)buff));len = snprintf((char *)buff, 100, "CFSR = %lx\r\nHFSR = %lx\r\nDFSR = %lx\r\n",(*((volatile unsigned long*)(0xE000ED28))), (*((volatile unsigned long*)(0xE000ED2C))), (*((volatile unsigned long*)(0xE000ED30))));pack->reply(buff, strlen((char*)buff));len = snprintf((char *)buff, 100, "AFSR = %lx\r\nSCB_SHCSR = %x\r\n",(*((volatile unsigned long*)(0xE000ED3C))), SCB->SHCSR);pack->reply(buff, strlen((char*)buff));memset(buff, 0, 100);} else if (info->event == 1) {len = snprintf((char *)buff, 100, "\n default_isr %d,%x \n", (uint8_t)info->VECTORNUM_ADDR, (uint32_t)info->VECTORNUM_ADDR);} else if (info->event == 2) {len = snprintf((char *)buff, 100, "\n RTX_ERR CODE=0x%x, OBJ_ID=0x%x \n", (uint8_t)info->RTX_CODE, (uint32_t)info->RTX_OBJ_ID);}strcat((char*)buff, AT_OK);}pack->reply(buff, strlen((char*)buff));return 0;
}// 注册AT指令,传入标准函数
ATCMD_INIT("AT+BACKTRACK?", atcmd_backtrack);
#endif
相关文章:

[单片机框架][调试功能] 回溯案发现场
程序莫名死机跑飞,不知道问题,那么下面教你回溯错误源 回溯案发现场一、修改HardFault_Handler1. xx.s 在启动文件,找到HardFault_Handler。并修改。2. 定义HardFault_Handler_C函数。(主要是打印信息并存储Flash)3. 根…...
MySQL主从同步-(二)搭建从机服务器
在docker中创建并启动MySQL从服务器:**端口3307docker run -d \-p 3307:3306 \-v /atguigu/mysql/slave1/conf:/etc/mysql/conf.d \-v /atguigu/mysql/slave1/data:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD123456 \--name atguigu-mysql-slave1 \mysql:8.0.3创建MyS…...

Linux系列 备份与分享文档
作者简介:一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页 目录 前言 一.备份与分享文档 1.使用压缩和解压缩工具 (1&…...

SNI生效条件 - 补充nginx-host绕过实例复现中SNI绕过的先决条件
文章目录1.前置环境搭建2.测试SNI生效条件(时间)3. 证书对SNI的影响3.1 双方使用同一个证书:3.2 双方使用不同的证书与私钥4. 端口号区分测试4.1 端口号区分,证书区分:4.2 端口号区分,证书不区分:5.总结SNI运行机制6. SNI机制绕过…...

傻白探索Chiplet,Modular Routing Design for Chiplet-based Systems(十一)
阅读了Modular Routing Design for Chiplet-based Systems这篇论文,是关于多chiplet通信的,个人感觉核心贡献在于实现了 deadlock-freedom in multi-chiplet system,而不仅仅是考虑单个intra-chiplet的局部NoC可以通信,具体的一些…...

C语言静态库、动态库的封装和注意事项
1、动态库、静态库介绍 参考博客:《静态库和动态库介绍以及Makefile》; 2、代码目录结构和编译脚本 参考博客:《实际工作开发中C语言工程的目录结构分析》; 3、编写库的流程 (1)明确需求:需求是否合理、需求的使用场景、需求可能遇…...

MyBatis-Plus分页插件和MyBatisX插件
MyBatis-Plus分页插件和MyBatisX插件六、插件1、分页插件a>添加配置类b>测试八、代码生成器1、引入依赖2、快速生成十、MyBatisX插件1、新建spring boot工程a>引入依赖b>配置application.ymlc>连接MySQL数据库d>MybatisX逆向生成2、MyBatisX快速生成CRUD申明…...

年前无情被裁,面试大厂的这几个月…
2月份了,金三银四也即将来临,在这个招聘季,大厂也开始招人,但还是有很多人吐槽说投了很多简历,却迟迟没有回复… 另一面企业招人真的变得容易了吗?有企业HR吐槽,简历确实比以前多了好几倍&…...
基于Java的分片上传功能
起因:最近在工作中接到了一个大文件上传下载的需求,要求将文件上传到share盘中,下载的时候根据前端传的不同条件对单个或多个文件进行打包并设置目录下载。 一开始我想着就还是用老办法直接file.transferTo(newFile)就算是大文件,…...

KDS安装步骤
KDS kinetis design studio 软件 第一步官网(https://www.nxp.com/ 注册账号下载set成功下载软件。 随着AI,大数据这些技术的快速发展,与此有关的知识也普及开来。如何在众多网站中寻找最有价值的信息,如何在最短的时间内获得最新的技…...

JavaSE-线程池(1)- 线程池概念
JavaSE-线程池(1)- 线程池概念 前提 使用多线程可以并发处理任务,提高程序执行效率。但同时创建和销毁线程会消耗操作系统资源,虽然java 使用线程的方式有多种,但是在实际使用过程中并不建议使用 new Thread 的方式手…...

开源代码的寿命为何只有1年?
说实话,如果古希腊的西西弗斯是一个在2016年编写开源代码的开发者,那他会有宾至如归的感觉。著名的西西弗斯处罚,是神话流传下来的,他被迫推一块巨大的石头上山,当登顶之后,只能眼睁睁看着它滚下去…...
完善登录功能--过滤器的使用
系列文章目录 Spring Boot读取配置文件内容的三种方式 Spring Boot自动配置–如何切换内置Web服务器 SpringBoot项目部署 上述为该系列部分文章,想了解更多可看我博客主页哦! 文章目录系列文章目录前言一、创建自定义过滤器LoginCheckFilter二、在启动类…...
CSS基础:属性和关系选择器
字体属性 color 文本颜色 div{ color:red;} div{ color:#ff0000;} div{ color:rgb(255,0,0);} div{ color:rgba(255,0,0,.5);}font-size 文本大小 h1 {font-size:40px;} h2 {font-size:30px;} p {font-size:14px;}注意:chrome浏览器接受最小字体是12px font-we…...

设计模式:原型模式解决对象创建成本大问题
一、问题场景 现在有一只猫tom,姓名为: tom, 年龄为:1,颜色为:白色,请编写程序创建和tom猫属性完全相同的10只猫。 二、传统解决方案 public class Cat {private String name;private int age;private String color;…...

驱动开发(二)
一、驱动流程 驱动需要以下几个步骤才能完成对硬件的访问和操作: 模块加载函数 module_init注册主次设备号 <应用程序通过设备号找到设备>驱动设备文件 <应用程序访问驱动的方式> 1、手动创建 (mknod)2、程序自动创建file_oper…...
《狂飙》大结局,这22句经典台词值得细品
最近爆火的热播剧《狂飙》大家都看了吗? 剧情紧凑、演技炸裂、豆瓣评分9.0,可以说是开年评分最高的一部国产剧。 虽然大结局了。 里面有很多经典台词,值得每个人细细品味。 01 这世界不缺梦想 有本事你就去实现它 02 你这么善良 怎么跟坏…...

【计算机网络期末复习】第二章 物理层
✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📣专栏定位:为想复习学校计算机网络课程的同学提供重点大纲,帮助大家渡过期末考~ 📚专栏地址: ❤️如果有收获的话,欢迎点…...

多核异构核间通信-mailbox/RPMsg 介绍及实验
1. 多核异构核间通信 由于MP157是一款多核异构的芯片,其中既包含的高性能的A7核及实时性强的M4内核,那么这两种处理器在工作时,怎么互相协调配合呢? 这就涉及到了核间通信的概念了。 IPCC (inter-processor communication contr…...
【Rust日报】2023-02-11 从头开始构建云数据库 RisingWave - 为什么我们从 C++ 转向 Rust...
GTK4发布v0.60gtk4-rs代码库包含GTK4的Rust crates。还有个庞大的GObject库生态系统,其中许多库基于gtk-rs中包含的Rust绑定工具。 特别是:gtk-rs-core,一些核心库的绑定,例如 glib、gio、pango、graphenegstreamer-rs,…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

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

Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...