如何定位windows应用程序占用CPU最高的线程

工作中发现手中一个C#程序空闲状态占用CPU过高(25%左右),想定位到底哪个线程陷入了“死”循环。
当然可以直接看源码查找,更简单更快的办法是用ProcessExplorer工具。
以下以一 个C#控制台简短程序演示一下用法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace ConsoleApp1
{
     
    class Program
    {
     
        static void Main(string[] args)
        {
     
            var thread1 = new Thread(ThreadRun1);
            var thread2 = new Thread(ThreadRun2);
            var thread3 = new Thread(ThreadRun3);
            var thread4 = new Thread(ThreadRun4);
            thread1.Start();
            thread2.Start();
            thread3.Start();
            thread4.Start();
            
            ConsoleKey getkey = Console.ReadKey().Key;
            if (getkey == ConsoleKey.Enter)
            {
     
                Console.WriteLine("enter pressed!");
                //Environment.Exit(0);
            }
            //thread1.Abort();
            Environment.Exit(0);
        }

        private static void ThreadRun1()
        {
     
            Console.WriteLine("---------开始了线程1---------");
            while (true)
            {
     
                //Thread.Sleep(1000);//wait            
            }
            //Console.WriteLine("---------线程1结束---------");
        }
        
        private static void ThreadRun2()
        {
     
            Console.WriteLine("---------开始了线程2---------");
            while (true)
            {
     
                Thread.Sleep(2000);//wait            
            }
            //Console.WriteLine("---------线程3结束---------");
        }
        private static void ThreadRun3()
        {
     
            Console.WriteLine("---------开始了线程3---------");
            while (true)
            {
     
                Thread.Sleep(3000);//wait            
            }
            //Console.WriteLine("---------线程3结束---------");
        }
        private static void ThreadRun4()
        {
     
            Console.WriteLine("---------开始了线程4---------");
            while (true)
            {
     
                Thread.Sleep(4000);//wait            
            }
            //Console.WriteLine("---------线程4结束---------");
        }
    }
}

示例除了主线程之外,还启动了4个线程,其中thread1没有Sleep,将会占用大量cpu时间。编译执行,再打开
ProcessExplorer工具,可看到示例进程:ConsoleApp1.exe,占用25%左右的cpu时间。
如何定位windows应用程序占用CPU最高的线程_第1张图片
双击ConsoleApp1.exe,弹出属性窗口:
如何定位windows应用程序占用CPU最高的线程_第2张图片
占用cpu最大的线程,Tid为16612,双击弹出如下stack窗口:
如何定位windows应用程序占用CPU最高的线程_第3张图片
ThreadRun1清晰可见,这就是thread1的线程执行方法,这样占用过多cpu时间的线程被找到了。ProcessExplorer确实锋利!

你可能感兴趣的:(C#)