2014-11-16 2 views
1

У меня возникла ситуация на производственной машине, где поток в моей службе Windows просто умирает, не бросая исключение. На сегодняшний день мой журнал не был достаточно подробным, чтобы точно определить строку кода, где он умирает; Для этой цели я развернул новую версию с более подробным протоколированием. Но пока я не получу курящее оружие, мое подозрение попадает на строку кода, где я создаю новый контекст БД.Возможно ли, что нить просто умрет без исключения?

Ошибка не предсказуема, за исключением того, что она имеет тенденцию возникать в периоды высокой активности и часто коррелирует с другими потоками, бросающими исключения таймаута БД (следовательно, мое подозрение выше). Исключения, с которыми я могу справиться. Мертвых нитей я не могу.

Любые идеи, почему нить может умереть молча или иначе просто замораживать? Или что с этим делать?

EDIT: Чтобы быть ясным, код окружен блоком try-catch, а catch выполняет некоторые протоколирования (используя log4net). Так происходит и «наконец». Я знаю, что он работает, потому что другие потоки оставили журналы, когда они бросали исключения. Все, что я вижу в своем журнале, это то, что нить x попадает в определенную точку отладки, после чего ее никогда не видели и не слышали, и работа, которую она должна была выполнять, еще не выполнена.

+3

Что значит «умереть»? Вы уверены, что закончили выполнение? Очень может быть тупик. – Leandro

+0

какой тайм-аут установлен для указанного контекста БД ..? вы можете показать фрагмент фактического кода ..? возможно, вы справитесь с обработкой исключительных ситуаций, которые могут быть свернуты немного дальше .. трудно реально определить, не видя никакого существующего кода – MethodMan

+0

Поскольку потоки не могут просто * исчезать *, но должны быть фактически завершены операционной системой, я не думаю что это можно сделать без исключения. – poke

ответ

0

Если у вас есть доступ к системе, я бы ее отладил с помощью: Visual Studio 2013 Remote Debugger. Это часто бывает хорошим выбором, если вы не можете воспроизвести ошибку в своей среде разработки.

Нити не замораживают или не замирают, проверьте, есть ли в вашем коде какие-либо пустые блоки catch или он запускается в бесконечный цикл (или очень длинный тайм-аут в любой точке).

Возможно, у вас есть код для нас.

0

Нет, не совсем (но вроде). Нити не умирают, они заканчиваются. Поток может завершиться успешно или сбой - если поток не работает, то его исключение сохраняется до его обработки. В зависимости от того, как вы создаете поток, возможно, что вы «стреляете и забываете», а это означает, что если возникает исключение, у вас нет кода для его обработки и извлечения. Это вдвойне плохо, так как это приводит к невыпущенным ресурсам (они ждут вас, чтобы получить и обработать исключение).

Однако вы не указали какие-либо сведения о том, что вы диагностировали. Какой поточный подход/структура вы используете (их немало)? Наблюдаете ли вы за потоками процессов и видите, что они внезапно исчезают? Вы делаете снимки кучи или прикрепляетесь к текущему процессу после того, как он, кажется, умер?

Смежные вопросы