1

我正在用 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错误,或者如何找出它是否是我的代码的错误?

4

2 回答 2

1

If you run in GDB you should see a stacktrace which will give you some pretty good clues, though it won't tell you instantly if the problem is that you left bad stuff or not.

You could also try enabling malloc debugging.

于 2010-11-04T19:46:58.310 回答
0

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

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

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

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

于 2012-03-27T14:29:04.330 回答