1. 程式人生 > 其它 >C#比較兩個物件是否為同一個物件。 Visual Studio偵錯程式指南---多執行緒應用程式除錯(一)

C#比較兩個物件是否為同一個物件。 Visual Studio偵錯程式指南---多執行緒應用程式除錯(一)

兩個物件是否為同一個物件:是看兩個物件是否指向堆中的同一塊記憶體。

1、使用object.ReferenceEquals()

class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person();
            p1.Name = "Mark";
            Person p2 = new Person();
            p2.Name = "Marl";
            Person p3 = p1;
            Console.WriteLine(object.ReferenceEquals(p1,p2));
            Console.WriteLine(object.ReferenceEquals(p1,p3));

        }
        class Person
        {
            public string Name { get; set; }
        }
    }
   //結果:false。
        true

2.使用object.equals()

class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person();
            p1.Name = "Mark";
            Person p2 = new Person();
            p2.Name = "Marl";
            Person p3 = p1;
            Console.WriteLine(p1.Equals(p2));
            Console.WriteLine(p1.Equals(p3));

        }
        class Person
        {
            public string Name { get; set; }
        }
    }
  //結果同上

3、使用== 得到同樣的結果。

目前來看,這三個方法都能判斷兩個物件是否為同一個物件。但是:

static void Main(string[] args)
        {
            string s1 = new string(new char[] { 'a', 'b' });
            string s2 = new string(new char[] { 'a', 'b' });
            Console.WriteLine(s1==s2);//true
            Console.WriteLine(s1.Equals(s2));//true
            Console.WriteLine(object.ReferenceEquals(s1,s2));//false
        }

這兩個s1,s2是兩個不同的物件,因為new了兩次,在堆中存在兩塊不同的記憶體。

總結:

Equals:內部是判斷兩個物件中的值是否一樣。

==:內部還是呼叫的equals方法,所以應該同上。

所以用第一種。

Visual Studio偵錯程式指南---多執行緒應用程式除錯(一)

執行緒是作業系統向其授予處理器時間的指令序列。在作業系統中執行的每個程序都包含至少一個執行緒。包含多個執行緒的程序稱為多執行緒。有多個處理器、多核處理器或超執行緒程序的計算機可以同時執行多個執行緒。使用多個執行緒的並行處理可以極大地提高程式效能,但也可能導致除錯變得更加困難,因為正在跟蹤多個執行緒。

多執行緒處理可能會引入新型別的潛在 bug。例如,兩個或多個執行緒可能需要訪問同一資源,但是一次只能有一個執行緒可以安全地訪問該資源。需要某種形式的互斥才能確保每次只有一個執行緒訪問該資源。如果未正確實現互斥,則可能會建立不會執行任何執行緒的死鎖情況。死鎖通常是一個難以除錯的問題。

用於除錯多執行緒應用的工具

Visual Studio 提供不同的工具用於除錯多執行緒應用程式。

  • 對於執行緒,除錯執行緒的主要工具有 "執行緒" 視窗、源視窗中的執行緒標記、"並行堆疊" 視窗、"並行監視" 視窗和 "除錯位置" 工具欄。

  • 對於使用任務並行庫(TPL)或併發執行時的程式碼,用於除錯的主要工具是 "並行堆疊" 視窗、"並行監視" 視窗和 "任務" 視窗,該視窗還支援JavaScript.

  • 對於除錯 GPU 上的執行緒,主要工具是“GPU 執行緒”視窗。

  • 對於程序,主要工具是“附加到程序”對話方塊、“程序”視窗和“除錯位置”工具欄。

Visual Studio 還提供功能強大的斷點和跟蹤點,在除錯多執行緒應用程式時,這會很有用。使用斷點條件和篩選器將斷點置於單個執行緒上。使用跟蹤點可以在不中斷的情況下跟蹤程式的執行,從而研究死鎖之類的問題。

除錯具有使用者介面的多執行緒應用程式可能會特別困難。可以考慮在另一臺計算機上執行應用程式並使用遠端除錯。

參考網址:https://www.cnblogs.com/yilang/p/12487588.html

使用 "執行緒" 視窗除錯多執行緒應用

多個 Visual Studio 使用者介面元素可幫助除錯多執行緒應用。下面介紹 "程式碼編輯器" 視窗、"除錯位置" 工具欄和 "執行緒" 視窗中的多執行緒除錯功能。

