IIC2333 / foro-2019-1

Foro oficial del curso IIC2333 - Sistemas Operativos y Redes, semestre 2019-1.
2 stars 0 forks source link

Diferentes versiones de C (????) #17

Closed santiagocruzb closed 5 years ago

santiagocruzb commented 5 years ago

Hola! Para hacer esta tarea he usado 2 computadores (mac 10.10, mac 10.14) y el servidor del curso. He trabajado con un repositorio propio para ir guardando los cambios y cambiarme de computador. El problema es que entre al momento de ejecutar el programa ya compilado, en los 3 lugares me aparecen cosas distintas.

mac 10.10

Id: 0 - Puntero: 0x7f93a3404ae0 -   Prior: -805306368 -     Name: HEAD -    Start_time: -1
    Priority: -805306368
[1]    2200 segmentation fault  ./schedule tests/test1.txt out.txt np 3

mac 10.14

...
60480 32767 1288136166 32767 0 0 - (muchos numeros sin sentido que parecen ser la memoria)
Id: 1 - Puntero: 0x7fef95c02b90 -   Prior: 1 -  Name: HEAD -    Start_time: -1
    Priority: 1
    cpu burst: 

servidor

Id: -1830044808 - Puntero: 0x1bb1030 -  Prior: -1 -     Name: HEAD -    Start_time: -1
    Priority: -1
    cpu burst:

Da la casualidad que lo que muestra el servidor es lo correcto (los punteros, valores integers y strings son los esperados), pero no entiendo qué es lo que ocurre. Alguna idea de lo que puede estar ocurriendo? Saludos, gracias.

cruz commented 5 years ago

Hola. No es algo tan raro. Es algo que puede pasar en C. El compilador de C genera código directamente para la máquina en la que compilas, y las reglas de asignación de memoria no son parte del estándar de C, sino que lo define la implementación de cada compilador, precisamente porque depende de cómo se puede hacer en cada arquitectura.

Por ejemplo, malloc garantiza que te va a dar un trozo de memoria garantizado, pero el cómo se implementa lo decide la implementación del compilador de acuerdo a la máquina y sistema operativo en que compilas. Por eso un código compilado en C no es portable entre máquinas.

La consecuencia es que un ejecutable para cada máquina distinta se puede comportar de manera distinta en cuanto a su asignación de memoria. Lo que te está pasando es que tu programa debe tener algún mal uso de memoria en alguna parte, lo que en algunos ejecutables se manifiesta en un SEGFAULT y en otros no se manifiesta. Hasta ahora no se ha manifestado en el servidor, pero eso no implica que no podría ocurrir.

La recomendación es revisar la asignación, uso y liberación de memoria en tu programa. Una manera de detectar cuando ocurre un SEGFAULT es con la herramienta gdb. Para usar gdb primero debes recompilar todo tu código usando -g. Por ejemplo,

gdb -g -o ejecutable código.c

Luego ejecutar

gdb ejecutable

Y una vez que estás en gdb haces

run [parametros_si_hay]

El programa va a partir y si detecta un SIGSEGV (señal de segmentation fault), se va a detener y te dirá la linea.

Si bien por ahora no te está pasando en el servidor, que es donde se corrige, te recomiendo revisarlo porque podría ocurrir en alguna ejecución posterior.

Ánimo y cuéntanos cómo te va