Re: Почему не снять процесс?
От: Velheart Беларусь  
Дата: 07.08.09 08:41
Оценка: +1
У меня, кстати, похожая ситуация возникает с некоторой периодичностью: при отладке тяжеловесных приложений(может совпадение, но имеющих по 15 — 20 потоков) иногда дебагер виснет при пошаговом выполнении и снять его из диспетчера задач вместе с процесом невозможно + иногда весь GUI начинает так тормозить, что почти невозможно ничего убить, ну или ооочень долго ждать, пока все отрисуется и отреагирует на клавиши/мышь, а потом после убийства дебагера все опять ок. Причем происходило такое как с вижуал студией, так и с олли и на разных машинах. Вобщем много неприятных моментов доставляет, было бы тож интересно понять из-за чего..
Почему не снять процесс?
От: avp_  
Дата: 07.08.09 07:17
Оценка:
Есть некий процесс-сервис, работающий с железкой. На некоторых единичных
системах он иногда (раз в неделю примерно) наглухо зависает. Да так
зависает, что не снимается с диспетчера задач. В чём может быть причина
того что процесс даже не убить? Может ли антивирус быть причиной?
Posted via RSDN NNTP Server 2.1 beta
Re: Почему не снять процесс?
От: x64 Россия  
Дата: 07.08.09 08:07
Оценка:
_>В чём может быть причина того что процесс даже не убить?

Например, запрос ушёл в ядро, но так и не вернулся и чего-то ждёт в состоянии non-alertable, а отменялку поставить забыли. Почему и чего там ждут — отдельный вопрос. Ты чем гадать здесь поди и дамп системы сделай (manully-initiated crash, если это на реальной машине происходит), там уже можно будет посмотреть состояния потоков и так далее, всяко яснее станет.

_>Может ли антивирус быть причиной?


Скорее нет, чем да, ну по крайне мере я такого не замечал за ними. Более вероятно, какой-нибудь другой кривой драйвер-фильтр.
Re[2]: Почему не снять процесс?
От: avp_  
Дата: 07.08.09 09:38
Оценка:
x64 wrote:
> _>В чём может быть причина того что процесс даже не убить?
>
> Например, запрос ушёл в ядро, но так и не вернулся и чего-то ждёт в
> состоянии non-alertable, а отменялку поставить забыли. Почему и чего там
> ждут — отдельный вопрос. Ты чем гадать здесь поди и дамп системы сделай
> (manully-initiated crash, если это на реальной машине происходит), там
> уже можно будет посмотреть состояния потоков и так далее, всяко яснее
> станет.


Значит косяки скорее в драйверах чем в приложении? Дамп сделаю, если
зависнет в следующий раз, только какой делать: ядра или всей памяти?
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Почему не снять процесс?
От: x64 Россия  
Дата: 07.08.09 18:00
Оценка:
_>Значит косяки скорее в драйверах чем в приложении?

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

_>Дамп сделаю, если зависнет в следующий раз, только какой делать: ядра или всей памяти?


Достаточно памяти ядра.
Re[2]: Почему не снять процесс?
От: Константин http://flint-inc.ru/
Дата: 18.08.09 09:31
Оценка:
Здравствуйте, x64, Вы писали:

_>>Может ли антивирус быть причиной?


x64>Скорее нет, чем да, ну по крайне мере я такого не замечал за ними. Более вероятно, какой-нибудь другой кривой драйвер-фильтр.


На самом деле, может. Лично наблюдал такое поведение после того, как касперовцы однажды выпустили кривое обновление. У Каспера есть драйвер-фильтр для проверки сетевого трафика (почта, веб), и вот в нём приложения, работавшие с сетью (в моём случае это был почтовик), периодически наглухо зависали.
Почему же, ё-моё, ты нигде не пишешь «ё»?
Re[3]: Почему не снять процесс?
От: x64 Россия  
Дата: 18.08.09 09:40
Оценка:
К>На самом деле, может.

Так кто спорит-то? Я лишь хочу сказать, что это менее вероятно, что какое-либо поделие Васи Пупкина, например.
Re[3]: Почему не снять процесс?
От: eagersh  
Дата: 18.08.09 15:23
Оценка:
Здравствуйте, avp_, Вы писали:



_>x64 wrote:

>> _>В чём может быть причина того что процесс даже не убить?
>>
>> Например, запрос ушёл в ядро, но так и не вернулся и чего-то ждёт в
>> состоянии non-alertable, а отменялку поставить забыли. Почему и чего там
>> ждут — отдельный вопрос. Ты чем гадать здесь поди и дамп системы сделай
>> (manully-initiated crash, если это на реальной машине происходит), там
>> уже можно будет посмотреть состояния потоков и так далее, всяко яснее
>> станет.


_>Значит косяки скорее в драйверах чем в приложении? Дамп сделаю, если

_>зависнет в следующий раз, только какой делать: ядра или всей памяти?
Если Windows приложение, а в данном случае твой процесс, сделал запрос к драйверу и драйвер не возратил запрос
то убить приложения сразу нельзя. Приложение убивается но после ~5 минут даже при незавершенном запросе в драйвере.
Если ситуация повторится то попробуй убить процесс но подожди 5-7 минут. Если через это время процесс исчезнет то значит драйвер
не обеспечил Cancel routine в Irp. Короче, проблема в драйвере.
Re[4]: Почему не снять процесс?
От: avp_  
Дата: 19.08.09 12:15
Оценка:
eagersh wrote:

