2010-11-04 116 views
1

我正在用C++在Macintosh上編寫代碼。長話短說,它與TWAIN接口。如何判斷EXC_BAD_ACCESS錯誤是否是我的代碼錯誤?

我們使用TWAIN標準進行編碼,並使用我們用於開發的主平板掃描儀進行編碼,它的工作原理完美。與其他掃描儀,不是很多。

特別是,我正在使用的第二臺掃描儀往往會隨機點和間隔崩潰。

例如,它會一行有時崩潰這樣

OSErr err = DSM_Entry(&mAppIdentity, 
         NULL, 
         DG_CONTROL, 
         DAT_IDENTITY, 
         MSG_OPENDS, 
         (TW_MEMREF)&mDSIdentity); 

DSM_Entry是一個別名系統調用一個函數TWAIN(我認爲這是術語)。 mDSIdentitymAppIdentity都是TW_IDENTITY結構,一個TWAIN的東西。其中一個標識我們的應用程序,另一個提取數據源(TWAIN掃描儀)的價值。該DG_參數是「操作三聯」,他們#define值,在此結合,代表了特定的操作 - 在這種情況下,從數據源管理

有時候這工作打開數據源,有時它失敗。有時在第三次掃描時失敗,有時在第二次掃描中失敗,有時在第一次失敗。就像我在第一臺掃描儀中所說的那樣,它工作的很好,而其他的則在這些隨機時間間隔內死亡。

在調試器中我看到消息,但有一點不同,我通常看到的是EXC_BAD_ACCESS

Program received signal: 「EXC_BAD_ACCESS」. 
Cannot access memory at address 0x17f3ccac 

搜索的一些量表明,這往往會在蘋果平臺上發生(iPhone和對象 - 通常是什麼是命中),每當有關內存發生問題時,比如可能使用一個解除引用的指針。與內存有關似乎會支持隨機性,但我無法弄清楚它出錯的地方,特別是因爲它看起來沒有什麼區別,當它工作時,它不會有什麼不同(例如,在斷點確切DSM_Entry調用崩潰的值看起來是相似的非常相似DSM_Entry就在它正常工作之前),所涉及的變量的內存位置不匹配錯誤中的內存地址,DSM_Entry應該返回一個代碼如果失敗,但在這種情況下,它只是崩潰一切,異常處理沒有效果。

根據蘋果開發者的說法,我對此有所安慰,EXC_BAD_ACCESS之類的錯誤是最難調試的錯誤,但我不知道該怎麼辦。由於我們正在與我們沒有編寫的TWAIN驅動程序接口,所以可能是因爲錯誤甚至不在我們的代碼本身中。這導致我詢問了state of TWAIN on the Mac(因爲我們在Windows中並沒有遇到過這麼多麻煩),但我們已經針對至少四家不同的掃描儀制造商進行了測試,並且我很難相信它們都可能是錯誤的。

另外我正在Xcode中編譯所有的警告,並且仍然沒有線索(或額外的警告)發生了什麼事情。

有沒有人有任何額外的意見來解決EXEC_BAD_ACCESS錯誤,或者如何找出它是否甚至是我的代碼的錯誤?

+0

您可以隔離到這一點的一小段代碼,以確保你得到同樣的錯誤呢?這將幫助您確定錯誤是否在您的結尾。 – 2010-11-04 19:53:41

+0

@Nathan S:不是。我的意思是,它總是發生在其中一個DSM_Entry調用中(由於與TWAIN通信的性質,有很多調用),但並不總是相同的,有時根本不會。 – 2010-11-04 20:05:40

+0

我自己並沒有使用TWAIN,但是如果您編寫一個只會產生DSM_Entry調用並且不處理任何其他數據的小程序,會發生什麼?如果你的程序足夠小,你可以快速驗證問題必須在API中。然後,你只需要找到神奇的解決方法來讓事情順利進行。如果你還沒有,我會建議在Apple的郵件列表上提問。 – 2010-11-04 22:21:18

回答

1

如果你在GDB中運行,你應該看到一個堆棧跟蹤,它會給你一些很好的線索,儘管它不會立即告訴你問題是你是否留下了不好的東西。

你也可以嘗試啓用malloc調試。

+0

是啊,我一直在GDB已經運行,我沒有得到堆棧跟蹤,儘管在調試模式下運行它,有它不剝離符號等這可能借一些可信它是在別人的代碼中的錯誤。不知道。儘管感謝malloc調試技巧,但我會嘗試一下。 – 2010-11-04 20:06:45

+0

你是什麼意思'沒有回溯'。它不會停止,或者它不顯示任何有趣的事情? – bmargulies 2010-11-04 20:52:38

+0

當Xcode調試器被連接時,它在那一點停止冷卻,並且我從中得到的所有內容都是兩行,就像上面粘貼的那樣。沒有堆棧跟蹤。如果我沒有連接到調試器,程序就會崩潰。 – 2010-11-04 21:47:01

0

我有同樣的問題,該應用程序崩潰,只有當我試圖打開一些掃描器(MSG_OPENDS)。在某些掃描儀(usb)上調用MSG_OPENDS時,應用程序分配了大量有時會導致崩潰的內存。

我花了很多時間認爲這是代碼中的錯誤,但是當我在TwainClientCocoa中測試相同的代碼時,它運行良好。

最後,浪費了幾個小時後,我設法解決它..從項目的plist設置CFBundleIconFile

MSG_OPENDS失敗時,它顯示一個警告框,其中還包含應用程序圖標。我的猜測是問題來自於該警報(Twain.framework中的錯誤或Twain使用的其他框架中的錯誤)。

相關問題