如何确定EXC_BAD_ACCESS错误是否是我的代码的错误?

时间:2010-11-04 19:44:48

标签: macos memory random twain

我正在用C ++在Macintosh上编写代码。长话短说,它与TWAIN接口。

我们针对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

一些搜索表明,这种情况往往发生在Apple平台上(iPhone和Obj-C通常会受到影响)每当发生内存方面的错误时,例如可能使用解除引用的指针。与记忆相关似乎支持随机性,但我无法弄清楚它出错的地方,特别是因为它似乎没有什么不同于它何时工作而不是它不工作(即,在断点处确切的DSM_Entry调用崩溃了这些值似乎与它之前非常相似的DSM_Entry调用完全相同,所涉及的变量的内存位置与错误中的内存地址不匹配,如果代码失败,DSM_Entry应该返回一个代码,但在这种情况下,它只会崩溃所有内容,并且异常处理无效。

根据Apple开发人员的说法EXC_BAD_ACCESS及其类似的调试最难的错误,我对此感到欣慰,但我不知道该怎么做。由于我们正在与我们没有编写的TWAIN驱动程序连接,因此错误甚至不在我们的代码本身中。这导致我询问state of TWAIN on the Mac(因为我们在Windows中没有遇到这么多麻烦),但我们已经测试了至少四个不同的扫描仪制造商,我很难相信他们都可以错误。

此外,我正在编写Xcode,并打开了所有警告,但仍未获得有关正在发生的事情的线索(或其他警告)。

是否有人对EXEC_BAD_ACCESS错误进行问题排查有任何其他建议,或者如何查明是否是我的代码错误?

2 个答案:

答案 0 :(得分:1)

如果您在GDB中运行,您应该会看到一个堆栈跟踪,它会为您提供一些非常好的线索,但它不会立即告诉您问题是您是否留下了不好的东西。

您也可以尝试启用malloc调试。

答案 1 :(得分:0)

我遇到了同样的问题,只有当我尝试打开一些扫描仪(MSG_OPENDS)时,应用程序才会崩溃。在某些扫描仪(usb)上调用MSG_OPENDS时,应用程序正在分配大量内存,这有时会导致崩溃。

我花了很多时间认为这是代码中的错误,但是当我在TwainClientCocoa中测试相同的代码时,它运行良好。

最后,在浪费了几个小时之后,我设法修复了它......通过从项目的plist中设置CFBundleIconFile

MSG_OPENDS失败时,会显示一个警告框,其中还包含应用程序图标。我的猜测是问题来自那个警报(Twain.framework中的错误......或者Twain正在使用的其他框架)。