> Если Windows приложение, а в данном случае твой процесс, сделал запрос к

> драйверу и драйвер не возратил запрос то убить приложения сразу нельзя.
> Приложение убивается но после ~5 минут даже при незавершенном запросе в
> драйвере. Если ситуация повторится то попробуй убить процесс но подожди
> 5-7 минут. Если через это время процесс исчезнет то значит драйвер не
> обеспечил Cancel routine в Irp. Короче, проблема в драйвере.

Спасибо. Интересно, где нибудь про эти 5 минут официально задокументировано?

Пока переставили винду с нуля и самые свежие дрова установили.
Posted via RSDN NNTP Server 2.1 beta
Re[5]: Почему не снять процесс?
От: x64 Россия  
Дата: 19.08.09 13:07
Оценка:
VOID
IoCancelThreadIo(
    IN PETHREAD Thread
    )

/*++

Routine Description:

    This routine cancels all of the I/O operations for the specified thread.
    This is accomplished by walking the list of IRPs in the thread IRP list
    and canceling each one individually.  No other I/O operations can be
    started for the thread since this routine has control of the thread itself.

Arguments:

    Tcb - Pointer to the Thread Control Block for the thread.

Return Value:

    None.

--*/

{
    PLIST_ENTRY header;
    PLIST_ENTRY entry;
    KIRQL irql;
    PETHREAD thread;
    PIRP irp;
    ULONG count;
    LARGE_INTEGER interval;

    PAGED_CODE();

    DBG_UNREFERENCED_PARAMETER( Thread );

    thread = PsGetCurrentThread();

    header = &thread->IrpList;

    if ( IsListEmpty( header )) {
        return;
    }

    //
    // Raise the IRQL so that the IrpList cannot be modified by a completion
    // APC.
    //

    KeRaiseIrql( APC_LEVEL, &irql );

    entry = header->Flink;

    //
    // Walk the list of pending IRPs, canceling each of them.
    //

    while (header != entry) {
        irp = CONTAINING_RECORD( entry, IRP, ThreadListEntry );
        IoCancelIrp( irp );
        entry = entry->Flink;
    }

    //
    // Wait for the requests to complete.  Note that waiting may eventually
    // timeout, in which case more work must be done.
    //

    count = 0;
    interval.QuadPart = -10 * 1000 * 100;

    while (!IsListEmpty( header )) {

        //
        // Lower the IRQL so that the thread APC can fire which will complete
        // the requests.  Delay execution for a time and let the request
        // finish.  The delay time is 100ms.
        //

        KeLowerIrql( irql );
        KeDelayExecutionThread( KernelMode, FALSE, &interval );

        if (count++ > 3000) {

            //
            // This I/O request has timed out, as it has not been completed
            // for a full 5 minutes. Attempt to remove the packet's association
            // with this thread.  Note that by not resetting the count, the
            // next time through the loop the next packet, if there is one,
            // which has also timed out, will be dealt with, although it
            // will be given another 100ms to complete.
            //

            IopDisassociateThreadIrp();
        }

        KeRaiseIrql( APC_LEVEL, &irql );
    }

    KeLowerIrql( irql );
}
Re[4]: Почему не снять процесс?
От: x64 Россия  
Дата: 19.08.09 13:11
Оценка:
E>Приложение убивается но после ~5 минут даже при незавершенном запросе в драйвере.

Несмотря на то, что процесс через определённое время таки уничтожается, незавершённые пакеты запросов (IRP) не освобождаются на случай, если драйвер когда-нибудь всё же решит завершить их.
Re: Почему не снять процесс?
От: avp_  
Дата: 20.08.09 10:11
Оценка:
Появилась дополнительная информация. Устройство работает на USB. После
зависания процесса, работающего с устройством, физическое отсоединение
устройства разблокирует процесс. После подключения всё начинает работать
нормально. Варианты:
1) Глючное устройство зависает. Но почему тогда драйвер блокирует запрос?
2) Глючный USB чипсет на материнке.
Posted via RSDN NNTP Server 2.1 beta
Re[5]: Почему не снять процесс?
От: eagersh  
Дата: 20.08.09 15:35
Оценка:
Здравствуйте, avp_, Вы писали:



_>eagersh wrote:


>> Если Windows приложение, а в данном случае твой процесс, сделал запрос к

>> драйверу и драйвер не возратил запрос то убить приложения сразу нельзя.
>> Приложение убивается но после ~5 минут даже при незавершенном запросе в
>> драйвере. Если ситуация повторится то попробуй убить процесс но подожди
>> 5-7 минут. Если через это время процесс исчезнет то значит драйвер не
>> обеспечил Cancel routine в Irp. Короче, проблема в драйвере.

_>Спасибо. Интересно, где нибудь про эти 5 минут официально задокументировано?


_>Пока переставили винду с нуля и самые свежие дрова установили.

Нет не задокументированно.
Re[2]: Почему не снять процесс?
От: avp_  
Дата: 24.08.09 09:20
Оценка:
Странно ещё то, что процесс зависает при работе с устройством в overlapped
режиме.
Posted via RSDN NNTP Server 2.1 beta
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.