我正在用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