2008-09-20 10 views
22

Meine C-Anwendung verwendet 3rd-Bibliotheken, die ihre eigene Speicherverwaltung ausführen. Um robust zu sein, verfügt meine Anwendung über Code, um mit Fehlern der Bibliotheksfunktionen wegen fehlendem freien Speichers umzugehen.So simulieren Speicherzuweisungsfehler

Ich möchte diesen Code testen, und dazu muss ich Fehler aufgrund von Speichermangel simulieren.

Welche Werkzeuge werden dafür empfohlen? Meine Umgebung ist Linux/gcc.

+0

Siehe auch http://stackoverflow.com/questions/1229241/how-do-i-force-a-program-to-appear-to-run-out-of-memory/1232235 –

Antwort

13

Erstellen Sie Ihren eigenen Malloc-Wrapper, der nach dem Zufallsprinzip null anstelle eines gültigen Zeigers zurückgibt. Nun, oder was scheitert konsequent, wenn Sie Unit-Test wollen.

+0

Und auch 'calloc' , 'realloc',' strdup' und andere Speicherzuordnungsfunktionen, die der Code verwendet. Und Sie möchten eine Möglichkeit, diese Funktion auszuschalten, wenn Sie ein Release erstellen. –

4

Sie können Ihre eigene Mock-Bibliothek mit der gleichen Schnittstelle wie Ihre 3rd-Party-Bibliothek anstelle davon schreiben. Sie können LD_PRELOAD auch verwenden, um ausgewählte Funktionen der Bibliothek von Drittanbietern zu überschreiben.

3

Ich kann eine Linux (vielleicht POSIX) spezifische Version geben: __malloc_hook, __realloc_hook, __free_hook. Diese sind in malloc.h deklariert.

EDIT: Eine kleine Ausarbeitung: das sind Funktionszeiger (siehe malloc.h und ihre Man-Page für die genaue Deklaration), aber Vorsicht: Dies sind nicht genau Standards, nur GNU-Erweiterungen. Wenn Portabilität ein Problem ist, verwenden Sie das nicht.

Eine etwas weniger plattformabhängige Lösung könnte darin bestehen, dass Sie ein malloc-Makro deklarieren. Wenn Sie testen, ruft das einen Haken und das echte malloc an.

memhook.h:

#define malloc(s) (my_malloc(s)) 

memhook.c:

#include "memhook.h" 
#undef malloc 
#include <stdlib.h> 

usw.

Sie können damit undichte Stellen erkennen, zufällig die Zuordnung fehlschlagen usw.

+1

Ein malloc-Makro würde nicht helfen, Fehler in Bibliotheken von Drittanbietern zu simulieren - sie sind bereits mit Aufrufen des ursprünglichen malloc kompiliert. LD_PRELOAD würde jedoch helfen. –

22

Sie können ulimit verwenden, um die Anzahl der Ressourcen zu begrenzen, die ein Benutzer verwenden kann, einschließlich Speicher. So erstellen Sie einen Testbenutzer, begrenzen ihre Speicher zu verwenden, um etwas gerade genug, um das Programm zu starten, und jetzt sehen :)

Beispiel sterben:

ulimit -m 64 

Setzt eine Speichergrenze von 64 kb.

0

Sie möchten den Befehl ulimit in bash. Versuchen Sie

help ulimit
bei einer Bash Shell-Eingabeaufforderung.

+0

Ich bin nicht die schnellste Waffe im Westen. Oder sogar der esat, würde es erscheinen. – jfm3

1

Darüber hinaus sollten Sie Valgrind verwenden sie alle und bekommen echte nützliche Berichte über Speicherverhalten des Programms

+1

Das Unterwerkzeug heißt Massiv. Massif ist ein Heap-Profiler. Es misst, wie viel Heap-Speicher Ihr Programm verwendet. Es wird ein Protokoll und ein PostScript-Diagramm (.ps) erstellt. –

0

(um einige der früheren Antworten Als Ergänzung) zu testen

Kasse „Electric Fence“ ein Beispiel für eine malloc-abfangende Bibliothek, die Sie mit Ihrer ausführbaren Datei verwenden können (z. B. mit dem LD_PRELOAD-Trick).

Sobald Sie malloc abgefangen haben, können Sie alle Fehler, die Sie auslösen möchten, verwenden. Ein zufällig ausgelöster Fehler wäre ein guter Stresstest für die verschiedenen Teile des Systems.Sie können die Fehlerwahrscheinlichkeit auch basierend auf der angeforderten Speichermenge ändern.

Yours ist eine interessante Idee, die übrigens eindeutig etwas, das ich auf einige meinen Code tun möchte ...

7

Bei Betriebssystemen, die Speicher (zum Beispiel Linux oder Windows), es overcommit Es ist einfach nicht möglich, Speicherfehler zu behandeln. malloc kann einen gültigen Zeiger zurückgeben, und später, wenn Sie versuchen, es zu dereferenzieren, kann Ihr Betriebssystem feststellen, dass Sie über nicht genügend Arbeitsspeicher verfügen und den Prozess beenden.

http://www.reddit.com/comments/60vys/how_not_to_write_a_shared_library/ ist eine gute schreiben auf diese.

+0

Dieses Verhalten hat mein Projekt in letzter Zeit zu schweren Schmerzen geführt. Mann Malloc und schauen Sie unter der Überschrift BUGS. echo/proc/sys/vm/übercommit_memory Wenn es 2 ist, dann ist Overcommit ausgeschaltet. –

+0

Diese Antwort ist einfach falsch. Overcommit wird leicht deaktiviert, und andere Faktoren wie "ulimit" oder Erschöpfung des gesamten virtuellen Adressraums können ebenfalls zu Fehlzuweisungen führen. –

+0

Übrigens, Ihr Link führt zu einem Juwel: http://lwn.net/Articles/104185/ –

0

Möglicherweise möchten Sie sich einige der recovery-orientierten Computer-Sites ansehen, z. B. Berkeley/Stanford ROC group. Ich habe gehört, dass einige dieser Leute vorher reden, und sie verwenden Code, um zufällig Fehler in der C-Laufzeit zu injizieren. Es gibt einen Link zu ihrem FIT-Tool am unteren Rand ihrer Seite.

+0

Es scheint, dass der Werkzeugname FIG, nicht FIT ist. –