2010-11-04 94 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使用的其他框架中的错误)。

相关问题