2009-11-02 24 views
7

Tengo un programa en su defecto con:¿Cómo puedo depurar fallas St9bad_alloc en gdb en C?

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

Me imagino que es algo que ver con malloc/free, pero no sé cuál.

¿Qué punto de interrupción puedo en el conjunto de gdb que romperá el error para que pueda ver un seguimiento de la pila?

El programa es una combinación de C y C++, compilada con gcc 3.4.2.

Respuesta

12

No es realmente malloc/free lo que causa la excepción, es "nuevo" que definitivamente forma parte de C++ en su aplicación. Parece que está proporcionando un parámetro que es demasiado grande para asignar "nuevo".

'std :: bad_alloc' es causada por el siguiente código de ejemplo:

int * p = new int[50000000]; 

¿Qué dice traza cuando se carga de volcado en GDB? Si no puede generar volcado, puede solicitar a GDB que detenga when exception is thrown or caught. Desafortunadamente, algunas versiones del BGF soporte únicamente la siguiente sintaxis:

catch throw 

que le permite romper la aplicación cuando se lanza ninguna excepción. Sin embargo, en ayudar a ver que debe ser posible ejecutar

catch throw std::bad_alloc 

en las últimas versiones.

Y no hay que olvidar que:

(BGF) ayuda a detectarlo

es una buena fuente de información útil.

+0

Su enlace para "Cuando se arroja o atrapa una excepción" es 404. – Karl

0

Es muy posible que esto ocurra debido a que se sobrescribe alguna memoria, lo que corrompe el estado del sistema de asignación de memoria (que generalmente se guarda antes o después de que los bloques de memoria regresen a la aplicación).

Si tienes la posibilidad (es decir, estás en x86 Linux), ejecutar tu programa en Valgrind, a menudo puede mostrarte exactamente dónde ocurre la corrupción.

0

Lo he tenido al intentar leer en un archivo que no existe ... Trataría de crear un buffer interno para el contenido del archivo, pero como el archivo no existía, mi creación del tampón atornillado.

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

Recuerde niños, siempre inicialice sus variables: D y compruebe cero casos.

Cuestiones relacionadas