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

使用 Process Explorer 和 Windbg 排查软件线程堵塞案例分享

目录

1、问题说明

2、线程堵塞的可能原因分析

3、使用Windbg和Process Explorer确定线程中发生了死循环

4、根据Windbg中显示的函数调用堆栈去查看源码,找到问题

4.1、在Windbg定位发生死循环的函数的方法

4.2、在Windbg中查看变量的值去辅助分析

4.3、是循环计数值没有累加导致的

5、可以从动态调试的Windbg中导出dump文件

6、最后


C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125529931C/C++基础与进阶(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_11931267.htmlVC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/124272585C++软件分析工具从入门到精通案例集锦(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/131405795开源组件及数据库技术(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_12458859.html网络编程与网络问题分享(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_2276111.html       软件运行过程中有线程发生堵塞,是时常发生的事,最近就遇到一个典型的案例,虽然分析过程不是很复杂,但很有代表性,在这里给大家分享一下这个问题的详细排查过程,希望能给大家提供一个借鉴或参考。使用Process Explorer和Windbg排查软件线程堵塞问题

1、问题说明

       某天,客户在使用我们软件的过程中遇到了问题,在其Windows10系统中运行我们的客户端软件,加入了一个会议,一直在开会,没有做其他的操作,中间某个时间点用鼠标去点击软件窗口时发现点击没反应,好像是软件UI界面卡死了!但会议窗口中还能看到正在动的远端视频,能听到远端的声音,应该是UI线程卡死了,其他线程还在正常运行。这个问题比较严重,无法操作软件界面了,如果领导那边出现这样的问题,就比较麻烦了。于是联系到我们,希望我们尽快协调研发人员排查定位一下。

       我们研发这边接到任务后,和客户取得了联系,通过远程软件远程连到他的电脑上。我们初步怀疑是软件的UI界面所在的主线程卡死或堵塞了,于是将SPY++、Process Explorer和Windbg等工具拷贝到客户的电脑上准备详细分析一下。


       在这里,给大家重点推荐一下我的几个热门畅销专栏:

专栏1:(该专栏订阅量接近350个,有很强的实战参考价值,广受好评!专栏文章持续更新中,预计更新到200篇以上!)

C++软件调试与异常排查从入门到精通系列文章汇总icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125529931

本专栏根据近几年C++软件异常排查的项目实践,系统地总结了引发C++软件异常的常见原因以及排查C++软件异常的常用思路与方法,详细讲述了C++软件的调试方法与手段,以图文并茂的方式给出具体的实战问题分析实例,带领大家逐步掌握C++软件调试与异常排查的相关技术,适合基础进阶和想做技术提升的相关C++开发人员!

专栏中的文章均是通过项目实战总结出来的(通过项目实战积累了大量的异常排查素材和案例),有很强的实战参考价值!专栏文章还在持续更新中,预计文章篇数能更新到200篇以上!

专栏2: 

C/C++基础与进阶(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_11931267.html

以多年的开发实战为基础,总结并讲解一些的C/C++基础与进阶内容,以图文并茂的方式对相关知识点进行详细地展开与阐述!专栏涉及了C/C++领域的多个方面的内容,同时给出C/C++及网络方面的常见笔试面试题,并详细讲述Visual Studio常用调试手段与技巧!

专栏3: 

开源组件及数据库技术icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_12458859.html

以多年的开发实战为基础,分享一些开源组件及数据库技术! 


2、线程堵塞的可能原因分析

       软件为了并发处理事务一般都使用了多线程,如果代码处理不当,可能就会出现线程堵塞或卡死问题。一般是个别线程的堵塞,其他线程还是正常执行的,发生堵塞的线程中处理的业务出现异常。

       对于客户端软件,一旦有线程发生异常,我们可以通过软件界面的异常表现感知到,然后通过日志去大概地确定发生异常的业务线程。在本例中,UI界面不能操作了,判断应该是UI界面所在的主线程堵塞了会议中音视频的解码播放是在底层模块的其他线程中进行的,这些线程是正常运行的,所以还能看到视频画面、听到会议中的声音。

       导致线程发生堵塞或卡死的原因主要有两种

1)死锁:软件中多线程发生了死锁,某个线程需要获取某个锁,但因为死锁导致该锁一直没释放,导致线程一直卡在WaitForSingleObject等等待函数接口上没返回,所以线程卡住了;
2)死循环:当前线程中某个函数中发生了死循环,接口调用一直没返回,导致线程卡住了。如果是死循环,还会导致一个现象,死循环会占用大量的CPU时间片,导致程序进程占用较高的CPU,用Process Explorer工具则可以看到某个线程的CPU占用的特别高,这个线程就是发生死循环的线程。

       在本案例中,出问题的是UI客户端软件,客户端界面没法操作了,可能是界面所在的UI线程(UI程序的主线程)发生了堵塞,可能是死锁或死循环导致的UI界面没法操作,还有另外一个原因,可能是窗口被disable了,窗口之前在执行某个操作时被disable了(比如弹出了一个模态框),在执行完操作后出现异常,没有将窗口恢复到enable状态,这个问题场景我们以前在项目中遇到过几次。我们可以用SPY++工具查看一下当前不能操作的窗口属性,如果是当前的窗口被disable导致窗口不能操作的,那么使用SPY++查看的窗口属性中应该能看到 WS_DISABLED 窗口风格,如下所示:

本例中界面不能操作不是窗口被disable导致的

       对于腾讯会议、企业微信、字节飞书、阿里钉钉等这类Windows桌面客户端软件,UI界面所在的线程称为UI线程,也是软件的主线程。如果UI界面或窗口不能操作了,可能就是UI线程出问题,发生堵塞了。

在Windbg中,被分析的软件有多个线程,线程除了有线程id,还有个线程编号,编号从0开始,UI主线程的编号就是0,Windbg切换线程的命令~ns中的n就是线程编号。

3、使用Windbg和Process Explorer确定线程中发生了死循环

       当时软件的UI窗口不能操作了,使用SPY++查看窗口属性,窗口并没有被disable掉,所以基本可以断定,UI界面所在的UI线程发生堵塞了。

       那这个线程堵塞是死锁引起的,还是死循环引起的呢其实要确定这个问题,很简单,当前程序进程还在的,只需要将Windbg附加到问题进程上,切换到0号UI主线程(上面已经讲了,UI程序的UI界面就在UI主线程中),然后查看该线程的函数调用堆栈,如果堆栈中调用了WaitForSingleObject或NtWaitForAlertByThreadId(进入临界区时会调用该函数)等等待函数时,就能确定是线程发生死锁了。

       这个地方需要提一下,线程堵塞和程序崩溃是两个完全不同的概念和场景,要注意区分一下

1)对于堵塞,堵塞只是发生在个别线程中,其他线程还是正常的,程序进程没有退出,进程还在的,此时可以将Windbg附加到进程上调试的。
2)对于程序崩溃,如果没弹出崩溃提示框,程序直接闪退,程序进程就不存在了,就没有机会将Windbg附加到进程上分析了。如果程序没有生成dump文件,只能在下次运行程序时将Windbg附加到进程上动态调试(Windbg和目标程序一起跑),然后去复现崩溃,一旦程序发生崩溃,Windbg就会感知到并中断下来,就可以分析了。此外,如果程序崩溃时弹出了系统报错提示框,只要不将该提示框点掉,则进程还在的,此时还有机会将Windbg附加到进程上进行分析的,我们在项目中遇到过这样的场景。

       将Windbg附加到当前出问题的程序进程上,使用~0s命令切换到UI线程中,然后输入kn命令查看UI线程此刻的函数调用堆栈,如下所示:

因为没有加载pdb符号文件,所以堆栈中看不到具体的函数名。于是使用lm命令查看堆栈中dll模块的时间戳,到我们的文件服务器上找到对应时间点的pdb文件(我们已经将各个版本的安装包、二进制文件和pdb文件保存到文件服务器上,维护起来了),然后将pdb文件路径设置到Windbg中,重新执行~0s和kn命令查看UI线程的详细函数调用堆栈信息,如下所示:

加载pdb文件后,调用堆栈中就可以看到具体的函数名了,但没有看到WaitForSingleObject或NtWaitForAlertByThreadId(进入临界区时会调用该函数)等等待函数的调用,所以基本可以断定UI线程的堵塞和死锁没有关系

       基本只有一种可能,UI线程中的某个函数发生死循环了。死循环就是一直在执行代码,会占用大量的CPU时间片,死循环所在的线程会占用较高的CPU比例,直接导致程序进程占用较高的CPU。这个我们可以使用Process Explorer工具核验一下,打开Process Explorer,在进程列表中找到当前出问题的进程,然后双击该进程条目,查看进程的属性,在弹出的属性页面中点击Threads标签页,在该页面中可以查看到当前进程的各个线程信息,包括线程占用的CPU比例以及线程此刻的函数调用堆栈。

Process Explorer查看线程的函数调用堆栈可能不准确,可以使用另一个类似的工具Process Hacker,这个工具看线程的函数调用堆栈比较准确!

       查看到如下的线程列表:

果然看到了一个线程占用了20%的CPU,但只能看到线程号,我们如何确定这个线程就是当前出问题的UI主线程呢?

       其实很简单,我们可以回到Windbg中,使用~命令打印出当前问题进程的所有线程,如下所示:

我们上面讲了,UI应用程序的UI主线程在Windbg中的线程序号就是0,看着上述线程列表,第一个条目就是0号线程,就是UI主线程,找到其对应的线程id为0x2e20(16进制),转换成10进制数据为:11808,即UI线程的线程id为11808,然后跳回到Process Explorer的线程列表页面,占用CPU高的线程就是UI主线程。所以,可以确定UI线程中有函数发生死循环了

4、根据Windbg中显示的函数调用堆栈去查看源码,找到问题

       确定UI线程发生了死循环,下面只要根据Windbg中显示的UI线程的函数调用堆栈,去查看C++源码去分析为什么出现死循环就可以了。

       回到Windbg中,使用~0s命令切换到UI线程中,然后输入kn命令查看UI线程的函数调用堆栈,如下所示:

之前已经设置pdb到windbg中了,所以堆栈中显示了详细的函数名和代码行号,看到最后调用的一个函数是xxxlib!LoginManager::OnSrvAddrsChangedNtf。

4.1、在Windbg定位发生死循环的函数的方法

       这个地方说几个关于使用Windbg排查死循环的技巧。

我们当前的问题相对较简单,没用到此处提的方法。大家后面可能会用到,所以在此说明一下。

       如果当前要确定当前线程是否发生死循环,可以尝试多次输入g命令,让程序继续跑,然后再break中断下来,如果每次堆栈都是一样的话,可能发生死循环了。但这个需要我们根据调用堆栈辨别一下,不是堆栈一样就一定是死循环,比如我们的某个业务线程就在循环执行业务,每次查看的堆栈肯定是一样的,这不是程序中发生了死循环。业务线程中虽然是个循环,但中间会人为sleep一下,不让线程跑满。

       此外,我们在Windbg中可以使用bp命令设置断点,比如可以在函数调用堆栈中的多个函数中设置断点,然后输入g命令让程序继续跑,看都命中了哪些函数中的断点,这样就能确定死循环发生在哪个函数中了。

Windbg中支持设置断点,相关的命令如下:

1)bp:添加断点;

