malloc

Haciendo debug he localizado un fallo de los que dan code dump: Lo que pasa es lo siguiente.
El code dump en si no lo produce la linea de codigo, pero si llamo a la funcion que la contiene en algun momento, al salir de la aplicacion sale un code dump. En cambio si comento esa linea en la funcion ya no hay code dump. Obviamente mi programa no hace lo que debe si comento la linea, pero comentarla me sirve para saber que es la culpable.
MESH * cubo = (MESH*)malloc(sizeof(MESH));


Lo extraño es que tengo llamadas similares en otras partes del programa y no producen code dumps. Ejemplos:
mRoot = (Root*)malloc(sizeof(Root));

Object * Objeto = (Object*)malloc(sizeof(Object));


¿Alguien sabe que puede estar produciendo los code dumps al salir del programa? (para salir solo llamo a exit(0);)
Yo también tuve en su día CORE DUMPS absurdos, estas usando la version de CVS?
prueba a usar el devkitppc r15, la verdad no te se decir por qué ocurre.
Otra cosa, has probado a sustituir malloc por memalign(0x40, tamanio) ? Creo que en la wii es necesario que los datos en memoria esten alineados de esa manera, y no se si malloc se encarga de ello.
Siento no ser de mas ayuda, suerte ;)
Magnífico!! Lo has solucionado [flipa] . Estos code dumps absurdos llevan dandome la lata un monton de tiempo... Muchas gracias Superken7.
¿Cual era el problema? ¿Lo has solucionado con el memalign? Me sucede lo mismo con un free rebelde, y ya utilizo el devkitppp r15.
Bueno, utilizo el devkit r15 tambien. la solucion para ese caso concreto ha sido el memalign(0x40... pero en otros casos no me funciona. A veces tengo que poner 32 (que en hexadecimal es 0x20) y otras veces ni asi. A ver si tenemos suerte y marcan se pasa por aqui y nos echa un cable, que siendo sus librerias quiza sepa ayudarnos. Por el momento te recomiendo que trastees alternando entre memalign y malloc hasta que vallas eliminando fallos. Para mi sigue siendo un problema, porque las displaylists necesitan memoria alineada a 32B y si no me funciona porque da code dump no se como solucionarlo.
Gracias! En cuanto llegue a casa lo pruebo y comento.
technik: Que quites una línea y que de deje de dar code dump no significa necesariamente que el fallo esté en esa línea. Por ejemplo:
int *numero;
numero = NULL;
void *memoria = malloc (*numero);

Aqui si quitas la línea 3 deja de dar fallo, pero está claro que el problema viene por la inicialización del puntero en la línea anterior...

En cuanto al tema malloc/memalign hay una regla muy fácil para saber cuando usar uno u otro. Se usa memalign alineado a 32 bytes cuando algún hardware externo a la CPU va a acceder a esa memoria. En tu caso imagino que era la GPU la que estaba accediendo. Se usa malloc cuando sólo la CPU va a direccionar la memoria que estas reservando. Por supuesto esta regla sólo es válida para Wii y GC, otros sistemas tendrán sus propios requisitos.
Frontier está en lo cierto, la gpu de wii espera que las direcciones de memoria esten alineadas así, de ahi los ATTRIBUTE_ALIGN(32) en los ejemplos.
El problema es que el fallo de antes me lo daba en una funcion que no tenia nada que ver con el procesador grafico. Es decir, aun no lo tenia. No le habia metido aun ninguna instruccion grafica, solo habia reservado la memoria y compile para probar
Confirmo que he solucionado el error sustituyendo el malloc por un memalign. En mi caso tampoco accedo para nada a la GPU.
9 respuestas