Problema Tp2-Violación de segmento

94 views
Skip to first unread message

matias...@gmail.com

unread,
Sep 30, 2015, 2:12:07 PM9/30/15
to 7542 - Taller de Programación
Buenas, tengo un problema al ejecutar los casos de prueba del Tp2.

Cuando se ejecutan los clientes, en la consola me aparece:

"./run.sh: línea 60:  7722 Violación de segmento  (`core' generado) valgrind"

Fui a la línea 60 del archivo run.sh y es esta:

" eval $pre_client ./$client $server_host $puerto $client_args < client$n.in > client$n.out  "

Entiendo que es cuando ejecuta el cliente..

El netcat2.out (de la prueba 01) me lo muestra bien. Y el valgrind_client1.out me muestra un invalid read que es este:

Invalid read of size 8
==00:00:00:01.308 8030==    at 0x50E8A00: std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==00:00:00:01.308 8030==    by 0x402B79: Conversor::convertirAInt(std::string const&) (common_Conversor.cpp:15)
==00:00:00:01.308 8030==    by 0x402265: Conector::procesarInformacion() (client_Conector.cpp:58)
==00:00:00:01.308 8030==    by 0x401B89: main (client_main.cpp:29)
==00:00:00:01.308 8030==  Address 0x8 is not stack'd, malloc'd or (recently) free'd

La linea 15 del common_Conversor.cpp es esta:  "    ss << stringAConvertir;  "  es cuando le paso el string al stringstream pero no creo que sea este el error ya que cuando conecto un conector al server por mi cuenta (sin el runme) y le mando información, pasa por esa línea y no tira ningún error (obviamente lo ejecuto con valgrind).

Cuál podría ser el error???

Muchas gracias, saludos!

Martín Coll

unread,
Sep 30, 2015, 2:22:34 PM9/30/15
to 7542 - Taller de Programación
Yo triple-chequearía no estar pasando nada del stack que se destruya. Por ejemplo, si estás levantando un thread y pasando por parámetro algo que creaste en el stack, al salir de esa función va a destruirse ese objeto y la referencia dentro del thread se va a perder.

Saludos!
MC.

--
Has recibido este mensaje porque estás suscrito al grupo "7542 - Taller de Programación" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a tallerdeprograma...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a tallerdepr...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/tallerdeprogramacion.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

matias...@gmail.com

unread,
Sep 30, 2015, 6:37:55 PM9/30/15
to 7542 - Taller de Programación
Es que cuando ejecuto yo el server y el client(conector) pruebo de mandar información y me funciona bien. Pasa por la línea que Valgrind me tira Invalid read, pero no me tira ningún error.

El problema está cuando corro el runme.sh, ahí me tira el error. Por eso pienso que el error es con algo de los clientes externos.

Muchas gracias por la ayuda, saludos!

Martin Di Paola

unread,
Sep 30, 2015, 7:47:28 PM9/30/15
to tallerdepr...@googlegroups.com
bien, no creo que  el problema venga de los clientes externos. creo mas bien que el problema esta en el connector.
El invalid read esta en el codigo del cliente (conector) y dado que el conector no recibe ningun mensaje por parte del servidor , entonces el cliente es independiente del server (con la excepcion de que el server podria cerrar el socket y de esa manera interactuar con el conector)

Entonces, no importa cuantos conectores externos se conectaron con el server, el conector es independiente de todo eso. Me inclino a pensar que el problema esta en el conector.

Como se construye el objeto stringAConvertir? esta bien creado?
yo apuesto que va por ahi el asunto.

--

matias...@gmail.com

unread,
Oct 1, 2015, 1:20:16 AM10/1/15
to 7542 - Taller de Programación
Ya solucioné ese problema. Lo que pasaba es que estaba haciendo un getline de más, entonces leía una línea vacía y a eso le hacía un split. Luego agarraba un string que salía de ese split y lo convertía a int. Como la línea estaba vacía me tiraba el error.

Ahora tengo otro tema y es que entra en un loop infinito cuando ejecuto el runme. Probé el caso de tener una comunicación entre un conector y el server, cierro el server e intento mandar un mensaje de actualizar desde el conector y se manda bien. Recién la segunda vez que vuelvo a mandar un mensaje se termina el programa.
Talvez ésta es la razón por la cual no se termina de ejecutar el runme(porque no se termina el programa del conector al mandar el primer mensaje luego de cerrar el server).

Alguno estuvo en esta situación? Alguna idea para resolverlo?

Muchísimas gracias, saludos!


Martín Coll

unread,
Oct 1, 2015, 10:35:59 AM10/1/15
to 7542 - Taller de Programación

Fijate que del lado del cliente, después de enviar los datos correctamente ya se puede cerrar el socket y cerrar el programa.


matias...@gmail.com

unread,
Oct 1, 2015, 11:53:36 AM10/1/15
to 7542 - Taller de Programación
Sisi, una vez que el cliente cierra la entrada estándar, el programa se cierra correctamente.

El problema está cuando se cierra el server primero y luego desde el cliente se intenta mandar otro mensaje de actualización. El primer mensaje se manda bien y recién en el segundo se da cuenta que se cerró el socket del server.

Puede ser por como está hecho el método recibir en el server? Porque me estoy dando cuenta que cuando recibo, recibo hasta el \n y si hay algo después lo pierdo. Esto no debería pasar pero igual los mensajes llegan bien al server.

Gracias y saludos!

Martín Coll

unread,
Oct 1, 2015, 12:46:26 PM10/1/15
to 7542 - Taller de Programación

Segundo mensaje? Por qué habría de cerrar el servidor antes de recibir todo?

Recordá que el servidor tiene que mantener la conexión abierta hasta recibir fin\n, o bien hasta recibir un mensaje de tipo consultar, del cual atiende uno solo por cliente.

Saludos!
MC.


--

Matias Kamien

unread,
Oct 1, 2015, 12:49:05 PM10/1/15
to tallerdepr...@googlegroups.com

Sisi, eso lo se y funciona bien. Pero pensé que eso podría estar haciendo que no termine las pruebas con el runme.

Probablemente sea otra cosa lo que está haciendo que no se termine la prueba cuando ejecuto el runme.

Puede ser que tarden mucho en ejecutarse o todas las pruebas son "rápidas"??

Gracias nuevamente y saludos!

matias...@gmail.com

unread,
Oct 1, 2015, 1:03:50 PM10/1/15
to 7542 - Taller de Programación
La parte donde se traba es cuando se ejecuta el Netcat 2.

Aparece esto:

Netcat 2
+ eval nc localhost 3000
++ nc localhost 3000

y luego se traba ahí..

El netcat2.out lo muestra bien.. No se que puede estar haciendo que se trabe ahi..

Saludos y gracias!

Pablo Daniel Roca

unread,
Oct 4, 2015, 11:55:48 AM10/4/15
to tallerdepr...@googlegroups.com
Hola Matías,

no sé si aún seguís con este problema pero revisá que luego de atender al cliente externo (todo socket que se conecta y te envía un 'consultar...'), le envíes un 'fin\n' y cierres explícitamente la conexión con un shutdown y/o close.

De esa forma, el 'nc localhost 3000' se desbloquea y finaliza.
Probá ejecutando ese comando vos, a mano. Enviá un 'consultar' y fijate que el server tiene que responderte y finalizar la conexión para que te vuelva el prompt.

Saludos.
Pablo.


--

Matias Kamien

unread,
Oct 4, 2015, 11:57:39 AM10/4/15
to tallerdepr...@googlegroups.com

Hola Pablo, ya lo pude resolver. Era ese el problema..

Muchas gracias, saludos!

Reply all
Reply to author
Forward
0 new messages