记一次 .NET某hdp智能柜系统 卡死分析
一:背景
1. 讲故事
停了一个月时间没有更新博客了,主要是这段时间有些许事情导致心神不宁,我这个人也比较浮躁所以无法潜心修炼,事情如下:
- 被狗咬了
也不知道是不是出门没看黄历,在小区门口店里买烟,被店老板家狗来了个猝不及防,天降横祸。让店老板赔了个疫苗钱,人生第一次被狗咬,第一次打这种狂犬疫苗,头两天总焦虑这辈子是不是要画一个句号了,想着这几年在社区里免费给人家分析dump,应该也积了不少阴德阳善,老天不会在这个时候收我的,昨天结束了四针剂的最后一针,算是放下了心头事,真是人间好时节。
- 买房
孩子明年就要上一年级了,所以给孩子上哪所有教育资源的学校又是一件焦虑的事情,家门口的学校都是菜小,村小,不想耽误孩子的前程,在贝壳焦虑着泡了大半个月加上实地考察,把这件事情也搞定了。
- 幼儿跳绳比赛
这个真的最耽误我的时间,孩子参加市级的跳绳比赛,每天早上6:45集训,每天 6:00 跟着孩子起床,送去集训,全程陪护,作为程序员晚上12点前下电脑都是对工作的不尊敬,导致睡眠不足,整天精神状态都不是很好。
跟大家简单的汇报了这一个月的事情,接下来我们分析个比较经典的dump吧,前段时间有位朋友找到我,说他的程序会偶发卡死,自己有一定的分析能力,但还是找不出来根源在哪里,让我帮忙看下,毕竟在国内搜索 .NET高级调试
的文章,最终都会通向我这边。
二:WinDbg分析
1. 主线程怎么了
因为是主线程的卡死,所以首看主线程的调用栈来寻找其中的蛛丝马迹,输出如下:
0:000:x86> k
CvRegToMachine(x86) conversion failure for 0x14f
X86MachineInfo::SetVal: unknown register 0 requested# ChildEBP RetAddr
00 0047e8f8 76c41629 ntdll_774f0000!NtWaitForSingleObject+0x15
01 0047e8f8 76d71194 KERNELBASE!WaitForSingleObjectEx+0x98
02 0047e910 58d52bf6 kernel32!WaitForSingleObjectExImplementation+0x75
03 (Inline) -------- coreclr!CLREventWaitHelper2+0x9 [D:\a\_work\1\s\src\coreclr\vm\synch.cpp @ 372]
04 0047e964 58d52bc4 coreclr!CLREventWaitHelper+0x2d [D:\a\_work\1\s\src\coreclr\vm\synch.cpp @ 397]
05 0047e974 58d52821 coreclr!CLREventBase::WaitEx+0x49 [D:\a\_work\1\s\src\coreclr\vm\synch.cpp @ 469]
06 0047e988 58df0848 coreclr!CLREventBase::Wait+0x1a [D:\a\_work\1\s\src\coreclr\vm\synch.cpp @ 413]
07 (Inline) -------- coreclr!GCEvent::Impl::Wait+0xb [D:\a\_work\1\s\src\coreclr\vm\gcenv.os.cpp @ 1283]
08 (Inline) -------- coreclr!GCEvent::Wait+0x10 [D:\a\_work\1\s\src\coreclr\vm\gcenv.os.cpp @ 1361]
09 0047e9a0 58d5222c coreclr!SVR::GCHeap::WaitUntilGCComplete+0x28 [D:\a\_work\1\s\src\coreclr\gc\gcee.cpp @ 287]
0a 0047e9fc 58f26769 coreclr!Thread::RareDisablePreemptiveGC+0x1ad [D:\a\_work\1\s\src\coreclr\vm\threadsuspend.cpp @ 2172]
0b 0047ea08 58df7f88 coreclr!JIT_ReversePInvokeEnterRare2+0xd [D:\a\_work\1\s\src\coreclr\vm\jithelpers.cpp @ 5462]
0c 0047ea2c 2d8fd592 coreclr!JIT_ReversePInvokeEnterTrackTransitions+0x98 [D:\a\_work\1\s\src\coreclr\vm\jithelpers.cpp @ 5509]
WARNING: Frame IP not in any known module. Following frames may be wrong.
0d 0047ea90 76f862fa 0x2d8fd592
0e 0047eabc 76f86d3a user32!InternalCallWinProc+0x23
0f 0047eb34 76f86de8 user32!UserCallWinProcCheckWow+0x109
10 0047eb90 76fae062 user32!DispatchClientMessage+0xd5
11 0047ebf8 7750013a user32!__fnINDEVICECHANGE+0x2a9
12 0047ec64 76f8790d ntdll_774f0000!KiUserCallbackDispatcher+0x2e
13 0047ec64 30d6e999 user32!GetMessageW+0x33
从卦中可以看到有一个 WaitUntilGCComplete
函数,说明主线程正在等待GC完成,那到底是哪一个线程触发了GC呢?可以用 ~* k
命令观察每个线程的调用栈,经过一顿搜索,发现是3号
线程挂了GC相关函数SuspendEE
,参考输出如下:
3 Id: ff0.608 Suspend: 0 Teb: fff9a000 Unfrozen
CvRegToMachine(x86) conversion failure for 0x14f
X86MachineInfo::SetVal: unknown register 0 requested# ChildEBP RetAddr
00 02c3f5d0 76c41629 ntdll_774f0000!NtWaitForSingleObject+0x15
01 02c3f5d0 76d71194 KERNELBASE!WaitForSingleObjectEx+0x98
02 02c3f5e8 58d52bf6 kernel32!WaitForSingleObjectExImplementation+0x75
03 (Inline) -------- coreclr!CLREventWaitHelper2+0x9 [D:\a\_work\1\s\src\coreclr\vm\synch.cpp @ 372]
04 02c3f63c 58d52bc4 coreclr!CLREventWaitHelper+0x2d [D:\a\_work\1\s\src\coreclr\vm\synch.cpp @ 397]
05 02c3f64c 58d52821 coreclr!CLREventBase::WaitEx+0x49 [D:\a\_work\1\s\src\coreclr\vm\synch.cpp @ 469]
06 02c3f664 58d8947b coreclr!CLREventBase::Wait+0x1a [D:\a\_work\1\s\src\coreclr\vm\synch.cpp @ 413]
07 02c3f6e8 58d86aa2 coreclr!ThreadSuspend::SuspendRuntime+0x553 [D:\a\_work\1\s\src\coreclr\vm\threadsuspend.cpp @ 3590]
08 02c3f790 58d868f0 coreclr!ThreadSuspend::SuspendEE+0xf9 [D:\a\_work\1\s\src\coreclr\vm\threadsuspend.cpp @ 5741]
09 02c3f7b8 58d95aa5 coreclr!GCToEEInterface::SuspendEE+0x26 [D:\a\_work\1\s\src\coreclr\vm\gcenv.ee.cpp @ 28]
0a 02c3f7b8 58d96ae8 coreclr!SVR::gc_heap::gc_thread_function+0x11f [D:\a\_work\1\s\src\coreclr\gc\gc.cpp @ 6680]
0b 02c3f7e4 58d96ad4 coreclr!SVR::gc_heap::end_space_after_gc [D:\a\_work\1\s\src\coreclr\gc\gc.cpp @ 39175]
0c (Inline) -------- coreclr!GCToOSInterface::BoostThreadPriority+0xf [D:\a\_work\1\s\src\coreclr\vm\gcenv.os.cpp @ 699]
0d 02c3f7e4 58e0c182 coreclr!SVR::gc_heap::gc_thread_stub+0x64 [D:\a\_work\1\s\src\coreclr\gc\gc.cpp @ 31990]
0e 02c3f7f8 76d7343d coreclr!<lambda_e12851d373e238e6372df6ec280c8fc6>::operator()+0x42 [D:\a\_work\1\s\src\coreclr\vm\gcenv.ee.cpp @ 1471]
0f 02c3f804 77529802 kernel32!BaseThreadInitThunk+0xe
10 02c3f844 775297d5 ntdll_774f0000!__RtlUserThreadStart+0x70
从卦中看,GC正处于 SuspendEE
阶段,即冻结执行引擎,它的实现途径就是通过 while threads
的方式让每一个线程暂停,C++参考代码如下:
void ThreadSuspend::SuspendRuntime(ThreadSuspend::SUSPEND_REASON reason)
{while (true){Thread* thread = NULL;while ((thread = ThreadStore::GetThreadList(thread)) != NULL){}}
}
所以接下来的探索方向就是看看当前的 SupendEE 到底正在处理哪一个线程?
2. 如何挖到处理线程
要挖处理线程方法比较多,你可以逆向的分析汇编代码,第二种就是写个脚本在线程栈空间中搜索托管线程地址。这里选择后者,毕竟简单粗暴。
- 托管线程列表,即下面的
ThreadOBJ
字段。
0:000:x86> !t
ThreadCount: 176
UnstartedThread: 1
BackgroundThread: 26
PendingThread: 0
DeadThread: 148
Hosted Runtime: noLock DBG ID OSID ThreadOBJ State GC Mode GC Alloc Context Domain Count Apt Exception0 1 fec 023BDF08 26020 Preemptive 0F608E60:0F60A528 023452a8 -00001 Ukn 7 2 2c0c 023CAC98 2b220 Preemptive 03230120:03231900 023452a8 -00001 Ukn (Finalizer) 11 4 2d48 24738AF0 102b220 Preemptive 0738C3C0:0738DC8C 023452a8 -00001 Ukn (Threadpool Worker) 12 5 2d4c 24774BE0 102b220 Preemptive 00000000:00000000 023452a8 -00001 Ukn (Threadpool Worker) 16 8 2d68 247C9820 20220 Preemptive 0356A5EC:0356B150 023452a8 -00001 Ukn 13 9 2d54 247C1878 20220 Preemptive 0B6A3384:0B6A33AC 023452a8 -00001 Ukn
XXXX 11 0 247F8B28 1600 Preemptive 00000000:00000000 023452a8 -00001 Ukn 28 12 2dbc 24825760 21220 Preemptive 00000000:00000000 023452a8 -00001 Ukn 29 13 2dc0 2482D088 21220 Preemptive 00000000:00000000 023452a8 -00001 Ukn ...58 156 2910 246714A8 102b222 Cooperative 0F56F618:0F56F884 023452a8 -00001 Ukn (Threadpool Worker) ...0:000:x86> !address -f:StackBaseAddr EndAddr+1 RgnSize Type State Protect Usage
-----------------------------------------------------------------------------------------------2bc0000 2c3d000 7d000 MEM_PRIVATE MEM_RESERVE Stack32 [~3; ff0.608]2c3d000 2c3e000 1000 MEM_PRIVATE MEM_COMMIT PAGE_READWRITE | PAGE_GUARD Stack32 [~3; ff0.608]2c3e000 2c40000 2000 MEM_PRIVATE MEM_COMMIT PAGE_READWRITE Stack32 [~3; ff0.608]
- 搜索脚本
脚本的目的是在 2c3e000 ~ 2c40000
中搜索托管线程address。
use strict; // 32bit
let arr = []; function initializeScript() { return [new host.apiVersionSupport(1, 7)]; }
function log(str) { host.diagnostics.debugLog(str + "\n"); }
function exec(str) { return host.namespace.Debugger.Utility.Control.ExecuteCommand(str); } function invokeScript() { var output = exec("!t").Skip(8); for (var line of output) { if (!line) continue; log(line); var address = line.substr(19, 8); log(address); searchmemory(address); }
} function searchmemory(address) { var output = exec("s-d 02c3e960 2c40000 " + address); for(var line of output){ log(line); }
}
执行完之后,发现 SuspendEE 正在处理的是 58号线程,细心的朋友会发现上面的 !t
输出的58号线程正是 Cooperative 状态,即协作状态,也就是还没有被 SuspendEE 处理。 哈哈,马上就要看到光明顶了,接下来的方向就是洞察 58号线程正在做什么?
3. 58号线程正在做什么
这就比较简单了,使用 ~58s
切到该线程查看线程栈即可。
0:000:x86> ~58s
02c52da4 807e3400 cmp byte ptr [esi+34h],0 ds:002b:0b15cc78=01
0:058:x86> !clrstack
OS Thread Id: 0x2910 (58)
Child SP IP Call Site
40EAFA0C 02c52da4 xxx.xxx.PlayWavStream(System.IO.Stream, System.String)
40EAFA54 024e4915 xxx.xxx+c__DisplayClass8_0.b__0()
40EAFA94 024c849d System.Threading.Tasks.Task.InnerInvoke() [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs @ 2397]
40EAFAA0 024c2abd System.Threading.Tasks.Task+c.<.cctor>b__272_0(System.Object) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs @ 2376]
40EAFAA8 00536547 System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(System.Threading.Thread, System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/ExecutionContext.cs @ 268]
40EAFAD8 024c2852 System.Threading.Tasks.Task.ExecuteWithThreadLocal(System.Threading.Tasks.Task ByRef, System.Threading.Thread) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs @ 2337]
40EAFB3C 39d3925f System.Threading.ThreadPoolWorkQueue.Dispatch()
40EAFB90 00538145 System.Threading.PortableThreadPool+WorkerThread.WorkerThreadStart() [/_/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.WorkerThread.cs @ 107]
40EAFB94 00537f5c [InlinedCallFrame: 40eafb94]
40EAFC38 00537f5c System.Threading.Thread.StartCallback() [/_/src/coreclr/System.Private.CoreLib/src/System/Threading/Thread.CoreCLR.cs @ 106]
40EAFD8C 58dfd24f [DebuggerU2MCatchHandlerFrame: 40eafd8c]
根据线程栈上的 PlayWavStream 方法来检查源码,发现了一个无语的写法,截图如下:
从源码看是用一个死循环来强留一个线程,无语了,这也疑似导致 GC 因为找不到safepoint而长时间不能暂停它,这里说疑似,是因为在coreclr中是有支撑的。
解决办法就比较简单了。
- 加个 Thread.Sleep
- 换种截停的写法。
- 升级 coreclr 的版本
三:总结
这次生产事故,对一般人来说还是有一定的难度,毕竟这种东西不是几个命令就能弄出来的,还是需要考察你对coreclr 一些底层知识的熟悉度。
相关文章:
记一次 .NET某hdp智能柜系统 卡死分析
一:背景 1. 讲故事 停了一个月时间没有更新博客了,主要是这段时间有些许事情导致心神不宁,我这个人也比较浮躁所以无法潜心修炼,事情如下: 被狗咬了 也不知道是不是出门没看黄历,在小区门口店里买烟&am…...
大模型专栏--Spring Ai Alibaba介绍和功能演示
Spring AI Alibaba 介绍和功能演示 背景 Spring AI Alibaba 开源项目基于 Spring AI 构建,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践,提供高层次的 AI API 抽象与云原生基础设施集成方案,帮助开发者快速构建 AI 应用。…...
【GPT】为什么人需要睡觉?
睡觉对人类来说是至关重要的生理和心理需求。以下是一些为什么人需要睡觉的主要原因,以及睡眠对身体和大脑的影响: 1. 恢复与修复 身体修复:在睡眠期间,身体进行细胞修复和再生。例如,生长激素在深度睡眠中分泌&#…...
【Linux】磁盘 | 文件系统 | inode
🪐🪐🪐欢迎来到程序员餐厅💫💫💫 主厨:邪王真眼 主厨的主页:Chef‘s blog 所属专栏:青果大战linux 总有光环在陨落,总有新星在闪烁 模电好难啊ÿ…...
A051-基于Spring Boot的网络海鲜市场系统的设计与实现
🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…...
谷歌浏览器Chrome打开百度很慢,其他网页正常的解决办法,试了很多,找到了适合的
最近不知怎么的,Chrome突然间打开百度很慢,甚至打不开。不光我一个人遇到这问题,我同事也遇到这个问题。开发中难免遇到问题,需要百度,现在是百度不了。 作为一名开发人员,习惯了使用Chrome进行开发&#…...
《企业级低代码开发平台技术要求》核心要点解析
一、引言 在数字化转型的浪潮中,企业级低代码开发平台成为推动企业创新与发展的关键力量。深圳市标准化协会发布的《企业级低代码开发平台技术要求》(T/SZAS 77—2024)为该领域提供了重要的规范与指引。深入剖析其核心要点,对于理…...
AI一键生成3D动画:腾讯最新方案,为小程序带来革命性变化
随着3D技术的快速发展,将静态的3D模型转化为能够生动展现各种动作的角色已经成为许多创作者和开发者梦寐以求的能力。然而,在过去,这一过程往往需要大量的手动工作和技术积累。现在,腾讯推出了一项创新的技术——AI一键生成3D动画,它不仅极大地简化了流程,还显著提高了效…...
AD软件如何快速切换三维视图,由2D切换至3D,以及如何恢复
在Altium Designer软件中,切换三维视图以及恢复二维视图的操作相对简单。以下是具体的步骤: 切换三维视图 在PCB设计界面中,2D切换3D,快捷键按住数字键盘中的“3”即可切换; 快捷键ctrlf(或者vb快捷键也…...
【赵渝强老师】PostgreSQL的数据库
PostgreSQL的逻辑存储结构主要是指数据库中的各种数据库对象,包括:数据库集群、数据库、表、索引、视图等等。所有数据库对象都有各自的对象标识符oid(object identifiers),它是一个无符号的四字节整数,相关对象的oid都…...
opencv 区域提取三种算法
opencv 区域提取三种算法 1.轮廓查找 findContours()函数,得到轮廓的点集集合 cv::vector<cv::vector<Point>> contours;threshold(roiMat,binImg,m_pPara.m_nMinGray,m_pPara.m_nMaxGray,THRESH_BINARY);//膨胀处理Mat dilaElement getStructuringE…...
C++初阶(十六)--STL--list的模拟实现
目录 结点类的实现 迭代器类的模拟实现 迭代器类的模板参数说明 构造函数 *运算符重载 ->运算符的重载 运算符的重载 --运算符重载 !运算符重载 运算符重载 list类的模拟实现 成员变量 默认成员函数 构造函数 拷贝构造函数 赋值运算符重载 迭代器相关函数 …...
树莓集团:以人工智能为核心,打造数字化生态运营新典范
在当今数字化浪潮席卷全球的背景下,各行各业都在积极探索数字化转型的路径。作为数字产业的领军者,树莓集团凭借其深厚的技术积累和创新理念,在人工智能、大数据、云计算等前沿技术领域不断突破,成功打造了一个以人工智能为核心的…...
基于深度学习的卷积神经网络十二生肖图像识别系统(PyQt5界面+数据集+训练代码)
本研究提出了一种基于深度学习的十二生肖图像识别系统,旨在利用卷积神经网络(CNN)进行图像分类,特别是十二生肖图像的自动识别。系统的核心采用了两种经典的深度学习模型:ResNet50和VGG16,进行图像的特征提…...
Torchtune在AMD GPU上的使用指南:利用多GPU能力进行LLM微调与扩展
Torchtune on AMD GPUs How-To Guide: Fine-tuning and Scaling LLMs with Multi-GPU Power — ROCm Blogs 这篇博客提供了一份详细的使用Torchtune在AMD GPU上微调和扩展大型语言模型(LLM)的指南。Torchtune 是一个PyTorch库,旨在让您轻松地…...
ESLint
代码规范 一套写代码的约定规则;比如赋值符号左右是否需要空格,一句话结束是否要加;.... 代码规范错误 如果你的代码不符合standard的要求,ESLint(脚手架里配的东西)会告诉你哪个文件第几行错了 解决代码…...
小程序-基于java+SpringBoot+Vue的微信小程序养老院系统设计与实现
项目运行 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境:…...
如何具体实现商品详情的提取?
在电商领域,获取商品详情信息对于市场分析、价格比较、商品推荐等应用场景至关重要。本文将详细介绍如何使用Java编写爬虫程序,以合法合规的方式获取淘宝商品的详情信息,并提供详细的代码示例。 1. 环境准备 在开始编写爬虫之前,…...
antd table 自定义表头过滤表格内容
注意:该功能只能过滤可一次性返回全部数据的表格,通过接口分页查询的请自主按照需求改动哈~ 实现步骤: 1.在要过滤的列表表头增加过滤图标,点击图标显示浮窗 2.浮窗内显示整列可选选项,通过勾选单选或者全选、搜索框来…...
高效处理 iOS 应用中的大规模礼物数据:以直播项目为例(1-礼物池)
引言 在现代iOS应用开发中,处理大规模数据是一个常见的挑战。尤其实在直播项目中,礼物面板作为展示用户互动的重要部分,通常需要实时显示海量的礼物数据。这些数据不仅涉及到不同的区域、主播的动态差异,还需要保证高效的加载与渲…...
Maven - 优雅的管理多模块应用的统一版本号
文章目录 概述一、使用 versions-maven-plugin 插件1. 在主 pom.xml 中定义插件2. 修改版本号3. 回退修改4. 提交修改 二、使用占位符统一管理版本号1. 在主 pom.xml 中定义占位符2. 使用 flatten-maven-plugin 插件自动替换占位符3. 修改版本号4. 为什么这种方式更方便&#x…...
C++设计模式(观察者模式)
一、介绍 1.动机 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”,即一个对象的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵…...
【unity】WebSocket 与 EventSource 的区别
WebSocket 也是一种很好的选择,尤其是在需要进行 双向实时通信(例如聊天应用、实时数据流等)时。与 EventSource 不同,WebSocket 允许客户端和服务器之间建立一个持久的、全双工的通信通道。两者的区别和适用场景如下:…...
从ETL到DataOps:WhaleStudio替代Informatica,实现信创化升级
作者 | 白鲸开源 姜维 在数据集成和调度的领域,Informatica曾经是公认的权威工具。其强大的ETL功能、多年积累的市场经验,使其成为众多企业数据处理的核心工具。 然而,随着新一代大数据平台的迅速崛起,以及信创化改造的要求愈发严…...
第四十二篇 EfficientNet:重新思考卷积神经网络的模型缩放
文章目录 摘要1、简介2、相关工作3、复合模型缩放3.1、 问题公式化3.2、扩展维度3.3、复合比例 4、EfficientNet架构5、实验5.1、扩展MobileNets和ResNets5.2、EfficientNet的ImageNet结果5.3、EfficientNet的迁移学习结果 6、讨论7、结论 摘要 卷积神经网络(ConvNets)通常在固…...
[OpenHarmony5.0][Docker][环境]OpenHarmony5.0 Docker编译环境镜像下载以及使用方式
T. 已测试目录 主机类型主机版本Docker镜像版本结果WSL2Ubuntu22.04Ubuntu20.04PASSWSL2Ubuntu22.04Ubuntu18.04PASS R. 软硬件要求: 编译硬件需求:做多系统测试,磁盘500GB起步(固态)(机械会卡死),内存3…...
Web Worker 和 WebSocket的区别
Web Worker(消息传递机制) 定义:是为了在浏览器中提供多线程支持,允许 JavaScript 在后台线程运行,而不阻塞主线程。它非常适合执行耗时的计算任务或处理大量数据,避免主线程(通常是 UI 线程&a…...
vmware Ubuntu2004运行STAR-Searcher
github链接 安装ros noetic gazebo11 略 gazebo更新方法 sudo sh -c echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable lsb_release -cs main" > /etc/apt/sources.list.d/gazebo-stable.list wget https://packages.osrfoundation.org/gaz…...
04_JavaScript引入到文件
JavaScript引入到文件 嵌入到HTML文件中 <body> <script> var age 20 </script></body> 引入本地独立JS文件 <body> <script type"text/javascript" src"./itbaizhan.js"> </script></body> 引入网络来…...
计算机网络的功能
目录 信息交换 资源共享 分布式处理 可靠性增强 集中管理 信息交换 计算机网络最基本的功能之一是允许不同设备之间的数据通信。这包括电子邮件的发送和接收、即时消息的传递、文件传输等。通过网络,用户可以轻松地与全球各地的其他人进行沟通和协作。 信息交…...
38 基于单片机的宠物喂食(ESP8266、红外、电机)
目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52单片机,采用L298N驱动连接P2.3和P2.4口进行电机驱动, 然后串口连接P3.0和P3.1模拟ESP8266, 红外传感器连接ADC0832数模转换器连接单片机的P1.0~P1.…...
Git仓库迁移到远程仓库(源码、分支、提交)
单个迁移仓库 一、迁移仓库 1.准备工作 > 手动在电脑创建一个临时文件夹,CMD进入该目录 > 远程仓库上创建一个同名的空仓库 2.CMD命令:拉取旧Git仓库(包含提交、分支、源码) $ git clone --bare http://git.domain.cn/…...
Go语言压缩文件处理
目录 Go 语言压缩文件处理1. 压缩文件:Zip函数2. 解压文件:UnZip 函数3. 小结 Go 语言压缩文件处理 在现代的应用开发中,处理压缩文件(如 .zip 格式)是常见的需求。Go 语言提供了内置的 archive/zip 包来处理 .zip 文…...
Libevent库-http通信不同请求方式的处理
做项目的时候用到了http通信,同事用libevent库写的,特此记录后端从前端拿到消息后的处理方式 void CHTTPTest::request(const std::any & data) {// data 是从前端拿到的数据void *obj std::any_cast<void *>(data); // std::any是C17新标准…...
Vue3 v-if与v-show的区别
v-if 与 v-show 我们都可以在开发中用于条件渲染,在面试时也是个常考的题目 实现原理 v-if:是真正的条件渲染,当v-if true时,元素会被创建、渲染,并插入到dom树中,这个过程会耗费系统的资源,当…...
同时在github和gitee配置密钥
同时在github和gitee配置密钥 1. 生成不同的 SSH 密钥 为每个平台生成单独的 SSH 密钥。 # 为 GitHub 生成密钥(默认文件路径为 ~/.ssh/github_id_rsa) ssh-keygen -t rsa -b 4096 -C "your_github_emailexample.com" -f ~/.ssh/github_id_…...
Scala—数组(不可变数组Array、可变数组ArrayBuffer)用法详解
Scala集合概述-链接 大家可以点击上方链接,先对Scala的集合有一个整体的概念🤣🤣🤣 在 Scala 中,数组是一种特殊的集合类型,可以是可变的也可以是不可变的。 1. 不可变数组 在 Scala 中,不可变…...
Failed to find SV in PRN block of SINEX file (Name svnav.dat)
gamit 精密星历生成失败 gamit svnav.dat没更新 下载svnav.dat.allgnss 重命名成 svnav.dat ,替换到tables,即可。...
H.265流媒体播放器EasyPlayer.js无插件H5播放器关于移动端(H5)切换网络的时候,播放器会触发什么事件
EasyPlayer.js无插件H5播放器作为一款功能全面的H5流媒体播放器,凭借其多种协议支持、多种解码方式、丰富的渲染元素和强大的应用功能,以及出色的跨平台兼容性,为用户提供了高度定制化的选项和优化的播放体验。无论是视频直播还是点播&#x…...
Ubuntu上使用自带python创建虚拟环境
虚拟环境让项目之间的依赖关系更加清晰,也可以避免全局安装的包的版本冲突问题。 1.查看python Ubuntu上一般都是自带python的,查看python版本及指向(使用的话python要换成python3): ls -l /usr/bin | grep python 2.安装python虚拟环境工…...
对智能电视直播App的恶意监控
首先我们要指出中国广电总局推出的一个政策性文件是恶意监控的始作俑者,这个广电总局的政策性文件禁止智能电视和电视盒子安装直播软件。应该说这个政策性文件是为了保护特殊利益集团,阻挠技术进步和发展的。 有那么一些电视机和电视盒子的厂商和电信运…...
网络原理(一):应用层自定义协议的信息组织格式 HTTP 前置知识
目录 1. 应用层 2. 自定义协议 2.1 根据需求 > 明确传输信息 2.2 约定好信息组织的格式 2.2.1 行文本 2.2.2 xml 2.2.3 json 2.2.4 protobuf 3. HTTP 协议 3.1 特点 4. 抓包工具 1. 应用层 在前面的博客中, 我们了解了 TCP/IP 五层协议模型: 应用层传输层网络层…...
微软企业邮箱:安全可靠的企业级邮件服务!
微软企业邮箱的设置步骤?如何注册使用烽火域名邮箱? 微软企业邮箱作为一款专为企业设计的邮件服务,不仅提供了高效便捷的通信工具,更在安全性、可靠性和功能性方面树立了行业标杆。烽火将深入探讨微软企业邮箱的多重优势。 微软…...
matlab导出3D彩色模型(surface类转stl,并对白模上色)
在matlab中绘制3维图形时,需要将3维图形导出到PPT中展示。但是直接导出图片效果欠佳,无法全方位展示。 最近学习了如何将matlab中的图形导出为stl模型,然后再采用简单的方法对模型上色。 中间尝试过matlab导出stl、ply、3dm等多种格式&…...
【JavaScript】async /await异步详解2 promise举例
在 JavaScript 中,async 和 await 是处理异步操作的强大工具。结合 try...catch 语句,你可以优雅地处理异步操作中的错误。 基本用法 定义异步函数:使用 async 关键字。等待 Promise 解析:使用 await 关键字。错误处理ÿ…...
Android 设备使用 Wireshark 工具进行网络抓包
背景 电脑和手机连接同一网络,想使用wireshark抓包工具抓取Android手机网络日志,有以下两种连接方法: Wi-Fi 网络抓包。USB 网络共享抓包。需要USB 数据线将手机连接到电脑,并在开发者模式中启用 USB 网络共享。 查看设备连接信…...
封装类与封装函数
目录结构 src/ ├── utils/ │ ├── test.js │ ├── Calculator.js ├── views/ │ ├── Home.vue ├── App.vue 共同点:模块导出与模块引入 封装函数 场景 简单、轻量级和性能敏感的场景,适合快速开发和维护。 优 可维护性&…...
【java】接口幂等性的实现
文章目录 1. 引言介绍幂等性的概念为什么需要在Java接口中实现幂等性 2. 使用幂等表实现幂等性什么是幂等表如何设计幂等表示例:Java代码实现使用幂等表使用幂等表实现幂等性 3. 利用Nginx Lua 和 Redis实现幂等性Nginx和Lua的作用简介介绍Redis的SETNX命令架构设计…...
Leetcode 1.两数之和
题目意在对数组的快速查找 思路:哈希表 先创建一个哈希表,然后对数组进行遍历,iter代表用目标值依次减去遍历数组中的元素后得出的值,如果这个值在map中存在,则返回其索引和当前数组元素中的索引;若不存…...
GitLab指定用户分配合并权限
进入项目 -》 Project Settings Repository -》展开 Protected branches -》 添加要保护的分支,设置角色 管理用户角色权限 查看到不同用户的角色,一般设置Developer只有Merger Request权限,Maintainer还有Merge审批权限 GitLab 中的权限…...