2010-04-14 144 views
11

我試圖調試一個用C寫的DLL中的問題,這個問題一直導致訪問衝突。我使用的是Visual C++ 2008,但代碼是筆直的。我使用Delphi,如果在調試器下運行時發生異常,程序會立即中斷調試器,它會給你一個檢查程序狀態的機會。但是,在Visual C++中,我所得到的只是「輸出」選項卡中的一條消息:如何讓VC++的調試程序中斷異常?

First-chance exception at blah blah blah: Access violation reading location 0x04410000.沒有休息,什麼都沒有。它只是放開堆棧,直到它返回到我的Delphi EXE中,它識別出錯誤並在那裏提醒我,但是到那時我已經失去了幾層調用堆棧,我不知道發生了什麼。我試過其他的調試技術,但無論它做什麼都發生在C宏的嵌套循環內部,它被調用超過500次,這只是超出了我的技能(或我的耐心),而不是追蹤。

我覺得必須有某種方法來獲得「一次機會」的例外,才能真正給我一個「機會」來處理它。可能有一些「一次偶然異常」立即中斷「配置設置,我不知道,但它似乎並不是所有可以發現的。

有誰知道它在哪裏以及如何啓用它?

回答

16

調試菜單中,選擇例外,檢查異常的盒子,你想調試器打破。 「訪問衝突」位於「Win32 Exceptions」下。

+0

謝謝。這工作。我想知道爲什麼Access Violation沒有被默認選中... – 2010-04-14 21:20:07

+0

@Mason:沒問題。我不認爲他們中的任何一個默認都被選中。我的猜測是,當「打破例外」被啓用時(雖然我不知道),會有相當顯着的性能損失。 – 2010-04-14 21:21:44

+0

我不這麼認爲。我不太瞭解C++,但在Delphi中,性能損失爲零,直到它實際上打破了一個,當它(如果)它確實是這樣,那通常意味着出了問題,調試器正是你想要的地方是。 – 2010-04-14 21:23:37

1

您還可以使用「First-chance exception at ...」行中指定的地址創建數據斷點。

從James的回答可以看出,你正在尋找的異常是在Win32異常部分的下面。您應該在那裏看到訪問衝突。

+0

會這樣嗎?這是一個「讀取」錯誤,如果您更改相關地址的值,AFAIK數據斷點只會關閉。 – 2010-04-14 21:26:07

+0

也可以在執行到達特定位置時中斷(我認爲它只是斷點屬性對話框中的一個選項)。 – 2010-04-15 08:55:19