2013-01-17 32 views
9

偶爾當我啓動/調試我在調試模式下的應用程序,使用VS2012,我得到一個對話框:VS2012:斷點ntdll.dll中的調試器發射沒有更多信息

<blahblah.exe>引發一個斷點。

它包含沒有其他信息,所以我打破了看看發生了什麼。哦,但後來我得到了「wntdll.pdb沒有加載」,並沒有關於這個問題的其他信息。調用堆棧指向ntdll.dll,看起來我的應用程序還沒有開始執行。

選擇繼續此時將使應用程序/調試器照常繼續。

這種情況非常頻繁(約10次發佈)。我正在運行Windows 8(64位)和Visual Studio 2012更新1.

以前我有Windows 7(64位)和VS2010,並且從來沒有遇到過這個問題。這個特定的項目已經從2010年創建的版本升級,所以也許這是問題的一部分。

之前有人遇到過這個問題嗎?我不知道從哪裏開始尋找原因。雖然我運行的是64位Windows,但我應該提到我正在構建一個32位應用程序。

更新: 使微軟符號服務器後,這裏的調用堆棧的樣子:

> [email protected]() Unknown 
    [email protected]() Unknown 
    [email protected]() Unknown 
    [email protected]() Unknown 
    [email protected]() Unknown 

我還要補充,爲了以防萬一,我絕對有沒有斷點手動設置任何地方在我的代碼中。

+0

啓用Microsoft Symbol服務器,以便獲取所有Windows功能的符號。你會得到一個體面的註釋調用堆棧。如果它沒有幫助,請將其張貼在您的問題中。 –

+0

以爲我試過了,但我沒有意識到我必須打開設置並首先選擇「加載所有符號」。 – tacospice

+0

發生此問題時,您是否在計算機上安裝了> = 2版的VS? – ManuelH

回答

1

這惱人的問題在Visual Studio中的錯誤源於:

發生了什麼事是,我們沒有正確地同時處理來自不同進程的多個裝載機 斷點事件。 OS 在進程啓動並運行後會觸發加載程序斷點,但在調試程序執行任何執行之前會觸發 以斷點並執行其他操作。通常我們成功忽略了這些(至少在單發射情況下) 。通過禁用「在一個進程中斷時中斷所有進程」 工具 - >選項 - >調試器中的複選框,您可以解決此問題 。另請注意,這不是致命錯誤 。我們只是停在一個內部的breakpiont,你可以 再次擊中F5繼續前進。

這是一個競爭條件,所以我們不會那麼容易追蹤和 在VS多次啓動使用率相當低,所以我打算不會修復這個 假設上面的解決方法是好的足以讓您暢通無阻 ,如果我們看到更多來自其他 客戶的更多報告,我們將重新審視。這對你來說合理嗎?

再次感謝您的反饋。

馬克·潘恩的Visual Studio調試工程經理

來源:Microsoft Connect

我跟着建議在Visual Studio調試器設置以及對此禁用「打破所有進程,當一個進程換行符」複選框「刪除「現在的問題。

也許如果我們可以讓更多的人報告相同的問題/煩惱這個錯誤,微軟將最終修復它,就像他們的建議。

+0

我的問題依然存在! – tacospice

+0

這個bug在很長一段時間裏一直令我煩惱,但是我最近經過一些更深入的搜索後才發現Microsoft Connect文章關於它。現在我很高興這個解決方法存在。 – ManuelH

-1

看看您是否在首次機會異常時打開調試器。

你可以在「Debug/Exceptions ...」下看到這個。看看是否有任何框被選中。 (至少這是舊VS版本中的菜單位置 - 我目前沒有VS 2012) 如果啓用,這將導致調試程序在拋出異常時中斷,即使應用程序可以正確處理該異常。如果禁用,調試器只會在未處理異常時中斷。如果檢查到任何異常,請嘗試取消選中它們並查看是否存在。

3

如果您在調試器下運行該應用程序,一旦該進程啓動,就會有一個自動斷點。這個斷點使您有機會在流程開始執行之前設置更多的斷點。如果你不喜歡它,調試器中通常會有一個選項來忽略最初的默認斷點。例如,在cdbthe option is -g

+0

出於好奇,那麼爲什麼它只能在10個案例中的7箇中斷?它不應該每次都打破嗎? – OregonGhost

+0

@OregonGhost我對此沒有任何解釋。但是你所觸及的斷點是默認的初始斷點。您可以配置是否應該考慮或忽略初始斷點。 –

0

我只是發現自己遇到了類似的問題,不過,這是我的調用堆棧:

ntdll.dll!LdrpDoDebuggerBreak() 
ntdll.dll!LdrpInitializeProcess() 
ntdll.dll!_LdrpInitialize() 
ntdll.dll!LdrInitializeThunk() 

就我而言,我的Visual Studio解決方案有幾個項目,有三個設置爲啓動這些項目(和調試)通過解決方案的「多個啓動項目」設置。

兩個啓動項目是(非託管)C++,其中之一是C#。我可以通過打開C#項目的項目屬性並啓用「本地代碼調試」來擺脫此啓動斷點。

"Enable native code debugging" checkbox

編輯:顯然,這並沒有完全解決我的問題,它只是大大降低其發生的頻率。不過,我認爲相同的通用解決方案仍然可以解決這個問題。

此解決方案中的其他項目之一就是通過手動指定二進制文件作爲項目的TargetPath而啓動的預構建二進制文件。

改變Debugger TypeNative Only在項目的Debugging屬性頁似乎已幫助爲好。

"Native Only" Debugger type

那麼,這些變化的出現既居然有解決了這個問題對我來說。