2010-11-26 3 views
6

Je suis en train de tester une application que mon entreprise a écrite. L'un des scénarios consistait à voir ce qui arrivait à l'état du système si cette application devait planter. Existe-t-il une application qui pourrait provoquer le crash de mon application? Je préfère ne pas écrire un plantage dans le code lui-même (c'est-à-dire null pointeur dereference). L'utilisation du gestionnaire de tâches pour tuer le processus ne donne pas les mêmes résultats.Force crash une application

+0

par injection de DLL pourrait être une voie viable Achive cela, je ne connais pas d'application qui pourrait déjà gérer cela cependant. –

+0

Ne peux-tu pas mettre une simple sortie() au milieu de ta morue? Ou n'est-ce pas considéré comme "s'écraser"? – Raveline

+0

Que voulez-vous dire par état du système? Généralement, lorsqu'un processus se bloque, le système nettoie toutes les ressources utilisées. Cependant, cela peut ne pas s'appliquer à des choses comme les handles de base de données. Comment allez-vous examiner l'état du système? – Nick

Répondre

9

En supposant Windows, consultez Application Verifier.

Il peut faire l'injection de défaut (Simulation faible des ressources) qui fait divers appels d'API échouent, à des taux configurables. Par exemple. Allocations de tas, Alloc virtuel, WaitForXxx, API de registre, API de système de fichiers, etc.

Vous pouvez même spécifier une période de grâce (en millisecondes) lorsque aucun défaut sera injecté lors du démarrage.

+0

Bien, je ne connaissais pas cet outil. On dirait que ça pourrait être très utile! –

-1

appel abort() fonction de votre code. Les autres programmes ne peuvent pas "planter" de façon fiable votre programme - ils ont leur propre contexte de processus qui est isolé du contexte de votre programme. Vous pouvez utiliser quelque chose comme TerminateProcess() dans Windows API ou une autre fonction spécifique à la plate-forme, mais ce serait plus ou moins la même chose que d'utiliser le Gestionnaire des tâches.

1

Vous n'avez pas indiqué quel système d'exploitation vous utilisez mais, si c'est Linux (ou un autre système de type UNIX), vous pouvez simplement kill -9 votre processus. Ce signal ne peut pas être capturé et le tapis sera retiré rapidement de votre processus.

Si vous n'êtes pas sur un système de type UNIX, je ne peux pas vous aider, désolé, mais vous pouvez trouver des informations utiles here (cherchez "taskkill").

0

Où cet "état du système" est-il défini? Si c'était unix, vous pourriez envoyer un signal 9 au processus ...

Si vous en aviez vraiment besoin, vous pourriez partager toute la mémoire de l'application avec un autre processus (ou thread), et avoir ce thread écrire aléatoirement des données aléatoires un emplacement de mémoire malheureux - je pense que la NASA a fait cela pour certains de leurs projets spatiaux, mais je ne pouvais vraiment pas donner de référence.

La vraie question est pourquoi vous voulez faire - qu'est-ce que vous/vraiment/test?

Si cela est, par exemple, un programme qui contrôle un service médical qui prescrit des médicaments ... test unitaire qui place le service, analyser l'API, et rechercher des failles.

0

Effectuez un bufferoverflow vous-même.

#include <string.h> 

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

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

Et votre programme plantera

+1

Malheureusement, ce n'est pas le cas, ce n'est pas un comportement défini, cela peut ne pas toujours donner lieu à un crash garanti. –

0

Si le système fonctionne sous UNIX/Linux, vous pouvez envoyer un signal: SIGQUIT devrait produire une décharge de base, vous pouvez également l'envoyer SIGSEGV si vous voulez tester il obtient un "défaut de segmentation". Ce sont les signaux 3 et 11 respectivement. Si le système est Windows, je ne connais pas le moyen de déclencher un signal dans une application différente, mais si vous pouvez modifier l'application pour gérer un numéro de message Windows spécifique qui appellera raise(), vous pouvez l'émuler. raise() provoque l'élévation du signal sans avoir réellement à écrire du code qui effectue une action illégale. Vous pouvez ensuite envoyer un message à l'application qui aura le gestionnaire qui lève ce signal.

+0

Voir mon post à propos de RaiseException. Ouvrez son processus, obtenez un pointeur de fonction brute, ou corrompez simplement son tas :) –

1

Vous pouvez remplacer le nouvel opérateur global.Ensuite, vous pouvez utiliser un compteur et à une valeur spécifique, vous effectuez un déréférencement de pointeur nul pour forcer votre application à planter. En changeant simplement la valeur de quand effectuer le déréférencement, vous pouvez facilement faire varier le moment de l'accident.

0

Une alternative serait d'exécuter l'application dans un bon débogueur, de définir un point d'arrêt sur une ligne de code particulière, et alto, votre application s'est "écrasée". Maintenant, cela peut ne pas entraîner l'arrêt de tous vos threads, en fonction du débogueur utilisé. Vous pouvez également exécuter l'application dans le débogueur et simplement "arrêter" l'application après un certain temps.

Cela ne provoque pas forcément un crash avec le noyau qui tue l'application (et peut-être le noyau de dumping) mais il ferait probablement ce que vous voulez malgré tout.

2

La meilleure façon est d'appeler RaiseException API de windows.h

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

Ou vous pouvez faire un lien vers l'exécution KeBugCheckEx() de ntoskrnl.exe et l'appeler en votre code.

Exemple:

#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! 
} 
5

Sur Windows, vous pouvez attacher WinDbg à un processus, un certain registre corrompu ou de la mémoire et se détacher. Par exemple, vous pouvez définir le pointeur d'instruction sur 0 pour un thread d'application actif.

windbg -pn notepad.exe 

joindre Juste après, thread courant est réglé sur fil de débogage, de sorte que vous devez changer fil d'application pour le faire planter avec RIP registre mise à jour

0:008> ~0s 
0:000> rrip=0 
0:000> qd 
+0

Si la 2ème commande génère une erreur, utilisez plutôt 'rip = 0'. – ScottRhee