1. 程式人生 > >使用Windbg除錯.Net應用程式

使用Windbg除錯.Net應用程式

 1. 解決線上.NET應用程式的如下問題:

  • 崩潰
  • CPU高
  • 程式異常
  • 程式Hang死

2. 安裝WinDbg:

3. 配置WinDbg:

執行WinDbg->選單->File->Symbol File Path->按照下面的方法設定_NT_SYMBOL_PATH變數:
在彈出的框中輸入“C:\MyCodesSymbols; SRV*C:\MyLocalSymbols*http://msdl.microsoft.com/download/symbols”(按照這樣設定,WinDbg將先從本地資料夾C:\MyCodesSymbols中查詢Symbol,如果找不到,則自動從MS的Symbol Server上下載Symbols)。另一種做法是從這個Symbol下載地址中

http://www.microsoft.com/whdc/devtools/debugging/symbolpkg.mspx,下載相應作業系統所需要的完整的Symbol安裝包,並進行安裝,

4. 利用WinDbg裡的adplus來獲取dump檔案。

 Dump檔案是程序的記憶體映象。可以把程式的執行狀態通過偵錯程式儲存到dump檔案中。

在WinDbg安裝目錄裡可以找到adplus.exe,把他拖入到命令列中,然後用命令

adplus.exe -hang -pn test.exe -o c:\dumps  // 抓取當前的dump檔案

adplus.exe -crash -pn test.exe -o c:\dumps  // 監聽應用程式,當crash時,獲取dump檔案

命令-pn :應用程式名,-p:應用程式pid,-odump檔案輸出路徑

5. 利用WinDbg載入dump檔案載入偵錯程式

執行WinDbg->選單->File->Open Cresh dump 開啟dump檔案,並載入.net偵錯程式

.loadby sos mscorwks  .Net 3.5版本及以下

.loadby sos clr  .Net 4.0

如果伺服器的.Net版本與本機不匹配需要伺服器版本的mscordacwks.dll檔案

並設定.sympath = mscordacwks_x86_x86_2.0.50727.3607.dl

6. WinDbg的基本命令

help  sos指令幫助

!threads  顯示所有執行緒

!dumpheap  顯示託管堆的資訊

!clrstack  顯示呼叫棧

!dumpobj  顯示一個物件的內容

!dumparray  顯示陣列

!syncblk  顯示同步塊

!runaway  顯示執行緒cpu時間

!gcroot  跟蹤物件記憶體引用

!pe  列印異常

7. WinDbg的使用

當我在Form中執行這段程式碼:

public Form1(){
			InitializeComponent();
			AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
		}
	private void UnhandledExceptionProc(object obj){
			try {
				throw new Exception("1st chance");
			} catch (Exception) {
				MessageBox.Show("after 1st");
			}
			int d = 0;
			int n = 1 / d;
}

並活動dump檔案


用windbg開啟dump檔案後輸入-pe:可以看到問題的所在。

異常如此重要,所以作業系統提供了對應的除錯功能,可以使用偵錯程式來檢視異常。異常發生後,作業系統在呼叫使用者態程式的異常處理函式前,會檢查當前使用者態程式是否有偵錯程式載入。如果有,那麼作業系統會首先把異常資訊傳送給偵錯程式,讓偵錯程式有觀察異常的第一次機會,所以也叫做first chance exception,偵錯程式處理完畢後,作業系統才讓使用者態程式來處理。 如果使用者態程式處理了這個異常,就沒偵錯程式什麼事了。否則,程式在unhandled exception崩潰前,作業系統會給偵錯程式第二次觀察異常的機會,所以也叫做second chance exception。

《Windows使用者態程式高效排錯》

分析以下程式碼:可以看出DummyObject 會佔用很多記憶體,甚至導致記憶體溢位

	private void MemeryLeakProc(object obj)
		{
			while (true) {
				for (int i = 0; i < 100 * 1024; i++) {
					DummyObject o = new DummyObject();
					list.Add(o);
				}
				Thread.Sleep(1000);
			}
		}

windbg命令:!dumpheap –stat 統計堆疊記憶體


執行緒Hang住的常見原因

-執行緒池或工作執行緒集中在某個耗時的工作當中,或者被其他執行緒鎖住

核心問題,找到被hang住的執行緒

!threads

~*e!clrstack

!synblk

lock (syncRoot) {
				int tp;
				int io;
				//ThreadPool.GetMaxThreads(out tp, out io);
				for (int i = 0; i < 100; i++) {
					Thread hangThread = new Thread(HangProc);
					hangThread.Start();
				}
				MessageBox.Show("Press to release lock");
			}
  private void HangProc(object obj)
  {
   lock (syncRoot) {
    n = 0;
   }
  }

CPU高

-如果與業務量沒有提升,有執行緒在長時間的處理

核心問題,找到佔用CPU的執行緒

!runaway

~*e!clrstack

執行緒死鎖出現的情況:

兩個鎖A,B,

一個執行緒已經拿到鎖A,申請鎖B,

另一個執行緒已經拿到鎖B,申請鎖A

核心問題:找到鎖定的執行緒

!threads

!syncblk

~*e!clrstack

•兩條指令可以解決大部分的問題 •!dumpheap –stat •~*e!clrstack

相關推薦

使用Windbg除錯.Net應用程式

 1. 解決線上.NET應用程式的如下問題: 崩潰CPU高程式異常程式Hang死2. 安裝WinDbg: 3. 配置WinDbg: 執行WinDbg->選單->File->Symbol File Path->按照下面的方法設定_NT_SYMBOL

.NET應用程式除錯:原理、工具、方法

閱讀目錄: 1.背景介紹 2.基本原理(Windows除錯工具箱、.NET除錯擴充套件SOS.DLL、SOSEX.DLL) 2.1.Windows除錯工具箱 2.2..NET除錯擴充套件包,SOS.DLL、SOSEX.DLL 2.3.除錯系統的基本流程及架構(.NETDAC概念、mscordacwks.

.NET應用程式除錯—原理、工具、方法

閱讀目錄: 1.背景介紹 2.基本原理(Windows除錯工具箱、.NET除錯擴充套件SOS.DLL、SOSEX.DLL) 2.1.Windows除錯工具箱 2.2..NET除錯擴充套件包,SOS.DLL、SOSEX.DLL 2.3.除錯系統的基本流程及架構(.NETDAC概念、msc

Windbg除錯.NET程式的資源洩漏

SyncBlocks to be cleaned up: 0  MTA Interfaces to be released: 0  STA Interfaces to be released: 0  ----------------------------------  generation 0 has 56

IIS 7.0 的 ASP.NET 應用程式生命週期概述

    文章:IIS 7.0 的 ASP.NET 應用程式生命週期概述 地址:https://msdn.microsoft.com/zh-cn/library/bb470252(v=vs.100).aspx 本主題介紹在 IIS 7.0 整合模式下執行以及與 IIS 7.0 或更高

使用IIS應用程式初始化來保持ASP.NET應用程式的活動

https://weblog.west-wind.com/posts/2013/Oct/02/Use-IIS-Application-Initialization-for-keeping-ASPNET-Apps-alive    2013年10月2日•來自毛伊島,HI• &

FileSystemWatcher 導致Mono ASP.NET應用程式CPU使用率比較高

大家都知道ASP.NET 網站應用程式(WebSite)可以自動檢測到你的ASP.NET應用的檔案修改,其中要使用到的就是監視磁碟上的檔案/目錄的更改,以便應用程式可以採取它認為必要檔案建立/刪除/修改事件的反應中的任何步驟的FileSystemWatcher 類。 Mono的 FileSystemWatc

IDA6.6遠端除錯Android應用程式的一點總結

新接觸Android安全,一直在逃避總結,因為懶。。。雖然網上有大把的資料,但是很多都是轉載,格式什麼的亂七八糟的,對於有嚴重潔癖的我不能忍。現在剛接觸,以後經常用到的東西,還是總結一下加深印象吧,省得總忘,好記性不如爛筆頭。 具體環境的搭建這些基礎的東西這裡就不再說了,J

.Net 應用程式config的配置

檔案的目錄(若要對config配置檔案進行操作,需要新增對的引用) 呼叫方式  //獲取配置節資料   var obj= System.Configuration.ConfigurationManager.GetSection("myConfigSection

新思想、新技術、新架構——更好更快的開發現代ASP.NET應用程式

在部落格園學習很長時間了,今天終於自己也開通了部落格,準備分享一些感悟和經驗。首先感謝部落格園園主提供了這麼好的程式設計師學習交流平臺,也非常感謝張善友、dax.net、netfocus、司徒正美 等技術大牛的無私分享,從他們身上學到了很多。還有我最近一直關注的田園裡的蟋蟀,分享了很多新的技術和思想方法,在此

新思想、新技術、新架構——更好更快的開發現代ASP.NET應用程式(續1)

今天在@張善友和@田園裡的蟋蟀的部落格看到微軟“.Net社群虛擬大會”dotnetConf2015的資訊,感謝他們的真誠付出!真希望自已也能為中國的.NET社群貢獻綿薄之力。   上週星期天開通了部落格併發布了第一篇文章《新思想、新技術、新架構——更好更快的開發現代ASP.NET應用程式》,彙集了一些比較流

【譯】ASP.NET應用程式和頁面生命週期

概述 大體上的兩步處理流程 ASP.NET環境的建立 通過MHPM觸發的事件處理請求 在什麼事件中我們可以做什麼? 一個簡單的示例 詳解ASP.NET頁面事件

Mac下無線除錯Android應用程式

最近一段時間都在忙活著寫Android的專案,所以沒有多少時間寫部落格了,誒,不過還是要儘量的記下自己平日所學到的點滴,因為用的老款的MBP只有兩個USB口,即使是接了一個USB Hub也是捉襟見肘,而且USB線除錯程式太麻煩,所以乾脆鼓搗一下無線除錯,說起來還是很簡單的,

經驗之談 ---- ASP.NET應用程式MVC5模式下的簡單例項專案

 剛開始做ASP.NET應用程式的時候,自己一臉蒙B,具體的程式流程都不懂,所以自己打算寫一個最簡單的專案來看看ASP.NET MVC專案的具體流程。 若有寫得不好的,還望指出. 目錄結構如下圖所示: 在企業中開發的時候需要自建Area(領域),所以我把最初專案

設計.NET應用程式資料訪問層的五大原則

摘要:大多數使用.NET框架元件工作的開發人員的一個核心工作是實現資料訪問功能,他們建立的資料訪問層(data access layer)是應用程式的精華部分。本文概述了使用Visual Studio .NET和.NET框架元件建立資料訪問層需要考慮的五個想法。這些技巧包括通過使用基類(base class)

在ASP.NET應用程式中使用身份模擬(Impersonation)

摘要 預設情況下,ASP.NET應用程式以本機的ASPNET帳號執行,該帳號屬於普通使用者組,許可權受到一定的限制,以保障ASP.NET應用程式執行的安全。但是有時需要某個ASP.NET應用程式或者程式中的某段程式碼執行需要特定許可權的操作,比如某個檔案的存取,這時就需要給

使用Memcached提高.NET應用程式的效能

在應用程式執行的過程中總會有一些經常需要訪問並且變化不頻繁的資料,如果每次獲取這些資料都需要從資料庫或者外部檔案系統中去讀取,效能肯定會受到影響,所以通常的做法就是將這部分資料快取起來,只要資料沒有發生變化每次獲取這些資料的時候直接從記憶體中區獲取效能肯定會大大地提高。在.N

如何在真機上除錯Android應用程式(圖文詳解)

C:\Users\xxxxxx>netstat -ano | findstr "5037" TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 4236 TCP 127.0.0.

【Azure DevOps系列】Azure DevOps使用Docker將.NET應用程式部署在雲伺服器

## Docker持續整合 本章我們要實現的是通過我們往程式碼倉庫push程式碼後,我們將每次的push進行一次docker自動化打包釋出到docker hub中,釋出到之後我將進行部署環節,我們將通過ssh方式將我們的.NET應用程式pull並run到我們的雲伺服器上。 Dockerfile 如下所示:

使用 dotnet-monitor 分析.NET 應用程式

dotnet-monitor 是 .NET Core 命令列介面 (CLI) 工具, 可以很方便的在dotnet環境中分析我們的應用程式,需要注意的是,目前它還只是一個實驗性的工具 在這之前,我們使用的有 dotnet-counters,dotnet-dump 和 dotnet-trace,那 dotnet