我正在用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(我認爲這是術語)。 mDSIdentity
和mAppIdentity
都是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
錯誤,或者如何找出它是否甚至是我的代碼的錯誤?
您可以隔離到這一點的一小段代碼,以確保你得到同樣的錯誤呢?這將幫助您確定錯誤是否在您的結尾。 – 2010-11-04 19:53:41
@Nathan S:不是。我的意思是,它總是發生在其中一個DSM_Entry調用中(由於與TWAIN通信的性質,有很多調用),但並不總是相同的,有時根本不會。 – 2010-11-04 20:05:40
我自己並沒有使用TWAIN,但是如果您編寫一個只會產生DSM_Entry調用並且不處理任何其他數據的小程序,會發生什麼?如果你的程序足夠小,你可以快速驗證問題必須在API中。然後,你只需要找到神奇的解決方法來讓事情順利進行。如果你還沒有,我會建議在Apple的郵件列表上提問。 – 2010-11-04 22:21:18