Ошибка памяти C # при выходе из программы - PullRequest
0 голосов
/ 16 декабря 2009

У меня есть довольно простая программа на C # (без пользовательского интерфейса, только командная строка), которая использует стороннюю библиотеку (Abbyy Finereader 8.1) для выполнения некоторой работы и затем завершает работу.

Достаточно прост и работает довольно хорошо. Однако недавно мы начали получать следующую ошибку из программы:

Ошибка приложения: инструкция на «0x2c0de46b» ссылается на память в "0x0732aa84".

Небольшое копание показывает, что это происходит в конце кода C #. В основном две последние строки:

  Console.WriteLine(message);
  return statusCode;

Заключительное консольное сообщение написано, и вывод из программы в порядке. В самом деле, если бы не тот факт, что эта ошибка не позволяет программе полностью завершиться, я мог бы обойти ее.

Мы запускаем два скрипта, которые запускают эту программу каждый на двух машинах. Это происходит случайным образом (насколько я могу судить), но обычно по крайней мере один из (4 сценария) срабатывает каждый день. Я думал, что, возможно, какая-то странность происходила для параллельных прогонов, но тестирование устранило это.

Любые мысли о возможных причинах будут приветствоваться, так как у меня закончились идеи.

Также, если кто-нибудь знает, как прекратить выполнение программы, когда это происходит, это было бы полезно.

Ответы [ 2 ]

1 голос
/ 29 декабря 2009

Ну ... Устранение неполадок диктует, что я спрашиваю, что изменилось, но я считаю, что вы сами об этом подумали. Какую версию .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
}

(пример кода DoctaJonez )

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

1 голос
/ 16 декабря 2009

«Ошибка приложения: инструкция в« 0x2c0de46b »ссылается на память в« 0x0732aa84 »."

Эта ошибка подразумевает повреждение памяти где-то в вашем коде, без полного кода я не могу сказать больше, чем это. Место возникновения исключения не имеет значения в этом случае ошибки. Попробуйте взглянуть на ваш код, особенно код, который вызывает библиотеку.

...