Ошибка памяти 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)

Просто выбрасываю некоторые вещи, так как пока нет однозначного ответа (пока).

Другие вопросы по тегам