簡體   English   中英

VS2012 斷點沒有被擊中

[英]VS2012 Breakpoints are not getting hit

我有一個看起來像這樣的課程:

public class MyService
{
    private MyService(){}
    public static string GetStuff()
    {
        var stuffDid = new MyService();
        return stuffDid.DoStuff();
    }
    private string DoStuff()
    {
        //do stuff
    }
    //other private helpers

}

顯然我遺漏了很多,但這是一般的外殼。

現在,我有一個單元測試:

[Test]
public void MyTest()
{

    var results = MyService.GetStuff();
}

我在我的單元測試上設置了斷點,我可以看到results有數據。 但是,我實際上在MyService設置了斷點,除非我將它們放在花括號上,否則不會受到任何影響。 我無法理解,因為results有數據,我在MyService return語句應該被擊中,對吧?

我錯過了什么嗎? 我是不是完全忘記了一些最基本的規則? 為什么MyService沒有任何東西被擊中? 如果我使用F11手動進入它,它只會跳來跳去,甚至不會像我期望的那樣遍歷每一行。 此外,當我手動逐步執行時,我傾向於在我最初應該點擊它之后點擊某些代碼。 並且任何switch語句似乎都默認為第一個選項,即使被切換的值應該明確輸入不同的case

我什至嘗試將MyService構造函數MyService publicMyService所有static方法,但它仍然不起作用。

我的測試和“核心”代碼在同一個解決方案中,但不同的項目(分別是TestCore )。 其他測試在Core沒有遇到斷點問題,只有在特定測試(測試MyService的唯一測試)時才會出現此問題。

我已經刪除了我的 PDB 文件並清理了解決方案。 依然沒有。

一些想法。

  1. 確保它是一個調試版本而不是發布
  2. 關閉項目屬性中的優化(如果它們處於打開狀態)
  3. 嘗試在代碼中插入Debugger.Break()而不是 VS 中的斷點
  4. 確保斷點被啟用(Debug->Windows->Breakpoints 工具欄),並且斷點符號應該是實心的
  5. 執行您的應用程序。 加載調試->窗口->模塊窗口。 檢查您的程序集以查看符號是否已加載。 如果沒有,它可能會給出相關的狀態消息。

你有沒有在電腦上調整過日期? 這真的會搞砸構建過程。 如果是這樣,請手動刪除所有 obj/bin 文件夾並重新編譯。

這可能是因為您只調試 1 個項目,而不是TestCore

您可以將 VS 設置為一次調試多個項目,您可以通過right-click your solution > Properties > Common Properties > StartUp Project

在這里你可以設置“多個啟動項目”在此處輸入圖片說明

只需設置CoreTest即可開始。 這可能會解決您的問題。

事實證明,這與代碼覆蓋率有關。

關閉它解決了這個問題。

您可以通過以下鏈接了解如何禁用代碼覆蓋

禁用代碼覆蓋

我有一個非常具體的場景,導致“未命中斷點”的明顯問題。

由於此處沒有其他答案提到它,因此我將添加我的答案,以幫助遇到相同問題的人。

就我而言,該解決方案很愚蠢,而且使用了盡可能多的 LINQ,我應該早點弄明白這一點。 當運行一個返回 IEnumerable 的方法時,其中包含的 return 語句實際上是yield return語句,那么在調用它時將不會執行該方法。

當您從該 IEnumerable 對象調用另一個方法時,它實際上會被執行,例如ToList()Count() 只有這樣才能執行該方法並到達斷點。

只需確保您使用調試器符號構建了程序集。

此選項必須填寫“完整”:

右鍵單擊包含代碼文件的項目,斷點未命中。 選擇“屬性”。

打開項目屬性后,選擇“構建”選項卡。 注意標簽頁底部的“高級...”-按鈕。 (在“輸出”-組內)

單擊此按鈕並為“調試信息”屬性選擇“完整”。 這應該是斷點未命中的原因。 Visual Studio 使用保存在 pdb 文件中的符號來查找斷點的確切位置。 如果未創建這些文件,則不會命中任何斷點。 也許您禁用了這些文件的創建以整理您的項目文件結構。 這是我認識到我需要這些文件的情況。

我最近遇到了同樣的問題,我的頭撞在牆上。

結果證明答案非常愚蠢:不知何故,我的測試項目與主庫項目不同步。 我正在構建測試和庫的調試版本,但測試項目從bin/Release文件夾復制了庫。 我剛剛重新創建了項目參考,一切都已修復。

PS它甚至更瘋狂:調試器進入了一個庫函數,但不知何故跳過了它中間的一行。

您需要將 DoStuff 設為靜態。

private static string DoStuff()
{
    //do stuff
}

您的代碼表示一個“服務”,它可以作為一個單獨的進程運行。 如果是這種情況,您可以加載程序集,因此斷點將是紅色實心圓圈,但程序集的另一個副本,在單獨的進程中運行實際上是在處理請求。

  • 檢查任務管理器是否有可能的違規者(可能托管您的服務的進程)。 在調試時殺死它們以確認調用失敗。
  • 嘗試使用 Debugger.Break();
  • 創建一個調試日志文件,在將輸出加載到日志時,輸入進程和程序集名稱。 確保您的日志每次都是不同的文件,以避免異步訪問問題。

這聽起來像是測試沙箱中的 pdb 文件沒有更新。

1) 確保您處於調試模式。

2)您可以嘗試明確包含 pdb 文件的部署項嗎?

  • 你說你可以在你的測試項目中附加一個調試點。
  • 一旦到達測試項目中的調試點,請檢查以確保沙箱的 Out 文件夾中存在具有最新時間戳的 pdb 文件。

