Принудительно завершить работу приложения - PullRequest
6 голосов
/ 26 ноября 2010

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

Ответы [ 10 ]

9 голосов
/ 26 ноября 2010

Предполагая Windows, см. Проверка приложения .

Он может выполнять инъекцию ошибок (моделирование низкого ресурса), которая приводит к сбою различных вызовов API с настраиваемой скоростью. Например. Распределение кучи, Virtual Alloc, WaitForXxx, API-интерфейсы реестра, API-интерфейсы файловой системы и т. Д.

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

5 голосов
/ 12 августа 2015

В Windows вы можете присоединить WinDbg к процессу, повредить регистр или память и отсоединить. Например, вы можете установить указатель инструкции на 0 для некоторого активного потока приложения.

windbg -pn notepad.exe

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

0:008> ~0s 
0:000> rrip=0
0:000> qd
2 голосов
/ 18 октября 2011

Лучший способ - вызвать RaiseException API из windows.h

RaiseException(0x0000DEAD,0,0,0);

Или вы можете выполнить связывание во время выполнения с KeBugCheckEx () из ntoskrnl.exe и вызвать его в своем коде.

Пример:

#include <windows.h>
#include <iostream>
using namespace std;

int main()
{
    HINSTANCE h = LoadLibrary("ntoskrnl.exe");
    cout<<h<<endl;
    void* a;
    a = (void*) GetProcAddress(h,"KeBugCheckEx");
    int(*KeBugCheckEx)(ULONG,ULONG_PTR,ULONG_PTR,ULONG_PTR,ULONG_PTR);
    KeBugCheckEx = (int(*)(ULONG,ULONG_PTR,ULONG_PTR,ULONG_PTR,ULONG_PTR))a;

    cout << a;
    KeBugCheckEx(0,0,0,0,0); //crash in module ntoskrnl.exe means that call success!
}
1 голос
/ 26 ноября 2010

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

1 голос
/ 26 ноября 2010

Вы не указали, в какой ОС вы работаете, но, если это Linux (или другая UNIX-подобная система), вы можете просто kill -9 свой процесс.Этот сигнал не может быть перехвачен и приведет к тому, что ковер будет вытащен из-под вашего процесса довольно быстро.

Если вы не в UNIX-подобной системе, я не могу вам помочь, извините,но вы можете найти некоторую полезную информацию здесь (ищите "taskkill").

0 голосов
/ 28 ноября 2010

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

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

0 голосов
/ 26 ноября 2010

Если система работает в UNIX / Linux, вы можете отправить ей сигнал: SIGQUIT должен создать дамп ядра, вы также можете отправить его SIGSEGV, если вы хотите проверить его на наличие «ошибки сегментации». Это сигналы 3 и 11 соответственно.

Если система Windows, я не знаю, как подать сигнал в другом приложении, но если вы можете изменить приложение для обработки определенного номера сообщения Windows, которое будет вызывать повышение (), вы можете эмулировать это. Повышение () вызывает повышение сигнала без необходимости написания кода, который выполняет недопустимое действие. Затем вы можете отправить сообщение в приложение, в котором будет обработчик, который генерирует этот сигнал.

0 голосов
/ 26 ноября 2010

Создайте переполнение буфера самостоятельно.

#include <string.h>

void doSomething(char *Overflow)
{
   char Buffer[1];
   strcpy(Buffer, Overflow);
}

int main()
{
   doSomething("Muhaha");
}

И ваша программа потерпит крах

0 голосов
/ 26 ноября 2010

Где определяется это «состояние системы»?Если бы это был Unix, вы могли бы отправить сигнал 9 процессу ...

Если вам действительно нужно, вы могли бы разделить всю память приложения с другим процессом (или потоком), и этот поток записал бы случайным образомслучайные данные - какое-то неудачное место в памяти - я думаю, что НАСА делало это для некоторых своих космических проектов, но я действительно не мог дать ссылку.

Реальный вопрос в том, почему вы хотите это сделать - кто вы /В самом деле / ​​тестирование?

Если это, например, какая-то программа, которая контролирует какую-то медицинскую службу, которая выписывает лекарства ... Вместо этого протестируйте эту службу, проанализируйте API и найдите недостатки.

0 голосов
/ 26 ноября 2010

Вызовите abort() функцию из вашего кода. Другие программы не могут надежно «сбить» вашу программу - у них есть собственный контекст процесса, который изолирован от контекста вашей программы. Вы можете использовать что-то вроде TerminateProcess() в Windows API или другую платформо-зависимую функцию, но это будет примерно так же, как при использовании диспетчера задач.

...