写点什么

用 PostSharp 对.NET 做死锁检测

  • 2012-09-25
  • 本文字数:824 字

    阅读完需:约 3 分钟

AOP 框架 PostSharp 的开发公司 SharpCrafters 开发了一款即插即用的死锁检测工具包。只要在项目中增加一行代码,这个工具包就可以对 Mutex、Monitor、ReaderWriterLock 等大部分标准的基本锁机制进行死锁检测。

当线程等待锁超过 200 毫秒,工具包将执行一道死锁检测例程。如果检测到死锁,它会向受该死锁影响的所有线程扔出 DeadlockException。异常中详细报告了所有受影响的线程和锁,供用户分析并修复问题。

死锁检测本身并不十分困难,但需要将大量的刻板代码细致地插入到程序的各个部位。 PostSharp Threading Toolkit 使用 IL 重写技术自动地注入这些代码到锁语句周围。

有几点需要注意。PostSharp 用了十分保守的逻辑去防止误报;他们认为错误地扔出一个 DeadlockException 比一个没有被检测到的死锁更糟糕。而且,它不能用于非对称锁,例如 ManualResetEvent,、AutoResetEvent,、Semaphore 和 Barrier,因为“并不清楚哪个线程负责‘发信号’或‘释放’同步资源”。

它能处理的锁包括:

  • Mutex:WaitOne、WaitAll、Release
  • Monitor:Enter、Exit、TryEnter、TryExit(包括 C#关键字 lock;不支持 Pulse 和 Wait 方法)
  • ReaderWriterLock:AcquireReaderLock、AcquireWriterLock、ReleaseReaderLock、ReleaseWriterLock、UpgradeToWriterLock、DowngradeToReaderLock(不支持 ReleaseLock、RestoreLock)
  • ReaderWriterLockSlim:EnterReadLock、TryEnterReadLock、EnterUpgradeableReadLock、TryEnterUpgradeableReadLock、EnterWriteLock、TryEnterWriteLock、ExitReadLock、ExitUpgradeableReadLock、ExitWriteLock
  • Thread:Join

PostSharp Threading Toolkit 以 BSD 2-Clause 协议发布于 GitHub

查看英文原文 http://www.infoq.com/news/2012/09/PostSharp-Deadlock


感谢郭晓刚对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2012-09-25 23:172668

评论

发布
暂无评论
发现更多内容

如何远程Debug内网(或者防火墙后)的Java服务

石臻臻的杂货铺

Java debug 后端

让对外合作更高效,就用WeLink跨企业沟通

路过的憨憨

Fuzzing(模糊测试)技术,你真的了解吗?

云起无垠

Fuzzing(模糊测试)的前世今生(中)

云起无垠

【愚公系列】2022年12月 微信小程序-Component组件

愚公搬代码

12月月更

黄东旭:开发者的“技术无感化”时代,从 Serverless HTAP 数据库开始 | PingCAP DevCon 2022

PingCAP

TiDB

子查询优化之 Semi-join 优化 | StoneDB 研发分享 #2

StoneDB

MySQL HTAP 数据库· StoneDB 12 月 PK 榜

Fuzzing(模糊测试)的前世今生(上)

云起无垠

华为云数据库GaussDB(for Influx)揭秘:数据分级存储

路过的憨憨

升维数智化底座 迈向高质量发展

用友BIP

直播 | 数据仓库?数据湖?停止纠结,流批融合的极速 Lakehouse来了!

StarRocks

#数据库

面对当下最热的多模态,为什么这些业界和学界专家说“不必追热点”

小红书技术REDtech

观测云产品更新|应用性能新增服务清单功能;用户访问监测 Session 查看器调整;事件新增移动端跳转选项等

观测云

可观测性 观测云

AngularJS进阶(十三)JS利用正则表达式校验手机号

No Silver Bullet

正则表达式 AngularJS 12月月更

Fuzzing(模糊测试)的前世今生(下)

云起无垠

网络安全 漏洞挖掘 Fuzzing 模糊测试

2022-12-02:有a块草莓蛋糕,有b块芝士蛋糕,两人轮流拿蛋糕, 每次不管是谁只能选择在草莓蛋糕和芝士蛋糕中拿一种, 拿的数量在1~m之间随意, 谁先拿完最后的蛋糕谁赢。 返回先手赢还是后手赢。

福大大架构师每日一题

算法 rust 福大大

守护安全|AIRIOT城市天然气综合管理解决方案

AIRIOT

物联网 天然气

【Meetup 预告】OpenMLDB + MaxCompute:集成打通云上生态,高效构建 AI 应用

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

HIFIVE音加加 × 火山引擎:正版曲库+智能视频创作SDK,短视频全链路需求一站式解决!

曲多多(嗨翻屋)版权音乐

短视频 火山引擎 HIFIVE音加加 视频配乐 版权音乐

如何快速构建研发效能度量的指标体系?

Kyligence

数据分析 指标

初识华为云数据库GaussDB(for Cassandra

路过的憨憨

技术分享 | 将覆盖反馈融入黑盒模糊测试技术提升测试效率

云起无垠

如何借助低代码开发平台 YonBuilder 填补应用开发 “产能缺口”?

YonBuilder低代码开发平台

开发者 低代码

焱融全闪系列科普| 为什么 SSD 需要 NVMe?

焱融科技

云计算 高性能 nvme 文件存储 全闪存储

AngularJS进阶(十)AngularJS改变元素显示状态

No Silver Bullet

AngularJS 12月月更 元素状态

AngularJS进阶(十一)AngularJS实现表格数据的编辑,更新和删除

No Silver Bullet

表格 AngularJS 12月月更

Proxyless Mesh 在 Dubbo 中的实践

阿里巴巴中间件

阿里云 云原生 dubbo

云原生中的标准化

穿过生命散发芬芳

云原生 12月月更

OpenMLDB 实时引擎性能测试报告

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

ChaosBlade Java 场景性能优化,那些你不知道的事

阿里巴巴中间件

阿里云 云原生 ChaosBlade

数字化改变了什么?WeLink在实践中给出答案

路过的憨憨

用PostSharp对.NET做死锁检测_.NET_Jonathan Allen_InfoQ精选文章