3)如果1和2失敗,我發現有時visual studio需要重啟:)

  1. 清理解決方案並重建並執行啟動項目。

  2. 您能否快速查看一下 BUILD > Configuration Manager,以確定設置了哪些配置屬性。 如果是開發,那么您可能需要調整項目屬性 -> 單擊高級設置 -> 在 [輸出選項卡] 中將調試信息更改為“完整”。

  3. 即使不是開發模式,您也可以按照第二步操作

我在 25 個項目中的 1 個項目中發生了這種情況,這些項目都在同一個解決方案中。 其他項目尊重斷點,但這個 1 沒有。 我從解決方案中刪除了該項目(刪除,而不是卸載),這破壞了對它的所有引用,然后將其添加回解決方案並且有效!

如果這不起作用,您可能需要從頭開始重新創建問題項目並將該新項目添加到解決方案中。

除了純粹的運氣之外,我對為什么這行得通的最好解釋是,我們多年來多次將項目從一個版本的 VS 遷移到另一個版本,也許其中一個遷移導致了這個問題。

您可以嘗試在GetStuff方法中添加一個Thread.Sleep(5000)並使用 Attach to Process

Visual Studio > 工具 > 附加到進程並查看該行下方的斷點是否被擊中。

如果它處於發布模式,則將其切換到調試模式。

我從經驗中知道,Visual Studio 沒有明確的調試服務的方法,尤其是 Windows 服務。 嘗試將一些代碼添加到 GetStuff 以打印到文本文件,這樣您至少知道代碼正在被命中。 在創建服務時,我經常使用這種方法進行測試。

我遇到了類似的問題。 事實證明,對我來說,使用*.testrunconfig文件從 VS2010 到 VS2012 的遷移很糟糕。 我刪除了舊的並設置了一個新的來解決問題。

當 VS 使用使用源代碼生成的 .pdb 文件時,VS 的行為與您描述的完全相同(不擊中斷點,擊中您不希望擊中的代碼) . 我不能保證這是你的情況,但是當我需要進入作為預構建庫提供的代碼時,我已經多次觀察到這種行為,該代碼是針對具有相同文件名的舊/不同代碼生成的/符號。

也許您的Test項目引用的是較舊的Core二進制文件,而不是Core (源代碼)項目?

嘗試在您的測試項目中重新添加引用:

轉到您的Test項目並刪除對Core項目的引用。

現在選擇 References 文件夾並右鍵單擊它並選擇菜單選項以添加新引用。 在“參考管理器”對話框中,確保您選擇了Solution ,然后選擇了左側的Projects 然后在 Reference Manager 對話框的中間,選擇(選中) Core項目。

再次嘗試調試,看看是否有幫助。

還有一些東西可以嘗試:

  • 檢查加載的符號是否與調試的可執行文件匹配:
    打開 VS 命令提示符並 cd 到您調試的可執行文件所在的目錄。 然后執行dumpbin /PDBPATH:VERBOSE MyServiceExecutable.exe並掃描“PDB age mismatch”的輸出(參考: http : //msdn.microsoft.com/en-us/library/44wx0fef.aspx

  • 不確定 VS 2012,但舊版本的 VS 有一個錯誤,即會顯示錯誤的源文件,前提是您的項目中有兩個具有相同名稱的源文件,即使它們位於不同的文件夾中。 因此,如果您的項目包含另一個同名的源文件,請查看重命名其中一個文件是否有幫助。 更新:似乎 VS 2012也受到影響。)

愚蠢的我沒有設置測試項目:

在此處輸入圖片說明

這個很晦澀:

確保您沒有兩個具有不同應用程序池的虛擬目錄指向硬盤驅動器上的相同物理位置。 在開發過程中,這有時會發生在測試中,或者是錯誤的。

我對技術問題不是 100% 清楚,但我有兩個 AppPools 和兩個虛擬目錄,並且沒有遇到斷點,因為我認為物理路徑在 IIS/Visual Studio 中以某種方式映射到另一個應用程序池,而不是實際的那個執行。

我有同樣的問題。 也許我的解決方案會幫助你解決你的問題。 只是在“附加到進程”選項“附加到”選擇值“Avtomatic:本機代碼”。 最好的祝福。

圖像

首先嘗試通過鼠標右鍵單擊項目> 重建來重建您的項目 如果這不起作用,請嘗試清理項目(鼠標右鍵單擊項目> 清理)

如果這不起作用,請檢查:

Right mouse click your project
select [Properties]
select the [Build] tab
make sure [Define DEBUG constant] and [Define TRACE constant] are checked
Click the [Advanced] button at the bottom of the Build tabpage
Make sure that [Debug Info:] is set to [full]
Click [OK] and rebuild the project ;-)

希望對你有用! (第 6 步生成 .pdb 文件,這些是調試符號)

要逐步調試,您必須做兩件事。 首先必須設置斷點,然后必須將調試器附加到運行代碼的進程。 如果您正在運行 IIS Express 並且您有 64 位機器,那么您需要附加運行您的代碼的iisexpress.exe 如果您按 CTRL + ALT + P,您將進入附加到進程窗口。 附加后,如果代碼匹配,則應命中斷點。

在單元測試中,我沒有遇到斷點,並意識到我正在運行測試而不是調試測試。 測試資源管理器的頂部是“全部運行”、“運行失敗”、“運行通過”等選項。當您運行測試時,不會命中斷點。 要調試測試,請在測試資源管理器中右鍵單擊測試或測試組,然后選擇調試選定的測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM