9
votes

Comment puis-je déboguer des défaillances ST9BAD_ALLOC dans GDB en C?

J'ai un programme échoué avec:

terminate called after throwing an instance of 'std::bad_alloc'
  what():  St9bad_alloc


0 commentaires

3 Réponses :


0
votes

Il est tout à fait possible que cela se produit en raison de la mémoire écrasée, corrompue ainsi l'état du système d'allocation de la mémoire (qui est généralement conservé avant ou après que les blocs de mémoire renvoyés à l'application).

Si vous avez la possibilité (c'est-à-dire que vous êtes sur X86 Linux), exécutez votre programme dans Valgrind , Cela peut souvent vous montrer exactement où la corruption arrive.


0 commentaires

14
votes

Ce n'est pas vraiment malloc / gratuit qui provoque l'exception, c'est "nouveau" qui est définitivement dans une partie de votre application C ++. On dirait que vous fournissez un paramètre trop gros pour "nouveau" pour allouer.

'std :: bad_alloc' est causé par le code suivant par exemple: xxx P> Qu'est-ce que BackTrace dit lorsque vous chargez une décharge de crash dans le GDB? Si vous ne pouvez pas générer de vidage, vous pouvez demander à GDB d'arrêter Quand une exception est lancée ou attrapée . Malheureusement, certaines versions de GDB ne prennent en charge que la syntaxe suivante: xxx

qui vous permet de casser une application lorsque toute exception est lancée. Cependant, pour vous aider à voir qu'il devrait être possible d'exécuter xxx

dans les versions plus récentes.

et n'oubliez pas que:

(gdb) aide à attraper

est une bonne source pour d'autres informations utiles.


1 commentaires

Votre lien pour "Quand une exception est lancée ou attrapée" est 404.



0
votes

J'ai eu ceci lorsque vous essayez de lire dans un fichier qui n'existe pas ... J'essaierais de créer un tampon interne pour le contenu du fichier, mais que le fichier n'existait pas, ma création du tampon vissé.

int lenth_bytes;
length_bytes = in_file.tellg();
new char [length_bytes]; // length_bytes hadn't been initialised!!!!


0 commentaires