我正在用 C++ 在 Macintosh 上编写代码。长话短说,它与 TWAIN 交互。
我们根据 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
一些搜索表明,只要在内存方面发生了不好的事情,比如可能使用取消引用的指针,这往往会发生在 Apple 平台上(iPhone 和 Obj-C 经常受到打击)。与内存相关似乎支持随机性,但我不知道哪里出了问题,特别是因为它工作时与不工作时似乎没有什么不同(即,在断点处使值崩溃的确切DSM_Entry
调用似乎与DSM_Entry
它之前的非常相似的调用相同),所涉及的变量的内存位置与错误中的内存地址不匹配,DSM_Entry
如果它应该返回一个代码失败了,但在这种情况下,它只是让一切崩溃,
根据 Apple 开发人员的说法,我感到有些欣慰,EXC_BAD_ACCESS
它的同类错误是最难调试的错误,但我不知道该怎么做。由于我们正在与我们未编写的 TWAIN 驱动程序交互,因此错误甚至可能不在我们的代码本身中。这让我询问了 Mac 上 TWAIN 的状态(因为我们在 Windows 中没有遇到这么多麻烦),但我们已经针对至少四个不同的扫描仪制造商进行了测试,我很难相信他们都可以是错的。
此外,我在 Xcode 中编译时打开了所有警告,但仍然没有关于正在发生的事情的任何线索(或其他警告)。
有没有人有任何额外的建议来解决EXEC_BAD_ACCESS
错误,或者如何找出它是否是我的代码的错误?