Hola a todos!

Tengo un problema interesante... ojala alguien me pueda ayudar. El 
problema en cuestion es el siguiente:

Maquina de 64 bits. Programa compilado con gcc -m32. Librerias de 32 
bits. Todo funciona OK hasta que aparece el nunca bien ponderado 
"Segmentation fault". En gdb tengo la siguiente informacion (entre otras 
cosas...):

Program received signal SIGSEGV, Segmentation fault.
0x080495cd in generate_new_population () at subgalaxyfinder.c:763
763             GalA[numgal].BulgeMass         = 0.0;
(gdb)

Es decir, se me cae en una asignacion, asi de simple. Si intento hacer 
una asignacion directamente con memcpy(3), tambien cae. strace no arroja 
nada peculiar. Si borro una instruccion o agrego otra, eventualmente se 
cae en alguna. El programa consume (es variable) a lo mas ~600 MB en 
RAM. En la maquina tengo 8 GB de RAM + 2 de swap.

Respecto a los limites de recursos, si uso tcsh obtengo:
geryon16 23:52>limit
cputime      unlimited
filesize     unlimited
datasize     unlimited
stacksize    unlimited
coredumpsize 0 kbytes
memoryuse    unlimited
vmemoryuse   unlimited
descriptors  1024
memorylocked 32 kbytes
maxproc      71680
geryon16 23:52>

Si uso bash, obtengo:
bash-3.1$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
max nice                        (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 71680
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
max rt priority                 (-r) 0
stack size              (kbytes, -s) unlimited
cpu time               (seconds, -t) unlimited
max user processes              (-u) 71680
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Por lo que el problema tampoco va en el limite de recursos que poseo 
para correr mis procesos. He buscado en internet, pero me resulta un 
poco dificil encontrar alguna respuesta. He impreso las direcciones de 
memoria de las variables a las cuales les asigno valor y son validas. 
Dentro de gdb tambien puedo hacer la asignacion de valores con el 
comando interno de "set" de gdb.

Mi apuesta es que hay algun problema ahi de interpretacion de los 
programas de 32 bits dentro del sistema operativo de 64. El sistema: 
CentOS 5, 2.6.18-8.el5, x86_64.

Si alguien ha tenido algun problema similar, por favor cuentenme para 
saber por donde puede ir el mio y poder solucionarlo lo antes posible. 
He probado tambien corriendo el programa con linux32, y nada de nada, 
igual se cae, sin informacion de debugging para mas parto.

Cualquier respuesta es bienvenida!

Saludos!
-- 
Rodrigo Tobar Carrizo        http://csrg.inf.utfsm.cl/~rtobar
ACS-UTFSM Technical Leader   +56 9 78073439
Linux User #399271
From [EMAIL PROTECTED]  Tue Apr 15 04:36:55 2008
From: [EMAIL PROTECTED] ([EMAIL PROTECTED])
Date: Tue Apr 15 04:41:07 2008
Subject: Aplicacion 32bits en maquina de 64
In-Reply-To: <[EMAIL PROTECTED]>
References: <[EMAIL PROTECTED]>
Message-ID: <[EMAIL PROTECTED]>

Hola,

On Tue, 15 Apr 2008, Rodrigo Javier Tobar Carrizo wrote:

> Hola a todos!
>
> Tengo un problema interesante... ojala alguien me pueda ayudar. El problema 
> en cuestion es el siguiente:
>
> Maquina de 64 bits. Programa compilado con gcc -m32. Librerias de 32 bits. 
> Todo funciona OK hasta que aparece el nunca bien ponderado "Segmentation 
> fault". En gdb tengo la siguiente informacion (entre otras cosas...):
>

Alguna razon para compilar en 32 bits y no en 64? Si es un codigo 
numerico, como parece, los registros extra de los 64 bits probablemente 
ayudaran al rendimiento.

> Program received signal SIGSEGV, Segmentation fault.
> 0x080495cd in generate_new_population () at subgalaxyfinder.c:763
> 763             GalA[numgal].BulgeMass         = 0.0;
> (gdb)
>
> Es decir, se me cae en una asignacion, asi de simple. Si intento hacer una 
> asignacion directamente con memcpy(3), tambien cae. strace no arroja nada 
> peculiar. Si borro una instruccion o agrego otra, eventualmente se cae en 
> alguna. El programa consume (es variable) a lo mas ~600 MB en RAM. En la 
> maquina tengo 8 GB de RAM + 2 de swap.

Que te dice que es efectivamente un problema de los 32/64 bits? La 
asignacion que estas haciendo accede un arreglo y luego un miembro de una 
clase, esas cosas perfectamente pueden dar un segmentation fault 
"legitimo" (un indice fuera del tama~no del arreglo).

Intenta correr tu codigo dentro de valgrind (con la herramienta por 
defecto: memcheck), eso te dara mas informacion de donde puede estar el 
problema y si efectivamente tiene que ver con los 32 bits.

Saludos,

Xavier
From [EMAIL PROTECTED]  Tue Apr 15 08:36:24 2008
From: [EMAIL PROTECTED] (Alvaro Herrera)
Date: Tue Apr 15 08:36:35 2008
Subject: Aplicacion 32bits en maquina de 64
In-Reply-To: <[EMAIL PROTECTED]>
References: <[EMAIL PROTECTED]>
Message-ID: <[EMAIL PROTECTED]>

Rodrigo Javier Tobar Carrizo escribió:

> Program received signal SIGSEGV, Segmentation fault.
> 0x080495cd in generate_new_population () at subgalaxyfinder.c:763
> 763             GalA[numgal].BulgeMass         = 0.0;
> (gdb)
>
> Es decir, se me cae en una asignacion, asi de simple.

Esto no es "simplemente una asignacion" -- estas dereferenciando el
puntero GalA.  Quizas GalA es nulo, o bien GalA[numgal] apunta mas alla
del fin de la memoria.

Fijate cuanto valen GalA y numgal en ese punto.

-- 
Alvaro Herrera       Valdivia, Chile   ICBM: S 39º 48' 55.3", W 73º 15' 24.7"
"El sentido de las cosas no viene de las cosas, sino de
las inteligencias que las aplican a sus problemas diarios
en busca del progreso." (Ernesto Hernández-Novich)
From [EMAIL PROTECTED]  Tue Apr 15 12:50:50 2008
From: [EMAIL PROTECTED] (Rodrigo Javier Tobar Carrizo)
Date: Tue Apr 15 12:51:00 2008
Subject: Aplicacion 32bits en maquina de 64
In-Reply-To: <[EMAIL PROTECTED]>
References: <[EMAIL PROTECTED]>
        <[EMAIL PROTECTED]>
Message-ID: <[EMAIL PROTECTED]>

Alvaro Herrera escribió:
> Rodrigo Javier Tobar Carrizo escribió:
> 
>> Program received signal SIGSEGV, Segmentation fault.
>> 0x080495cd in generate_new_population () at subgalaxyfinder.c:763
>> 763             GalA[numgal].BulgeMass         = 0.0;
>> (gdb)
>>
>> Es decir, se me cae en una asignacion, asi de simple.
> 
> Esto no es "simplemente una asignacion" -- estas dereferenciando el
> puntero GalA.  Quizas GalA es nulo, o bien GalA[numgal] apunta mas alla
> del fin de la memoria.
> 
> Fijate cuanto valen GalA y numgal en ese punto.

Si, por supuesto que lo hice... por eso hice todo el pasteleo de 
revisar. GalA es un puntero valido, y numgal esta dentro del scope del 
arreglo. De hecho, si le hago un printf funciona, o, como mencione 
tambien, si dentro de gdb hago un "set GalA[numgal] = 0", tambien 
funciona. Por eso me resulta raro.

Saludos!
-- 
Rodrigo Tobar Carrizo   http://csrg.inf.utfsm.cl/~rtobar
CSAT Project Leader     +56 9 78073439
Linux User #399271
From [EMAIL PROTECTED]  Tue Apr 15 12:56:03 2008
From: [EMAIL PROTECTED] (Rodrigo Javier Tobar Carrizo)
Date: Tue Apr 15 12:56:09 2008
Subject: Aplicacion 32bits en maquina de 64
In-Reply-To: <[EMAIL PROTECTED]>
References: <[EMAIL PROTECTED]>
        <[EMAIL PROTECTED]>
Message-ID: <[EMAIL PROTECTED]>

[EMAIL PROTECTED] escribió:
> Hola,
> 
> On Tue, 15 Apr 2008, Rodrigo Javier Tobar Carrizo wrote:
> 
>> Hola a todos!
>>
>> Tengo un problema interesante... ojala alguien me pueda ayudar. El 
>> problema en cuestion es el siguiente:
>>
>> Maquina de 64 bits. Programa compilado con gcc -m32. Librerias de 32 
>> bits. Todo funciona OK hasta que aparece el nunca bien ponderado 
>> "Segmentation fault". En gdb tengo la siguiente informacion (entre 
>> otras cosas...):
>>
> 
> Alguna razon para compilar en 32 bits y no en 64? Si es un codigo 
> numerico, como parece, los registros extra de los 64 bits probablemente 
> ayudaran al rendimiento.

Si, es probable... pero el programa es grande, hay lectura y escritura 
de archivos, y muuuuuchas declaraciones. Entre tanta cosa, el cambio de 
que un long pese 4 bytes u 8 bytes afecta. Por eso quiero tratar de 
mantener el programa con 32 bits.

>> Program received signal SIGSEGV, Segmentation fault.
>> 0x080495cd in generate_new_population () at subgalaxyfinder.c:763
>> 763             GalA[numgal].BulgeMass         = 0.0;
>> (gdb)
>>
>> Es decir, se me cae en una asignacion, asi de simple. Si intento hacer 
>> una asignacion directamente con memcpy(3), tambien cae. strace no 
>> arroja nada peculiar. Si borro una instruccion o agrego otra, 
>> eventualmente se cae en alguna. El programa consume (es variable) a lo 
>> mas ~600 MB en RAM. En la maquina tengo 8 GB de RAM + 2 de swap.
> 
> Que te dice que es efectivamente un problema de los 32/64 bits? La 
> asignacion que estas haciendo accede un arreglo y luego un miembro de 
> una clase, esas cosas perfectamente pueden dar un segmentation fault 
> "legitimo" (un indice fuera del tama~no del arreglo).

Alvaro me pregunto lo mismo. Se me olvido resaltarlo en el primer 
mensaje, pero ambos (GalA como puntero, y numgal como indice) son 
valores legitimos.

> Intenta correr tu codigo dentro de valgrind (con la herramienta por 
> defecto: memcheck), eso te dara mas informacion de donde puede estar el 
> problema y si efectivamente tiene que ver con los 32 bits.

No se me habia ocurrido, lo voy a hacer a ver si es que sale algo 
interesante.

> Saludos,
> 
> Xavier

Saludos!
-- 
Rodrigo Tobar Carrizo   http://csrg.inf.utfsm.cl/~rtobar
CSAT Project Leader     +56 9 78073439
Linux User #399271
From [EMAIL PROTECTED]  Tue Apr 15 13:00:19 2008
From: [EMAIL PROTECTED] (Miguel Oyarzo O.)
Date: Tue Apr 15 13:00:34 2008
Subject: Aplicacion 32bits en maquina de 64
In-Reply-To: <[EMAIL PROTECTED]>
References: <[EMAIL PROTECTED]>
Message-ID: <[EMAIL PROTECTED]>

At 00:02 15/04/2008, Rodrigo Javier Tobar Carrizo wrote:
>Hola a todos!
>
>Tengo un problema interesante... ojala alguien me pueda ayudar. El 
>problema en cuestion es el siguiente:
>
>Maquina de 64 bits. Programa compilado con gcc -m32. Librerias de 32 bits. 
>Todo funciona OK hasta que aparece el nunca bien ponderado "Segmentation 
>fault". En gdb tengo la siguiente informacion (entre otras cosas...):
>
>Program received signal SIGSEGV, Segmentation fault.
>0x080495cd in generate_new_population () at subgalaxyfinder.c:763
>763             GalA[numgal].BulgeMass         = 0.0;
>(gdb)
>
>(*  ... *)
>Si alguien ha tenido algun problema similar, por favor cuentenme para 
>saber por donde puede ir el mio y poder solucionarlo lo antes posible. He 
>probado tambien corriendo el programa con linux32, y nada de nada, igual 
>se cae, sin informacion de debugging para mas parto.
>
>Cualquier respuesta es bienvenida!
>
>Saludos!
>--
>Rodrigo Tobar Carrizo        http://csrg.inf.utfsm.cl/~rtobar
>ACS-UTFSM Technical Leader   +56 9 78073439


Una vez tuve un problema mas o menos parecido y el Segmentation fault  aparecia
en los momentos menos apropiados y sin ningun patron aparente.

Investigue todo lo que se me ocurrio (incluyendo cambios en la BIOS), pero
al final mire los pines de la RAM y uno de los modulos  tenia el penultimo
quemado (era una Blitz, Value plus de 512MB). Al cambiarlo nunca mas fallo 
el S.O.

No pierdes nada con probar lo mismo que estas haciendo pero con menos modulos
de RAM para descartar.

Saludos,

Miguel Oyarzo
Austro Internet S.A.
Punta Arenas





Responder a