Как я могу отлаживать внутренней ошибке .Net во время выполнения?

Я пытаюсь отладить некоторые работы, которая обрабатывает большие файлы. Сам код работает, но есть спорадические ошибки из .Чистая себя во время выполнения. В контексте обработки вот файл 1,5 ГБ (загружается в память только один раз) обрабатывается и вышел в петлю, сознательно попытаться воспроизвести эту непредсказуемым ошибки.

Мой фрагмент теста в основном:

try {
    byte[] data =File.ReadAllBytes(path);
    for(int i = 0 ; i < 500 ; i++)
    {
        ProcessTheData(data); // deserialize and validate

        // force collection, for tidiness
        GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
        GC.WaitForPendingFinalizers();
    }
} catch(Exception ex) {
    Console.WriteLine(ex.Message);
    // some more logging; StackTrace, recursive InnerException, etc
}

(с какого времени и другие вещи брошены в)

Цикл будет обрабатывать штраф на неопределенное количество итераций полностью успешно - никаких проблем; затем процесс прекращается резко. Обработчик исключений не попал. Тест включает большое использование памяти, но он видел кошки очень красиво во время каждой итерации (там не явная утечка памяти, и у меня есть много запас - 14ГБ неиспользованный основной памяти на худшем точка в пилообразный). Процесс является 64-разрядной.

Ошибок журнала Windows содержит 3 новые записи, которые (через код выхода 80131506) предложите Ошибка механизма исполнения - малоприятная тварь. А обзоры ответ, указывает на ошибки ГК, С и "исправить" и однако эта &qu отключить параллельной сборки мусора;; исправить" не допустить эту проблему.

Уточнение: это низкоуровневая ошибка не попала в CurrentDomain.Событие unhandledexception.

Уточнение: ГХ.Собрать есть только монитор пилы-зубья памяти, чтобы проверить для утечек памяти и держать вещи предсказуемы; удаление не решит эту проблему: он просто делает держать больше памяти между итерациями, и делает DMP файлов больше ;Р

Путем добавления дополнительных консоль трассировку, я заметил это сбойное течение каждого из:

  • во время десериализации (много выделений и т. д.)
  • во время GC (между ГК "на подходе" и ГК "по полной" и, используя уведомление ГК АПИ)
  • в ходе проверки (просто по каждому поводу некоторых данных) - любопытно после в ГК "по полной" в ходе проверки

Так много разных сценариев.

Могу ли я получить крэш-дампа (ДМП) файлов; как я могу расследовать это дальше, чтобы увидеть, что делает система, когда она не так эффектно?

Комментарии к вопросу (38)
Решение

Если у вас есть дампы памяти, Я'd предлагает с помощью WinDbg, чтобы посмотреть на них, предполагая, что вы'повторно не поступает.

Попытка запуска комментарий!EEStack` (смешанных и управлять трассировкой стека), и посмотреть, если там'ы ничего, что могло бы выпрыгнуть в трассировке стека. В моей тестовой программы, я нашел это один из тех случаев, как мой трассировку стека, где произошло FEEE (я целенаправленно развращает кучи):

в <предварительно> 0:000> !EEStack

Нить 0 Текущий кадр: ntdll!NtWaitForSingleObject+0xa Ребенок-СП RetAddr абонента, вызываемого абонента 00000089879bd3d0 000007fc586610ea KERNELBASE!WaitForSingleObjectEx+0x92, называя ntdll!NtWaitForSingleObject 00000089879bd400 000007fc5869811c KERNELBASE!RaiseException+0x68, называя ntdll!RtlRaiseException [...] 00000089879bec80 000007fc49109cf6 цлр!АРМ::gc_heap::gc1+0x96, называя цлр!АРМ::gc_heap::mark_phase 00000089879becd0 000007fc49109c21 цлр!АРМ::gc_heap::garbage_collect+0x222, называя цлр!АРМ::gc_heap::gc1 00000089879bed10 000007fc491092f1 цлр!АРМ::GCHeap::RestartEE+0xa2, называя цлр!Нить::ResumeRuntime 00000089879bed60 000007fc4910998d цлр!АРМ::GCHeap::GarbageCollectGeneration+как 0xdd, называя цлр!АРМ::gc_heap::garbage_collect 00000089879bedb0 000007fc4910df9c цлр!АРМ::GCHeap::запас+0x31b, называя цлр!АРМ::GCHeap::GarbageCollectGeneration 00000089879bee00 000007fc48ff82e1 цлр!JIT_NewArr1+0x481 </пред>

Поскольку это может быть связано с повреждение кучи от сборщика мусора, я хотел бы попробовать !Команда VerifyHeap. По крайней мере, вы могли убедиться в том, что куча цела (и ваша проблема лежит в другом месте), или обнаруживаете, что ваша проблема на самом деле может быть с ГП или некоторыми П/вызова подпрограмм развращает его.

Если вы обнаружите, что кучи поврежден, я мог бы попробовать и узнать, как же кучи поврежден, что можно сделать с помощью !HeapStat. Что могли бы просто показать всей кучи коррупционеров с определенной точки, хотя.

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

Я полагаю, что если вы найдете его, чтобы быть проблемой с кучи и, таким образом, означает, что он может быть ГК странности, я хотел бы посмотреть на CLR с ГХ событий в трассировки событий для Windows.


Если минидампы вы'вновь, как ты'т разрезая его руку ... вы're, используя ОС Windows 7/2008 R2 или более поздней версии, вы можете использовать глобальные флаги (gflags.exe), чтобы присоединить отладчик, когда процесс завершается без исключения, если вы'повторно не получать ВВЭР уведомления.

В разделе тихий процесс выхода, введите имя исполняемого файла, не полный путь к нему (то есть. TestProgram.exe). Используйте следующие параметры:

  • Установите Флажок Включить Бесшумный Выход Из Процесса Мониторинга
  • Проверить Монитор Процесса Запуска
  • Для процесса мониторинга, использовать {путь к отладка}\cdb.exe -сервер на TCP:порт=5005 -г -г -п %е.

И применить настройки.

Когда ваша программа тест падает, гду будет приложить и ждать для вас, чтобы подключиться к ней. Запустить WinDbg, введите сочетание клавиш Ctrl+R, и использовать строку соединения: протокол TCP:порт=5005,сервера=имя localhost.

Вы можете быть в состоянии пропустить через удаленную отладку, и вместо этого использовать {путь к отладка}\windbg.exe %е. Однако, причина, по которой я предложил вместо удаленного, потому что WerFault.exe, что я считаю, что чтение реестра и запускает процесс контролировать, будет запустить отладчик в сессии 0.

Вы можете сделать сеанс 0 интерактивный и подключить к рабочей станции, но я могу'т помню, как это'ы сделали. Это's также неудобно, потому что вы'd должны переключаться между сеансами, если вам нужно получить доступ к любой из ваших существующих окон вы'вэ были открыты.

Комментарии (0)

Инструменты->отладка-и gt;Общие->включить .Чистая Framework Отладка

`Инструменты->IntelliTace-> IntelliTaceEbents и вызова информации

