.Net 下调试跟踪线程挂起和程序死循环

本文介绍了如何在.Net环境下通过编写监控线程,利用心跳机制和堆栈回溯来检测和定位线程挂起及程序死循环的问题。作者提出了一种心跳调用方法,当监控线程在指定时间内收不到心跳消息,便认为线程挂起,并通过StackTrace获取挂起位置。此外,还讨论了检测程序死循环的方法,通过计算CPU占有率来判断,并在找到可疑线程后进一步判断是否真的死循环。
摘要由CSDN通过智能技术生成

.Net 下调试跟踪线程挂起和程序死循环

作者:Eaglet

     .Net 下的程序调试相对C/C++要简单很多,少了那些令人头疼的指针越界的问题。不过当你的程序遇到如下问题时,依然非常棘手:

     1. 进程异常终止。解决方案见 .Net 下未捕获异常的处理

     2. 内存泄漏或者内存申请后程序始终没有释放。解决方案见 用 .NET Memory Profiler 跟踪.net 应用内存使用情况--基本应用篇  。如果通过自己编写的程序监控,我将在以后的文章中阐述。

     3. 线程因未知原因挂起,比如死锁。

     4. 程序死循环。

     本文将阐述如果编写程序对后两者故障实时跟踪并报告。

  •      首先我们需要一个单独的监控线程来监控需要监控的线程

     我做了一个监控类 ThreadMonitor,在开始监控之前,我们将监控线程的优先级设置为最高。

         public  ThreadMonitor()
        
{
            _MonitorThread 
=   new  Thread( new  ThreadStart(MonitorTask));
            _MonitorThread.Priority 
=  ThreadPriority.Highest;
            _MonitorThread.IsBackground 
=   true ;

        }
  •      接下来我们为这个线程提供几个公共方法

Start  方法让调用者启动监控

Register 方法用于将需要监控的线程注册到监控列表中

Heartbeat 方法后面说明

         ///   <summary>
        
///  Start monitor
        
///   </summary>

         public   void  Start()
        
{
            _MonitorThread.Start();
        }



        
///   <summary>
        
///  Monitor register
        
///   </summary>
        
///   <param name="monitorPara"> Monitor parameter </param>

         public   void  Register(MonitorParameter monitorPara)
        
{
            Debug.Assert(monitorPara 
!=   null );
            Debug.Assert(monitorPara.Thread 
!=   null );

            
if  (GetTCB(monitorPara.Thread)  !=   null )
            
{
                
throw   new  System.ArgumentException( " Register repeatedly! " );
            }


            
lock  (_RegisterLock)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值