首页 > 其他分享 >12月26日总结

12月26日总结

时间:2023-12-28 11:46:37浏览次数:38  
标签:总结 26 12 dll 死锁 源码 线程 Net 调试

一、简介
    今天是《Net 高级调试》的第十五篇文章,这个系列的文章也快结束了,但是我们深入学习的脚步还不能停止。上一篇文件我们介绍了C# 中一些锁的实现逻辑,并做到了眼见为实的演示给大家它们底层是如何实现的,今天这篇文件就主要介绍一些如何查找和解决在项目调试中遇到的锁的问题,比如:死锁、孤立锁、线程中止和终结期挂起,我们会看到表象是什么,也会做到遇到这样问题,我们如何解决问题,我们每一个操作都能做到有的放矢。我们学了锁的实现,现在又要学习有关锁的解决办法,就是让我们做到知其一,也要知其二,这些是 Net 框架的底层,了解更深,对于我们调试更有利。当然了,第一次看视频或者看书,是很迷糊的,不知道如何操作,还是那句老话,一遍不行,那就再来一遍,还不行,那就再来一遍,俗话说的好,书读千遍,其意自现。
     如果在没有说明的情况下,所有代码的测试环境都是 Net Framewok 4.8,但是,有时候为了查看源码,可能需要使用 Net Core 的项目,我会在项目章节里进行说明。好了,废话不多说,开始我们今天的调试工作。

     调试环境我需要进行说明,以防大家不清楚,具体情况我已经罗列出来。
          操作系统:Windows Professional 10
          调试工具:Windbg Preview(可以去Microsoft Store 去下载)
          开发工具:Visual Studio 2022
          Net 版本:Net Framework 4.8
          CoreCLR源码:源码下载

二、基础知识

    在 C# 编程中会经常使用到 lock 锁,其实就是 Monitor 的语法糖,如果使用不好,经常会出现锁问题,经典的有:死锁、孤儿锁、线程中止和异常。这篇文章主要针对:死锁、孤儿锁和线程中止做介绍。

    1、死锁
        开中最长遇到的就是死锁,在没有【!dlk】(这个命令是 SOSEX.dll 功能,不是SOS.dll 功能,可能很多人会问,既然有这个命令,我们直接使用这个命令不就可以了吗,其实不然,dlk 包含在 SOSEX.dll 中,但是 SOSEX.dll只适合在 Net Framework 框架中使用,如果在 Net 5.0、6.0、7.0或者更高的版本是使用不了的)命令的加持下想解决问题还是有点困难的,但是手工分析和调试也是一个非常重要的基本功,也是十分考究C# 基本功的能力。
            思路如下:
                a、观察同步块表
                b、切换到锁线程,查看 clr!AwareLock-Enter+0x4a 在等待什么对象。
                
    2、孤儿锁(异常)        
         孤儿锁是因为开发者使用 Monitor.Enter 获取一个对象后,因为某种原因没有正确调用 Monitor.Exit,导致这个对象一直处于占用状态,其他线程也就无法进入了,强烈建议使用 lock 语法。

    3、线程的销毁
        线程销毁导致的 lock 锁未释放,寻找起来难度也很大,这种场景经常出现在和(非托管代码)交互的场景下,所以开发界限要明确,责任要清楚,代码做到高内聚低耦合,才会更安全。

三、源码调试
    废话不多说,这一节是具体的调试过程,又可以说是眼见为实的过程,在开始之前,我还是要啰嗦两句,这一节分为两个部分,第一部分是测试的源码部分,没有代码,当然就谈不上测试了,调试必须有载体。第二部分就是根据具体的代码来证实我们学到的知识,是具体的眼见为实。
    1、调试源码
        1.1、Example_15_1_1
View Code

        1.2、Example_15_1_2
View Code

        1.3、Example_15_1_3
View Code

标签:总结,26,12,dll,死锁,源码,线程,Net,调试
From: https://www.cnblogs.com/lmyy/p/17932366.html

相关文章

  • 开源数据血缘和元数据管理框架DataHub的血缘摄取 V0.12.1版本
    DataHUb的安装很简单:你有绿色上网就soeasy前置条件,你已经运行好DataHub整个Docker-Compse服务打开地址:http://host:9002/输入账号DataHub密码DataHub查看框架运行路线轨迹第一步源数据获取(1.1)点击这里(1.2)点击这里(1.3)点击这里{选择数据源的类型}:以MYSQL示例(1......
  • 【Java核心基础】Java中foreach方法核心总结
    Java中的foreach循环适用于多种场景:遍历数组、集合框架、处理列表数据等,可替代传统for循环,使代码更简洁。结合Lambda表达式和StreamAPI,可实现声明式数据处理,虽然不能直接遍历Map的键值对,但可遍历键或值集合,在多线程环境下,结合并行流使用foreach可并行处理数据。使用foreach能简......
  • 2023.12.28
    Antisymmetry水题???二分+哈希:对于每两个字符中间的空隙二分左右的长度,判断条件是左边的异或后的字符串与右边的没异或的字符串相不相等。不是水题。。。manacher:方法很简单,就是\(1\)对应\(0\),\(0\)对应\(1\)直接硬跑。至于为什么对:我们设在回文串中两个以对称轴对称的位......
  • 12.27
    软件构造实验作业实验名称:班级:信2105-1    学号:20214145    姓名:粘艺凡        实验一:百度机器翻译SDK实验一、实验要求百度机器翻译SDK实验(2023.11.29日完成) 参考资料:https://ai.baidu.com/ai-doc/index/MT    https://cloud.baidu.com/doc/MT/inde......
  • 12.27每日总结
    using System; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 实验1_1 {     class Program     {         static void Main(string[]args)         { ......
  • 新手为什么跟着大型机构交易?fpmarkets总结理由
    正所谓方向不对努力白费,这也就是为什么fpmarkets建议新手在刚开始的时候,跟着大型机构进行交易。这些大型机构包括中央银行、巨额对冲基金、投资和保险公司等等,首先fpmarkets认为这些大型机构的交易量巨大,能够影响市场的走势。让我们来看看中央银行、巨额对冲基金、投资和保险公司是......
  • 11.27每日总结
    今日完成所有大作业实验  实验一:百度机器翻译SDK实验一、实验要求实验一:百度机器翻译SDK实验(2023.11.29日完成)  任务一:下载配置百度翻译Java相关库及环境(占10%)。    任务二:了解百度翻译相关功能并进行总结,包括文本翻译-通用版和文本翻译-词典版(占20%)。    ......
  • 12月27日打卡
    c#学生信息管理系统usingSystem;usingSystem.Configuration;usingSystem.Data;usingSystem.Data.SqlClient;usingSystem.Drawing;usingSystem.Windows.Forms;namespaceStuManger{publicpartialclassForm1:Form{publicstaticboolisLog......
  • 12.27阅读笔记《软件需求分析》
    许多工程项目不能按时完成或者最后导致失败的一个很大的原因就是弄不清需求是什么,不能准确理解客户的需求意图,所以前期做好需求调研是一件非常重要的工作,是一件与系统代码开发占有同等比重的工作。读这本书的同时,要注意实践过程,不必非得要从一个新项目开始应用,可以找一个以前......
  • Unreal入门,开关04,蓝图通讯的几种方式(总结)
    1.直接调用,一开始做的开关就是这种方式,在地图编辑的时候给开关对象设置好关联的灯的引用,触发的时候直接调用灯提供的开关函数即可1.1给ActorSwitch添加一个ObjectReference成员1.2在地图编辑器中初始化这个成员,关联到ActorLight1.3在Overlap事件中通过ActorLight的引......