“啟動除錯”

  1. 程式碼行上設定斷點,方法是單擊左側的滾動條線,或選擇線條並按F9。斷點在程式碼行旁邊的左側滾動條中顯示為紅色圓圈。

  2. 選擇 "除錯" > "開始除錯",或按F5。

    應用程式在除錯模式下啟動,並在斷點處暫停。

  3. 在中斷模式下,通過選擇 "除錯" > Windows > 執行緒開啟 "執行緒" 視窗。你必須在除錯會話中才能開啟或檢視執行緒和其他除錯視窗。

檢查執行緒標記

  1. "執行緒" 視窗中右鍵單擊,然後選擇選單中的 "在源中。

    原始碼行旁邊的裝訂線現在顯示一個執行緒標記圖示。執行緒標記指示執行緒在此位置停止。如果該位置有多個已停止的執行緒,則會顯示圖示。

  2. 將指標懸停線上程標記上。顯示資料提示,並顯示已停止的執行緒或執行緒的名稱和執行緒 ID 號。執行緒名稱可能<No Name>

    為了幫助識別不需要的執行緒,您可以在 "執行緒" 視窗中重新命名它們。右鍵單擊該執行緒,然後選擇 "重新命名"。

  3. 右鍵單擊原始碼中的執行緒標記可檢視快捷選單上的可用選項。

標記執行緒和取消標記執行緒

您可以標記執行緒以跟蹤您要特別注意的執行緒。

在原始碼編輯器或 "執行緒" 視窗中標記和取消標記執行緒。從 "除錯位置" 或 "執行緒" 視窗工具欄中選擇是僅顯示標記的執行緒還是顯示所有執行緒。從任何位置進行的選擇將影響所有位置。

在原始碼中標記和取消標記執行緒

  1. 通過選擇 "檢視" > 工具欄 > 除錯位置,開啟 "除錯位置" 工具欄。還可以在工具欄區域中右鍵單擊,然後選擇 "除錯位置"。

  2. "除錯位置" 工具欄有三個欄位: "程序"、"執行緒" 和 "堆疊幀"。下拉執行緒列表,並記下有多少執行緒。線上程列表中,當前正在執行的執行緒由 > 符號標記。

  3. 在原始碼視窗中,將滑鼠懸停在滾動條中的一個執行緒標記圖示上,並在資料提示中選擇標誌圖示(或一個空標誌圖示)。標誌圖示變為紅色。

    您還可以右鍵單擊執行緒標記圖示,指向 "標誌",然後從快捷選單中選擇要標記的執行緒。

  4. 在 "除錯位置" 工具欄上,選擇 "僅顯示標記的執行緒" 圖示在 "執行緒" 欄位的右側。除非標記一個或多個執行緒,否則圖示為灰顯。

    只有已標記的執行緒才會出現在工具欄的 "執行緒" 下拉列表中。若要再次顯示所有執行緒,請再次選擇 "僅顯示標記的執行緒" 圖示。

    提示

    標記了某些執行緒後,可以將游標放在程式碼編輯器中,右鍵單擊,然後選擇 "將標記的執行緒執行到游標處"。請確保選擇所有已標記的執行緒將達到的程式碼。將標記的執行緒執行到游標處將暫停選定程式碼行上的執行緒,從而可以更輕鬆地通過凍結和解凍執行緒控制執行順序。

  5. 若要切換當前正在執行的執行緒的已標記或未標記狀態,請選擇 "僅顯示標記的執行緒" 按鈕左側的單個標誌 "切換當前執行緒標記狀態" 工具欄按鈕。標記當前執行緒對於僅顯示標記的執行緒時查詢當前執行緒非常有用。

  6. 若要取消標記執行緒,請將滑鼠懸停在原始碼中的執行緒標記上,並選擇紅色標記圖示以清除它,或右鍵單擊執行緒標記,然後選擇 "取消標記"。

在 "執行緒" 視窗中標記和取消標記執行緒

在 "執行緒" 視窗中,已標記的執行緒旁邊顯示紅色標誌圖示,而未標記的執行緒(如果已顯示)具有空圖示。

選擇標記圖示,以根據其當前狀態將執行緒狀態更改為標記或未標記。

還可以右鍵單擊行,然後從快捷選單中選擇 "標記"、"取消標記" 或 "取消標記所有執行緒"。