`Инструменты->IntelliTace-> набор StorIntelliTace записи в этот каталог

и выбрать каталог

позволит вам выйти на .net код и отслеживать каждый вызов функции. Я попробовал его на небольшой выборке проекта, и это работает

после каждого сеанса отладки это, предполагают, чтобы создать запись сеанса отладки. это набор каталог даже если CLR умирает, если я не ошибаюсь

это позволит вам получить точный звонка до среды CLR рухнул.

Комментарии (1)

Попробуйте написать универсальный обработчик исключений и посмотреть, если есть необработанное исключение убивать ваше приложение.

    AppDomain currentDomain = AppDomain.CurrentDomain;
    currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyExceptionHandler);

static void MyExceptionHandler(object sender, UnhandledExceptionEventArgs e) {
        Console.WriteLine(e.ExceptionObject.ToString());
        Console.WriteLine("Press Enter to continue");
        Console.ReadLine();
        Environment.Exit(1);
Комментарии (8)

Я обычно invesitgate проблем, связанных с памятью с Valgrind и GDB.

Если вы работаете на Windows, есть много хороших альтернатив, таких как verysleepy для callgrind, как предложено здесь:<БР /> https://stackoverflow.com/questions/413477/is-there-a-good-valgrind-substitute-for-windows

Если вы действительно хотите отладить внутренние ошибки .Net во время выполнения, у вас есть проблема, что нет источника, ибо ни библиотек, ни ВМ.

Так как вы можете'т отладки, что вы Дон'Т есть, я предлагаю (не только расчленять .Чистая база библиотеки в вопрос с помощью ILSpy, и добавить их в ваш проект, который еще не'т крышка ВМ) можно использовать во время выполнения моно.<БР /> Там у вас есть и источник библиотеками классов, а также ВМ.<БР /> Может быть, ваша программа отлично работает с моно, то ваша проблема будет решена, по крайней мере, так долго, как это's только одно-время обработки задач.

Если нет, существует обширный раздел FAQ, В на отладку, в том числе БГД Поддержка<БР /> http://www.mono-project.com/Debugging

Мигель тоже есть этот пост о поддержке работы с Valgrind:<БР /> http://tirania.org/blog/archive/2007/Jun-29.html

Кроме того, если вы дайте ему поработать в Linux, вы также можете использовать трассированием, чтобы увидеть, что'происходит в системных вызовов. Если вы Don't имеют обширное использование приложения WinForms или WinAPI вызовов .Объем программы, как правило, отлично работает на Linux (для проблем, связанных с чувствительность к регистру файловой системы, вы можете loopmount нечувствительный к регистру файловой системы и/или использовать MONO_IOMAP).

Если вы'вновь с электроприводом ориентированный человек, этот пост говорит, что ближе всего окна это WinDbg'ы Logger.exe но ltrace информация не столь обширна.

Моно исходный код доступен здесь:<БР /> http://download.mono-project.com/sources/

Вы, вероятно, заинтересованы в источниках последний моно версия<БР /> http://download.mono-project.com/sources/mono/mono-3.0.3.tar.bz2

Если вам нужна Framework 4.5, вы'll необходимо, моно 3, здесь вы можете найти скомпилированные пакеты<БР /> https://www.meebey.net/posts/mono_3.0_preview_debian_ubuntu_packages/

Если вы хотите внести изменения в исходный код, это как скомпилировать его:<БР /> http://ubuntuforums.org/showthread.php?t=1591370

Комментарии (0)

Есть .Чистый исключения, который не может быть пойман. Проверить: http://msdn.microsoft.com/en-us/magazine/dd419661.aspx.

Комментарии (0)