2)bc:清除断点;

3)bl:列出断点;

4)ba:设置数据断点。

这几个命令的详细说明及使用方法,可以查看Windbg帮助文档,文档中有相关的示例可以参考。

4.2、在Windbg中查看变量的值去辅助分析

       以前我们多次讲过,可以尝试在Windbg中查看函数中局部变量或者函数所在类的成员变量的值,某些变量的值可能是分析问题的关键线索。在Windbg中查看变量的值有几个场景,此处说明一下:

1)当前用Windbg分析的是小dump文件(程序中安装的异常捕获模块捕获到的,文件比较小,可能就几MB大小),dump文件中只保存了少部分变量的值,能不能看到自己想看的变量的值,要看运气的。
2)当前用Windbg分析的是全dump文件(从Windows任务管理器中导出的或者从正在动态调试的Windbg中使用.dump命令导出的),全dump保存了所有内存信息,其大小接近当前进程占用的用户态虚拟内存的大小,可以看到所有变量的值。

如果要查看程序中全局变量的值,可以使用x命令去搜索,前提是要有pdb符号文件,因为pdb文件中有变量的符号信息。

       当前函数调用堆栈显示的最后一个函数是LoginManager::OnSrvAddrsChangedNtf,代码如下:

估计是函数中的for循环发生了死循环,for循环的条件中访问了TServerAddrs_Api结构体变量的dwCount成员的值,是不是这个dwCount值有问题?是一个异常大的值,导致循环一直跳不出来?于是想查看该指针变量的值,于是点击函数调用堆栈前面的序号:

将所在函数的栈展开:

只能看到函数所在类对象指针this值,但我们想看TServerAddrs_Api* ptServerAddrs指针变量展开的结构体对象中的值。并没有显示,但该结构体指针对象的值就是wParam值,wParam值是能看到的,所以我们是有办法看到TServerAddrs_Api* ptServerAddrs指针变量展开的结构体对象中的值的。

       我们把wParam局部变量中的值0x336200a0当成指针变量TServerAddrs_Api* ptServerAddrs的值去解析,需要使用Windbg的一个较复杂的命令,但我们并没有记这个命令,该怎么办呢?我们点击this指针的超链接:

这个超链接自动生成查看这个指针中变量的值的Windbg命令并执行该命令,我们直接借鉴这个自动生成的命令:

dx -r1 ((xxxlib!LoginManager *)0x55a8cc0)

将之改成:

dx -r1 ((xxxlib!TServerAddrs_Api *)0x336200a0)

然后执行该命令:

可以看到dwCount值为1,所以底层传上来的数据不是异常值,不是上面假定的问题。

4.3、是循环计数值没有累加导致的

       我们继续查看函数pcmt_mtclib!LoginManager::OnSrvAddrsChangedNtf:

这个接口是处理底层模块投递上来的消息的(消息的处理函数),乍一看函数没有明显问题,难道是底层一直在抛这个消息,导致我们的代码一直在执行,导致CPU占用高?

       我甚至找来了维护底层模块的同事,让他们看日志,看看是不是底层一直在持续抛同一个消息。同事并没有找到问题,后来我无意中瞄了一下代码,居然是for循环中索引值没有累加导致的如下所示:

没有对索引值进行自加操作,导致了死循环。这么简单的问题,居然如此动干戈!属实不应该啊!

5、可以从动态调试的Windbg中导出dump文件

       当前我们到客户的电脑上将Windbg附加到目标进程上调试时,如果一时半会没查出问题,我们不能一直占用别人的电脑,他们还有自己的事情,我们可以使用.dump命令将进程的上下文信息导出到dump文件中:

.dump /ma D:\1214.dmp

然后将dump文件发回去,我们事后再去详细分析。

6、最后

       这个案例给我们展示了如何使用工具高效地排查软件运行过程中遇到的问题,虽然不复杂,但讲到了使用Windbg等工具的多个细节,有很大的参考价值!我们在研学技能时,要多关注细节,多关注分析问题的思路和办法。

相关文章:

使用 Process Explorer 和 Windbg 排查软件线程堵塞案例分享

目录 1、问题说明 2、线程堵塞的可能原因分析 3、使用Windbg和Process Explorer确定线程中发生了死循环 4、根据Windbg中显示的函数调用堆栈去查看源码,找到问题 4.1、在Windbg定位发生死循环的函数的方法 4.2、在Windbg中查看变量的值去辅助分析 4.3、是循环…...

“智慧”千里眼助力水泵站

泵站是为水提供势能和压能,解决无自流条件下的排灌、供水和水资源调配问题的唯一动力来源,在工农业用水、防洪、排涝和抗旱减灾等方面发挥着重要作用。一旦出现异常,对经济生产将造成难以估量的损失,给水利安全管理造成负担。因此…...

C++多态性——(5)运算符重载(第二节)

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 身先才能率人,律己才能服人…...

ES -极客学习

Elasticsearch 简介及其发展历史 起源 Lucene 于 Java 语言开发的搜索引擎库类创建于 1999 年,2005 年成为 Apache 顶级开源项目Lucene 具有高性能、易扩展的优点Lucene 的局限性 只能基于 Java 语言开发类库的接口学习曲线陡峭原生并不支持水平扩展原生并不支持水…...