"執行緒" 視窗工具欄還具有 "僅顯示標記的執行緒" 按鈕,它是兩個標誌圖示中的 righthand。它的工作方式與 "除錯位置" 工具欄上的按鈕相同,其中的一個按鈕控制兩個位置的顯示。

其他執行緒視窗功能

在 "執行緒" 視窗中,選擇任意列的標頭以按該列對執行緒進行排序。再次選擇以反轉排序順序。如果顯示了所有執行緒,則選擇標誌圖示列會按標記或未標記的狀態對執行緒進行排序。

"執行緒" 視窗的第二列(沒有標頭)是當前執行緒列。此列中的黃色箭頭標記當前執行點。

"位置" 列顯示每個執行緒在原始碼中出現的位置。選擇Location項旁邊的展開箭頭,或將滑鼠懸停在該項上,以顯示該執行緒的部分呼叫堆疊。

有關執行緒呼叫堆疊的圖形檢視,請使用 "並行堆疊" 視窗。若要在除錯時開啟視窗,請選擇 "除錯"> Windows > "並行堆疊"。

除了標記 、取消標記和取消標記所有執行緒外,執行緒視窗項的右鍵單擊上下文選單還具有:

  • "在源中顯示執行緒" 按鈕。
  • 十六進位制顯示,將 "執行緒" 視窗中的執行緒 ID更改為十進位制格式。
  • 切換到執行緒,這會立即將執行切換到該執行緒。
  • 重新命名,使你可以更改執行緒名稱。
  • 凍結和解凍命令。

凍結和解凍執行緒執行

可以凍結和解凍執行緒,也可以掛起和恢復執行緒,以控制執行緒執行工作的順序。凍結和解凍執行緒可幫助解決併發性問題,如死鎖和爭用條件。

提示

若要在不凍結其他執行緒的情況下跟蹤單個執行緒,這也是一種常見的除錯方案,請參閱開始除錯多執行緒應用程式。

凍結和解凍執行緒:

  1. 在 "執行緒" 視窗中,右鍵單擊任意執行緒,然後選擇 "凍結"。"當前執行緒" 列中的暫停圖示指示執行緒已凍結。

  2. 選擇 "執行緒" 視窗工具欄中的列,然後選擇 "掛起的計數" 以顯示 "掛起的計數" 列。凍結執行緒的掛起計數值為1。

  3. 右鍵單擊凍結的執行緒,然後選擇 "解凍"。

    暫停圖示消失,"掛起的計數" 值更改為0。

切換到另一個執行緒

嘗試切換到另一個執行緒時,可能會看到應用程式處於中斷模式視窗。此視窗告訴您該執行緒沒有當前偵錯程式可以顯示的任何程式碼。例如,你可能正在除錯託管程式碼,但執行緒是本機程式碼。此視窗提供瞭解決此問題的建議。

切換到另一個執行緒:

  1. 在 "執行緒" 視窗中,記下當前執行緒 ID (當前執行緒列中帶有黃色箭頭的執行緒)。你需要切換回此執行緒以繼續執行你的應用程式。

  2. 右鍵單擊其他執行緒,然後從上下文選單中選擇 "切換到執行緒"。

  3. 觀察 "執行緒" 視窗中的黃色箭頭位置是否已更改。原始的當前執行緒標記也保留為輪廓。

    檢視程式碼源編輯器中的執行緒標記上的工具提示,以及 "除錯位置" 工具欄上的 "執行緒" 下拉列表中的列表。觀察當前執行緒是否也已更改。

  4. 在 "除錯位置" 工具欄上,從 "執行緒" 列表中選擇一個不同的執行緒。請注意,當前執行緒還會在其他兩個位置發生更改。

  5. 在原始碼編輯器中,右鍵單擊執行緒標記,指向 "切換到執行緒",然後從列表中選擇另一個執行緒。觀察當前執行緒是否在所有三個位置發生了更改。

在原始碼中,通過執行緒標記,只能切換到在該位置停止的執行緒。使用“執行緒”視窗和“除錯位置”工具欄可以切換到任何執行緒。

你現在已經瞭解了除錯多執行緒應用程式的基礎知識。您可以使用 "執行緒" 視窗、"除錯位置" 工具欄中的 "執行緒" 或 "原始碼編輯器" 中的 "執行緒" 標記來觀察、標記和取消標記執行緒,以及凍結和解凍執行緒。

為蟲子生,為蟲子死,為蟲子奮鬥一輩子