Есть ли преимущества сбоя во вторичном потоке по сравнению с основным? - PullRequest
4 голосов
/ 20 августа 2010

Я наткнулся на этот код в большой кодовой базе

DWORD WINAPI ThreadFunc (LPVOID lpParam)
{ 
    int *x = 0;
    *x = 1234; // Access violation

    return 0; 
}

void Manager::Crash ()
{
    Log("Received a remote command to crash Server.");

    DWORD dwThreadId, dwThrdParam = 1; 
    HANDLE hThread = ::CreateThread(NULL, 0, ThreadFunc, &dwThrdParam, 0, &dwThreadId);
} 

Мой вопрос: почему он использует поток?Было бы более или менее поточно безопасно, если код в ThreadFunc был сделан непосредственно в Manager::Crash?Я не хочу вносить изменения в случае, если я удаляю сбой.

Ответы [ 3 ]

5 голосов
/ 20 августа 2010

Он не хочет обрабатывать возникающее исключение. Исходный поток, получивший Manager::Crash, продолжается. AV-исключение не обязательно завершает процесс. Хотя в этом случае тот факт, что не обрабатывается __try/__except блоком (обратите внимание, это SEH try-блок , а не C ++), тогда необработанный второй шанс исключение остановит процесс. Но, возможно, он хочет заставить Доктор. Уотсон / WER , чтобы прыгнуть в него, или посмертный отладчик , чтобы запустить или взломать текущий отладчик. Кто знает ...

Вообще-то, да! ЕСЛИ в основном потоке установлен обработчик SEH, он не завершит процесс. QED.

1 голос
/ 20 августа 2010

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

Кстати, это также неоправданно неуклюжий способ вызвать исключение ЦП.Вы можете вызвать сбой или точку останова напрямую, используя , например, __ debugbreak () или встроенную сборку int 3.Это приведет к немедленному переходу программы в отладчик, который по умолчанию в большинстве программ MSVC будет выгружать ядро, если отладчик не подключен.

0 голосов
/ 20 августа 2010

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

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