Ошибка памяти C# при выходе из программы
У меня есть довольно простая программа на C# (без пользовательского интерфейса, просто командная строка), которая использует стороннюю библиотеку (Abbyy Finereader 8.1) для выполнения некоторой работы и затем завершает работу.
Достаточно просто и работает довольно хорошо. Однако недавно мы начали получать следующую ошибку из программы:
Ошибка приложения: инструкция в "0x2c0de46b" ссылается на память в "0x0732aa84".
Небольшое копание показывает, что это происходит в конце кода C#. В основном последние две строки:
Console.WriteLine(message);
return statusCode;
Заключительное консольное сообщение написано, и вывод из программы в порядке. Действительно, если бы не тот факт, что эта ошибка не позволяет программе полностью завершиться, я мог бы обойти ее.
Мы запускаем два сценария, которые вызывают эту программу каждый на двух машинах. Это происходит случайным образом (насколько я могу судить), но обычно по крайней мере один из (4 сценария) срабатывает каждый день. Я думал, что, возможно, какая-то странность происходила для параллельных прогонов, но тестирование устранило это.
Любые мысли о возможных причинах будут приветствоваться, поскольку у меня закончились идеи.
Также, если кто-нибудь знает, как завершить программу, когда это произойдет, это было бы полезно.
2 ответа
"Ошибка приложения: инструкция в"0x2c0de46b"ссылается на память в"0x0732aa84"."
Эта ошибка подразумевает повреждение памяти где-то в вашем коде, без полного кода я не могу сказать больше, чем это. Место возникновения исключения не имеет значения в этом случае ошибки. Попробуйте взглянуть на ваш код, особенно код, который вызывает библиотеку.
Ну... Устранение неполадок диктует, что я спрашиваю, что изменилось, но я думаю, вы сами об этом подумали. Какую версию.NET Framework вы используете? В каких ОС возникает эта проблема?
Я полагаю, что это исключение происходит от некоторой очистки, которую делает сторонняя библиотека. Вы обращались в их службу поддержки? Можете ли вы попытаться явно выгрузить библиотеку и посмотреть, если ошибка все еще происходит тогда?
Или... вы пытались добавить обработчик для необработанных исключений? Может стоит попробовать...
public static void Main()
{
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(
OnUnhandledException);
//some code here....
}
/// <summary>
/// Occurs when you have an unhandled exception
/// </summary>
public static void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
//here's how you get the exception
Exception exception = (Exception)e.ExceptionObject;
//bail out in a tidy way and perform your logging
}
(пример кода от Doctor Jones)
Просто выбрасываю некоторые вещи, так как пока нет однозначного ответа (пока).