Comment forcer un programme à manquer de mémoire?

J’ai un programme C / C ++ qui pourrait être suspendu quand il manque de mémoire. Nous avons découvert cela en lançant plusieurs copies en même temps. Je veux déboguer le programme sans détruire complètement les performances de la machine de développement. Existe-t-il un moyen de limiter la mémoire disponible pour qu’un nouveau ou un malloc renvoie un pointeur NULL après, disons, 500K de mémoire a été demandé?

Essayez de changer la question et demandez-vous comment limiter la quantité de mémoire dont un système d’exploitation vous permettra d’utiliser votre processus.

Essayez de regarder dans http://ss64.com/bash/ulimit.html

Essayez de dire: ulimit -v

Voici un autre lien un peu ancien mais qui donne un peu plus de fond: http://www.network-theory.co.uk/docs/gccintro/gccintro_77.html

Une façon consiste à écrire un wrapper autour de malloc ().

 static unsigned int requested =0; void* my_malloc(size_tamount){ if (requested + amount < LIMIT){ requested+=amount; return malloc(amount); } return NULL } 

Vous pourriez utiliser un #define pour surcharger votre malloc.

Comme l’indique GMan, vous pouvez également surcharger les opérateurs new / delete (pour le cas C ++).

Vous ne savez pas si c'est le meilleur moyen ou ce que vous recherchez

  • Quel OS? Pour Unix, voir ulimit -d / limit dataize en fonction de votre shell (sh / csh).

  • Vous pouvez écrire un wrapper pour malloc qui renvoie une erreur dans la circonférence souhaitée. Selon votre système d’exploitation, vous pourrez peut-être le remplacer par celui de l’implémentation.

Cela dépend de votre plate-forme. Par exemple, cela peut être réalisé par programmation sur les plates-formes de type Unix utilisant setrlimit (RLIMIT_DATA, …) .

EDIT :

La ressource RLIMIT_AS peut également être utile dans ce cas également.

Remplacez nouveau et nouveau [].

 void* operator new(size_t s) { } void* operator new[](size_t s) { } 

Mettez votre propre code dans les accolades pour mourir sélectivement après X nombre d’appels à nouveau. Normalement, vous appelez malloc pour allouer la mémoire et la renvoyer.

Une autre façon de le faire est d’utiliser failmalloc qui est une bibliothèque partagée qui écrase malloc, puis échoue :-). Il vous permet de contrôler quand échouer et peut être amené à échouer au hasard, tous les n fois, etc.

Je ne l’ai pas utilisé moi-même mais j’ai entendu de bonnes choses.

J’ai déjà eu un élève de CS 1 (en C, ouais, ouais, pas de ma faute), essaye ça et manque de mémoire:

 int array[42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42]..... (42 dimensions); 

et puis il voulait savoir pourquoi il y avait des erreurs …

Si vous voulez dépenser de l’argent, il existe un outil appelé Holodeck par SecurityInnovations, qui vous permet d’injecter des erreurs dans votre programme (y compris une mémoire insuffisante). Une bonne chose est que vous pouvez allumer et éteindre à volonté. Je ne l’ai pas vraiment utilisé, donc je ne sais pas s’il est possible de programmer des erreurs à certains endroits avec l’outil. Je ne sais pas non plus quelles plates-formes sont supscopes …

Autant que je sache, sous Linux, malloc ne renverra jamais de pointeur nul. Au lieu de cela, le tueur OOM sera appelé. Ceci, bien sûr, à moins que vous ayez désactivé le tueur OOM. Certains googler devrait trouver un résultat.

Je sais que ce n’est pas votre question, mais elle a un rapport avec votre origine.