Я пишу код на 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
ошибка, или как узнать, если это даже ошибка моего кода?