Диагностирование приложения подвешивает в производстве настольную программу.NET

Если у вас есть несколько снимков, вы можете собрать их в список следующим образом:

let all: Vec<HashMap<&str, &str>> = re
    .captures_iter("2012-01-12 , 2013-07-11 , 2014-09-14")
    .map(|caps| {
        re.capture_names()
            .map(|o| o.and_then(|n| Some((n, caps.name(n)?.as_str()))))
            .flatten()
            .collect()
    })
    .collect();

println!("{:#?}", all);
5
задан Alexei Levenkov 5 January 2015 в 05:56
поделиться

7 ответов

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

Один возможный способ диагностировать это состоял бы в том, чтобы генерировать дамп процесса, в то время как он завис (предположение, что кто-то вокруг для замечания, когда это происходит). Это было бы сделано с помощью MiniDumpWriteDump из dbghelp.dll. Это довольно просто для записи простого инструмента, который может вывести процесс (на основе его pid), который мог быть предоставлен клиенту, испытывающему проблему. Так как это - управляемое приложение, полный дамп памяти предпочтителен (MiniDumpWithFullMemory), но нормальный дамп должен все еще иметь некоторую полезную информацию. После того как у Вас есть дамп, можно использовать windbg или посмертный отладчик выбора видеть то, что могло бы продолжаться.

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

4
ответ дан 14 December 2019 в 19:30
поделиться

Мысль 1) шаг в код платформы .NET (от КБ на моей работе):

Если Вы установили VS2008 SP1, все, что необходимо сделать, движение к Инструментам-> Опции-> Отладка

  1. Снятие флажка включает просто мой код
  2. Проверка включает исходное продвижение платформы.NET
  3. Проверка Включает исходную поддержку сервера
  4. При Отладке-> Символы, добавьте новое местоположение http://referencesource.microsoft.com/symbols

Теперь при отладке чего-то это получено greyed код платформы в стеке вызовов, просто щелкните правой кнопкой по строке вызова и выберите Load Symbols.

Мысль 2) Установка удаленная отладка http://msdn.microsoft.com/en-us/library/y7f5zaaa.aspx

0
ответ дан 14 December 2019 в 19:30
поделиться

Я предложил бы добавить более подробный вход вокруг вызовов, которым Вы верите, источник проблемы.

Если Вы находитесь на Vista, можно использовать новую Vista API, чтобы иметь вызов Windows в код когда сбои приложения. Это - то, что происходит, когда Вы видите, что продукты MS как Office/IE говорят, что они "Пытаются восстановить Вас данные".

1
ответ дан 14 December 2019 в 19:30
поделиться

если это возможно, замените фоновый рабочий поток SafeThread и посмотрите, ловит ли это подозреваемое исключение. Если это не делает, то выданным исключением не является исключение CLR, и можно не мочь обработать его из 'чистого' кода.NET [SEH от C++ мог бы работать хотя]

Править: хорошо это не это. возможно, это или это могли бы помочь. Удачи!

0
ответ дан 14 December 2019 в 19:30
поделиться

Если у Вас есть необработанный execption на потоке, Вы управляете, он снизит Ваше целое приложение. Нет никакого способа "обработать" это, после того как поток умирает. Вы могли бы хотеть изучить, как можно использовать APM с делегатами. Это обеспечивает слой защиты от исключений, выданных на других потоках, поскольку исключение получено и выдвинуто при вызове EndInvoke ().

Что касается чего еще можно сделать, я ответ второго Charlie.

0
ответ дан 14 December 2019 в 19:30
поделиться

Robert, если все эти решения приводят Вас к сбою, и Вы все еще думаете, что API прежней версии является преступником, возможно, ответ должен поиграть в песочнице API прежней версии в свой собственный AppDomain или процесс.

.NET 3,5 платформы делает это довольно легким сделать использование Системы. API AddIn.

0
ответ дан 14 December 2019 в 19:30
поделиться

Я предложил бы присоединить WinDbg (да, одна из тех жестких вещей) и использовать SOS (Сын Забастовки) и SOSEx для анализа мертвых блокировок (! dlk), или вручную проверяют синхронизирующие блоки (! syncblk) для нахождения взаимно блокировок ожидания.

0
ответ дан 14 December 2019 в 19:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: