Как я могу определить, является ли ошибка EXC_BAD_ACCESS ошибкой моего кода? - PullRequest
1 голос
/ 04 ноября 2010

Я пишу код на Macintosh на C ++.Короче говоря, он взаимодействует с 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, которые мы не писали, может быть, что ошибки даже нет в нашем коде как таковом.Это побудило меня спросить о состоянии TWAIN на Mac (поскольку у нас не было почти таких проблем в Windows), но мы проверили по крайней мере четыре разных производителя сканеров, и у меня сложныйВремя полагать, что они все могут быть неправы.

Также я компилирую в Xcode со всеми включенными предупреждениями и до сих пор не получаю никаких подсказок (или дополнительных предупреждений) о том, что происходит.

Есть ли у кого-нибудь дополнительные советы по устранению неполадокEXEC_BAD_ACCESS ошибка, или как узнать, если это даже ошибка моего кода?

Ответы [ 2 ]

1 голос
/ 04 ноября 2010

Если вы работаете в GDB, вы должны увидеть трассировку стека, которая даст вам довольно хорошие подсказки, хотя она не скажет вам мгновенно, если проблема в том, что вы оставили плохие вещи или нет.

Вы также можете попробовать включить отладку malloc.

0 голосов
/ 27 марта 2012

У меня была такая же проблема, приложение зависало только при попытке открыть некоторые сканеры (MSG_OPENDS). При вызове MSG_OPENDS на некоторых сканерах (usb) приложение выделяло много памяти, что иногда приводило к сбою.

Я провел много времени, думая, что это ошибка в коде, но когда я тестировал тот же код в TwainClientCocoa, он работал хорошо.

Наконец, потратив еще несколько часов, мне удалось это исправить .. установив CFBundleIconFile из списка проекта.

При сбое MSG_OPENDS отображается окно предупреждения, которое также содержит значок приложения. Я предполагаю, что проблема связана с этим предупреждением (ошибка либо в Twain.framework .., либо в какой-то другой среде, используемой Twain).

...