Я пытаюсь отладить некоторые работы, которая обрабатывает большие файлы. Сам код работает, но есть спорадические ошибки из .Чистая себя во время выполнения. В контексте обработки вот файл 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 файлов больше ;Р
Путем добавления дополнительных консоль трассировку, я заметил это сбойное течение каждого из:
Так много разных сценариев.
Могу ли я получить крэш-дампа (ДМП) файлов; как я могу расследовать это дальше, чтобы увидеть, что делает система, когда она не так эффектно?
Если у вас есть дампы памяти, Я'd предлагает с помощью WinDbg, чтобы посмотреть на них, предполагая, что вы'повторно не поступает.
Попытка запуска комментарий!EEStack` (смешанных и управлять трассировкой стека), и посмотреть, если там'ы ничего, что могло бы выпрыгнуть в трассировке стека. В моей тестовой программы, я нашел это один из тех случаев, как мой трассировку стека, где произошло FEEE (я целенаправленно развращает кучи):
Нить 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 должны переключаться между сеансами, если вам нужно получить доступ к любой из ваших существующих окон вы'вэ были открыты.
Инструменты->отладка-и gt;Общие->включить .Чистая Framework Отладка
`Инструменты->IntelliTace-> IntelliTaceEbents и вызова информации
`Инструменты->IntelliTace-> набор StorIntelliTace записи в этот каталог
и выбрать каталог
позволит вам выйти на .net код и отслеживать каждый вызов функции. Я попробовал его на небольшой выборке проекта, и это работает
после каждого сеанса отладки это, предполагают, чтобы создать запись сеанса отладки. это набор каталог даже если CLR умирает, если я не ошибаюсь
это позволит вам получить точный звонка до среды CLR рухнул.
Попробуйте написать универсальный обработчик исключений и посмотреть, если есть необработанное исключение убивать ваше приложение.
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);
Я обычно 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
Есть .Чистый исключения, который не может быть пойман. Проверить: http://msdn.microsoft.com/en-us/magazine/dd419661.aspx.