2012-02-15 133 views
0

我在這個問題上工作了兩天,這讓我很生氣,因爲我對C++還很陌生。這種違規訪問問題對您來說可能相當容易,可能會被解答數千次。但是我缺乏C++知識,使我甚至無法確定曾經回答過的同樣的問題。這裏在調試模式下訪問衝突,但在發佈模式下很好

確定是我的問題:

的主要代碼是一個DLL。我正在使用Visual Studio 2008

2.該DLL調用3個外部庫:boost,tinyXML和SRILM(NLP工具包)。

3.錯誤說:Unhandled exception at 0x5f4f068f (TextNormalizerAPI.dll) in tester.exe: 0xC0000005: Access violation reading location 0x00000000.,只發生在調試模式。和錯誤行由我的代碼中一個boost :: regex對象(patUsername = regex("^\\W*@[A-Za-z]");)的初始化引起的,但實際位置是深深Boost庫裏面,如圖下圖:

The error occurred in boost lib, not in my code

* *在大多數情況下,我不應該更改Boost lib的源代碼,不是嗎? **

4.此錯誤僅出現在調試版本中,而不是發佈版本中。

5.我用一箇舊的但沒有錯誤的版本替換了整個解決方案,該版本在調試模式下正常工作。然而,在我生成此解決方案的發佈版本之後,在調試模式下發生錯誤!

UPDATE:

6.謝謝你們!我只是嘗試了一些東西,發現即使是簡單的在DLL入口的第一行定義一個正則表達式對象也會發生這個錯誤!有任何想法嗎?

7.但是在這個DLL的調用者的main()的第一行初始化一個正則表達式對象不會引發這個問題。

希望這個描述將幫助你回憶一些事情,並給我一些提示。

我要問:

什麼是縮小和發現問題的常用策略是什麼?謝謝!

+1

閱讀調用堆棧(屏幕截圖中的底部疼痛)通常會有所幫助。它告訴你哪個功能導致了問題。 – 2012-02-15 18:15:46

+0

Visual Studio會在調試模式下執行某些操作,如零內存,並且可能會填充可以隱藏真正內存問題的東西。帶箭頭指示符的m_position的值是多少? – 2012-02-15 18:17:29

+0

@ToddMurray謝謝!然而,問題是這個代碼是boost庫的一部分,我認爲這個問題不應該是一些編碼錯誤,但一些鏈接或打破堆棧中的返回地址等太複雜,我不能識別.. – JXITC 2012-02-15 18:20:03

回答

3

看你的代碼,你可能需要驗證您的m_position值是有效的......我看到在你的代碼escape_type_class_jump標籤,讓你在使用的goto或任何機制來跳轉到該標籤(我無法從屏幕截圖中看出)可能會繞過正在進行的任何檢查來驗證您的位置增量仍然有效。

+0

謝謝你的回答!你的回答是合理的,但是這個NULL指針發生在Boost庫代碼中,當我創建一個正則表達式對象''時,我不認爲我會修改boost源代碼? – JXITC 2012-02-15 18:26:34

+0

順便說一句,我剛剛添加了一個更新,以我的答案爲基礎,在屏幕截圖中我可以看到... – Jason 2012-02-15 18:29:11

+0

MSVC不會將變量初始化爲0.它初始化爲某些特殊值,如0xcdcdcdcd,但不爲0。 – Henrik 2012-02-15 18:32:28

1

它在我看來像「this」(即basic_regex_parser)是NULL,它試圖調用一個NULL對象的方法,這顯然不能很好地工作。如果「this」確實是NULL(可以通過查看「Locals」選項卡來查看,那麼我會調用堆棧到「basic_regex_implementation」級別,看看發生了什麼 - 這個NULL值來自哪裏?一般來說,查看調用堆棧的不同級別以及這些級別的變量值會有所幫助。

相關問題