【大厂秘籍】系列 - Java多线程面试题

Java多线程面试题 友情提示,看完此文,在Java多线程这块,基本上可以吊打面试官了 线程和进程的区别 进程是资源分配的最小单位,线程是CPU调度的最小单位 线程是进程的子集,一个进程可以有很多线程,每条线…...

vue实现画笔回放,canvas转视频播放功能

示例图&#xff1a; 一、vue2版本 <template><div class"canvas-video"><canvasref"myCanvasByVideo"class"myCanvas"id"myCanvasByVideo":width"width":height"height"></canvas><d…...

Docker中镜像的相关操作

1.辅助操作 docker version&#xff1a;用查看docker客户端引擎和server端引擎版本信息。 docker info&#xff1a;用来查看docker引擎的详细信息。 docker --help&#xff1a;用来查看帮助信息。 2.镜像Image docker images&#xff1a;查看当前本地仓库中存在哪些镜像。 …...

[python]python利用pyaudio录制系统声音没有立体声混音怎么录制系统音频

当电脑没有立体声混音导致Python写代码无法使用pyaudio进行录制系统声音怎么办&#xff1f;查阅资料和安装驱动等方法都不行&#xff0c;难道没办法了吗&#xff1f;那为什么电脑其他软件可以做到呢&#xff1f;因此研究了一下pyaudio在没有立体声混音情况下确实无法录制声音&a…...

使用echarts的bmap配置项绘制区域轮廓遮罩

示例图 代码 <template><div id"map" style"width: 100%; height: 100vh"></div> </template><script> import * as echarts from "echarts"; import "echarts/extension/bmap/bmap"; export default…...

第3章 【课后习题】(完整版)

【3.18】写出下面程序的运行结果 //3.18写出下面程序的运行结果 #include <iostream> using namespace std; class test{public:test();~test() {};private:int i; }; test::test() {i25;for(int ctr0;ctr<10;ctr){cout<<"Counting at "<<ctr…...

redis安装与配置

目录 1. 切换到 root 用户 2. 搜索安装包 3. 安装 redis 4. 查看 redis 是否正常存在 5. 修改ip 6. 重新启动服务器 7. 连接服务器 1. 切换到 root 用户 通过 su 命令切换到 root 用户。 2. 搜索安装包 apt search redis 这里安装的是下面的版本&#xff1a; 3. 安装 …...

kotlin first/last/indexOf/elementAt

kotlin 中 first 是取集合元素中第一个元素 last 是取集合元素中最后一个元素 indexOf 根据元素寻找下标&#xff0c;默认是第一个 elementAt 根据下标找元素 下面写一个demo 说明下他们几个的使用 val list listOf("A", "D", "A", "…...

计算机网络——网络中要解决的问题

1. 从网络管理的角度看 1.1 配置管理 追踪所有部署的硬件和软件资源&#xff0c;包括设备配置和软件版本。 1.2 故障管理​​​​​ 监控设备的运行状态&#xff0c;以确保所有组件都正常工作&#xff0c;以及快速响应和修复任何故障。 1.3 计费管理 监控资源消耗并进行计费…...

初识STL

目录 ​&#x1f4a1;STL &#x1f4a1;STL六大组件 &#x1f4a1;三大组件介绍 &#x1f4a1;容器 &#x1f4a1;算法 &#x1f4a1;迭代器 &#x1f4a1;示例 &#x1f4a1;STL C STL&#xff08;标准模板库&#xff09;是一套功能强大的 C 模板类&#xff0c;提供了…...

程序员副业之无人直播助眠

介绍和概览 大家好&#xff0c;我是小黑&#xff0c;本文给大家介绍一个比较轻松简单的副业&#xff0c;无人直播助眠副业。 这个项目的核心就是通过直播一些助眠素材来赚钱。比如你可以放一些舒缓的雨声之类的&#xff0c;吸引观众进来。然后&#xff0c;咱们可以挂个小程序…...

imazing破解版百度云2.17.3(附激活许可证下载)

iMazing是一款强大的 iOS 设备管理软件&#xff0c;不管是 iPhone、iPad 或 iPod Touch 设备&#xff0c;只要将 iOS 设备连接到计算机&#xff0c;就可以处理不同类型的数据。 iPhone 和 iPad 备份 借助 iMazing 的独有 iOS 备份技术&#xff08;无线、隐私和自动&#xff09…...

VS+QT五子棋游戏开发

1、首先安装好VS软件和QT库&#xff0c;将其配置好&#xff0c;具体不在此展开说明。 2、文件结构如下图&#xff1a; 3、绘制棋盘代码&#xff0c;如下&#xff1a; void Qwzq::paintEvent(QPaintEvent* event) {QPainter painter(this);painter.setRenderHint(QPainter::An…...

SpringBoot中动态注册接口

1. 说明 接口注册&#xff0c;使用RequestMappingHandlerMapping来实现mybatis中动态执行sql使用github上的SqlMapper工具类实现 2. 核心代码片段 以下代码为spring动态注册接口代码示例 Autowired private RequestMappingHandlerMapping requestMappingHandlerMapping;publ…...

CSS 实现两个圆圈重叠部分颜色不同

这是期望实现的效果&#xff0c;由图可知&#xff0c;圆圈底图透明度是0.4&#xff0c;左侧要求重叠部分透明度是0.7&#xff0c;所以不能通过简单的透明度叠加来实现最右侧的效果。 这就需要另外新建一个图层来叠加在两个圆圈重叠上方。 直接看代码 .circle_hight {width: 1…...

【数据库系统概念】第7-14章集合

文章目录 第七章 数据库设计和E-R模型&#xff08;重点&#xff01;&#xff01;&#xff01;&#xff09;~~7.1 设计过程概览&#xff08;了解&#xff09;~~7.1.1 设计阶段7.1.2 设计选择 7.2 实体-联系模型&#xff08;重点掌握&#xff09;7.2.1 实体集7.2.2 联系集联系集的…...

Kibana

Kibana是一个针对Elastic Search的开源分析及可视化的平台&#xff0c;使用kibana可以查询、查看并与存储在ES索引的数据进行交互操作&#xff0c;可以理解为一个客户端的工具&#xff0c;比如mysql和navicat。 使用kibana能执行高级的数据分析&#xff0c;并能以图表、表格和地…...

C#使用 OpenHardwareMonitor获取CPU或显卡温度、使用率、时钟频率相关方式

C# 去获取电脑相关的基础信息&#xff0c;还是需要借助 外部的库&#xff0c;我这边尝试了自己去实现它 网上有一些信息&#xff0c;但不太完整&#xff0c;都比较零碎&#xff0c;这边尽量将代码完整的去展示出来 OpenHardwareMonitor获取CPU的温度和频率需要管理员权限 在没…...

K8S--- volumesvolumeMount

一、Volume 简介 在容器当中的磁盘文件(on-disk file )是短暂的(ephemeral),这会对重要的应用程序或者数据产生一些问题。当容器崩溃或停止时,会出现一个问题,即容器状态不会被保存,因此在容器生命周期内被创建或者修改的文件都将丢失。在容器崩溃期间,kubelet会以干净状…...

AntV-G6 -- 将G6图表应用到项目中

1. 效果图 2. 安装依赖 npm install --save antv/g6 3. 代码 import { useEffect } from alipay/bigfish/react; import G6 from antv/g6;const data {id: root,label: 利息收入,subLabel: 3,283.456,ratio: 3,children: [{id: child-a,label: 平均利息,subLabel: 9%,ratio:…...

第二百五十回

文章目录 1. 概念介绍2. 使用方法2.1 简单用法2.2 自定义用法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"三方包open_settings"相关的内容&#xff0c;本章回中将介绍另外一个三方包&#xff1a;bluetooth_enable_fork.闲话休提&#xff0c;让我们一起Talk Flu…...

如何把硬盘(分区)一分为二?重装系统的小伙伴不可不看

注意事项&#xff1a;本教程操作不当会导致数据丢失 请谨慎操作 请谨慎操作 请谨慎操作 前言 相信各位小伙伴都会切土豆吧&#xff0c;本教程就是教大家如何切土豆切得好的教程。 啊哈哈哈&#xff0c;开玩笑的。 比如你有一个D盘是200GB&#xff0c;想要把它变成两个100G…...

【AI视野·今日NLP 自然语言处理论文速览 第六十六期】Tue, 31 Oct 2023

AI视野今日CS.NLP 自然语言处理论文速览 Tue, 31 Oct 2023 (showing first 100 of 141 entries) Totally 100 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers The Eval4NLP 2023 Shared Task on Prompting Large Language Models a…...

解决Canvas画图清晰度问题

最近在开发Web端远程桌面的时候遇到的一个问题&#xff0c;解决记录一下&#xff0c;分享给各位有需要用到的朋友。 先吹下水&#xff1a;远程桌面的连接我们是通过Websocket连接后&#xff0c;后端不断返回远程端的界面二进制数据流&#xff0c;我接收到之后转为图像&#xf…...

zookeeper经典应用场景之分布式锁

1. 什么是分布式锁 在单体的应用开发场景中涉及并发同步的时候&#xff0c;大家往往采用Synchronized&#xff08;同步&#xff09;或者其他同一个JVM内Lock机制来解决多线程间的同步问题。在分布式集群工作的开发场景中&#xff0c;就需要一种更加高级的锁机制来处理跨机器的进…...

红队专题-Web安全/渗透测试-文件上传/下载/包含

文件上传/下载/包含 招募六边形战士队员利用目录穿越反弹SHELL实战测试2.2 提交报文修改检测3.2 文件内容检测绕过完整文件结构 检测 第四章&#xff1a;解析漏洞第一节 常见解析漏洞iis/nginx php fastcgi 取值错误 解析漏洞 &#xff08;配置错误&#xff09;nginx 文件名逻…...

wordpress自动插件下载/今天株洲最新消息

在 Elastic Stack 8.0 之前&#xff0c;我们使用 APM server 来采集 Application Monitoring (APM) 数据。随着 Elastic Agent 在 8.0 的推出&#xff0c;我们可以使用 Elastic Agent 来采集 APM 数据。如果你对 Elastic Stack 的 APM 还不是很熟的话&#xff0c;请阅读我之前的…...

网站备案大概需要多久/俄罗斯搜索引擎推广

Eidyzhang是一个大学辍学生&#xff08;修读2年&#xff09; &#xff08;20岁&#xff09;离开学校&#xff1b;&#xff08;21岁&#xff09;成立自己的第一家Newspaper广告公司; (21.22岁期间独立搭建很多Blog) .23岁发明即将全世界都在用的AOOOiA.Global; 23.24成为世界第一…...

腾云网站建设怎么样/项目平台

1、启动Redis&#xff1a;进入到Redis的安装目录&#xff0c;cmd→cd H:\\redis开启服务&#xff1a;redis-server --service-start停止服务&#xff1a;redis-server --service-stop卸载服务&#xff1a;redis-server --service-uninstall 2、连接Redis①、本地&#xff1a;re…...

视频网站怎么做网站引流/交换链接平台

动图&#xff0c;也叫“影图”&#xff0c;英文称为 Cinemagraph 或 Motionimage。文件格式常为传统的 GIF Graphics Interchange Format文件。动图的初衷就是为静态图片添加一些细微的、局部的运动&#xff0c;给人一种“世间静谧&#xff0c;唯它悄动”的感觉。◆ ◆ ◆历史…...

阜宁网站建设服务商/关键词优化需要从哪些方面开展

[MySQL 5.6] MySQL 5.6 online ddl 使用、测试及关键函数栈 http://mysqllover.com/?p547本文主要分为三个部分&#xff0c;第一部分是看文档时的笔记&#xff1b;第二部分使用sysbench简单测试了下性能损耗&#xff1b;第三部分阐述了关键函数栈&#xff0c;但未做深入前言 O…...

东莞建设网站公司简介/东莞seo技术

UnityEngine中有个已经设置好的属性 UnityEngine.Screen.width UnityEngine.Sreen.height转载于:https://www.cnblogs.com/zly24432/p/10361265.html...