Hola, me ha aparecido un problema pero no se donde puede estar.<br><br>La traza que me sale usando gdb es:<br><br><span style="font-family:courier new,monospace">(gdb) run<br>Starting program: /home/eloy/tfm/trunk/eloyBasicComponent/eloyBasicComponent --Ice.Config=eloyBasicComponent.cfg<br>

[Depuración de hilo usando libthread_db enabled]<br>[Nuevo Thread 0xb7fc3b70 (LWP 18015)]<br>[Nuevo Thread 0xb77c2b70 (LWP 18016)]<br>[Nuevo Thread 0xb6fc1b70 (LWP 18017)]<br>[Nuevo Thread 0xb67c0b70 (LWP 18018)]<br>[Nuevo Thread 0xb5fbfb70 (LWP 18019)]<br>

<br>Program received signal SIGSEGV, Segmentation fault.<br>[Cambiando a Thread 0xb5fbfb70 (LWP 18019)]<br>0x00dcf1e8 in ?? () from /usr/lib/libgdk-x11-2.0.so.0<br>(gdb) </span><b><span style="font-family:courier new,monospace"><br>
</span></b><br>Estoy con basic_component toqueteando, al pasar la imagen a la API tanto en el hilo del gui como en el de control, cojo y suelto el mutex de la api.<br>
<br>Usando Valgrind me aparece:<br><br><span style="font-family:courier new,monospace">eloy@ubuntoy:~/tfm/trunk/eloyBasicComponent$ valgrind ./eloyBasicComponent --Ice.Config=eloyBasicComponent.cfg <br>==19043== Memcheck, a memory error detector<br>
==19043== Copyright (C) 2002-2009, and GNU GPL&#39;d, by Julian Seward et al.<br>==19043== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info<br>==19043== Command: ./eloyBasicComponent --Ice.Config=eloyBasicComponent.cfg<br>
==19043== <br>==19043== Thread 6:<br>==19043== Invalid read of size 1<br>==19043==    at 0x4CE91E8: ??? (in /usr/lib/libgdk-x11-2.0.so.0.2000.1)<br>==19043==    by 0x4CECC03: ??? (in /usr/lib/libgdk-x11-2.0.so.0.2000.1)<br>
==19043==    by 0x4CED01D: gdk_draw_rgb_image_dithalign (in /usr/lib/libgdk-x11-2.0.so.0.2000.1)<br>==19043==    by 0x4CD761D: ??? (in /usr/lib/libgdk-x11-2.0.so.0.2000.1)<br>==19043==    by 0x4D0C756: ??? (in /usr/lib/libgdk-x11-2.0.so.0.2000.1)<br>
==19043==    by 0x4CFA978: ??? (in /usr/lib/libgdk-x11-2.0.so.0.2000.1)<br>==19043==    by 0x4CD5B1E: gdk_draw_pixbuf (in /usr/lib/libgdk-x11-2.0.so.0.2000.1)<br>==19043==    by 0x48D2BD4: ??? (in /usr/lib/libgtk-x11-2.0.so.0.2000.1)<br>
==19043==    by 0x44DF440: Gtk::Widget_Class::expose_event_callback(_GtkWidget*, _GdkEventExpose*) (in /usr/lib/libgtkmm-2.4.so.1.1.0)<br>==19043==    by 0x48F7433: ??? (in /usr/lib/libgtk-x11-2.0.so.0.2000.1)<br>==19043==    by 0x4FC68B8: ??? (in /usr/lib/libgobject-2.0.so.0.2400.1)<br>
==19043==    by 0x4FC8177: g_closure_invoke (in /usr/lib/libgobject-2.0.so.0.2400.1)<br>==19043==  Address 0xb395a12 is 10 bytes inside a block of size 259,224 free&#39;d<br>==19043==    at 0x4025B3A: free (vg_replace_malloc.c:366)<br>
==19043==    by 0x5180AA1: cv::fastFree(void*) (in /usr/local/lib/libopencv_core.so.2.3.1)<br>==19043==    by 0x804FEA7: cv::Mat::operator=(cv::Mat const&amp;) (in /home/eloy/tfm/trunk/eloyBasicComponent/eloyBasicComponent)<br>
==19043==    by 0x804ED06: eloyBasicComponent::Control::setImg2Gui(eloyBasicComponent::Api*) (in /home/eloy/tfm/trunk/eloyBasicComponent/eloyBasicComponent)<br>==19043==    by 0x804EB6B: eloyBasicComponent::Control::UpdateSensorsICE(eloyBasicComponent::Api*) (in /home/eloy/tfm/trunk/eloyBasicComponent/eloyBasicComponent)</span><br>
<br>De la traza supongo que es en la funcion setImg2Gui:<br><span style="font-family:courier new,monospace"><br>void Control::setImg2Gui(Api *api){<br>        <br>        pthread_mutex_lock(&amp;api-&gt;controlGui);    <br>
        //Copio imagen de entrada al gui<br>        api-&gt;cvImageDataIn = matOriginal.clone();;<br>        <br>        //Hago copia de la matriz y la paso al gui.<br>        api-&gt;cvImageDataOut = mat2Edit.clone();<br>
        <br>        pthread_mutex_unlock(&amp;api-&gt;controlGui);<br>    }</span><br><br>api-&gt;cvImageDataIn y api-&gt;cvImageDataOut son cv::Mat las cuales uso para mostrar por el gui las imagenes.<br><br><br>A alguno os ha pasado algo parecido?<br>
<br><br>Os pongo el codigo del hilo de control<br><br><span style="font-family:courier new,monospace">namespace eloyBasicComponent {<br><br>    cv::Mat matOriginal;<br><br>    //Image to do things<br>    cv::Mat mat2Edit;<br>
<br>    //Image input<br>    cv::Mat imgIn;<br><br>    //Image output<br>    cv::Mat imgOut;<br><br><br><br>    Control::~Control() {}<br><br>    void Control::UpdateSensorsICE(Api *api) {<br>        //Obtengo la imagen de la camara<br>
        jderobot::ImageDataPtr imageFromIce = this-&gt;cprx1-&gt;getImageData();<br>        //Matriz original de Ice<br>        matOriginal = cv::Mat(imageFromIce-&gt;description-&gt;height, <br>           imageFromIce-&gt;description-&gt;width,<br>
           CV_8UC3,<br>           &amp;(imageFromIce-&gt;pixelData[0]));                <br><br>        //Matriz de openCv con la imagen de Ice para hacerle tratamientos<br>        mat2Edit = matOriginal.clone();<br>        <br>
        //grayScale();<br>        setImg2Gui(api);<br>    }<br><br>    void Control::grayScale(){<br>        //Matriz en grises<br>        cv::Mat greyMat;<br><br>        //Convierto a grises la imagen de la camara<br>        cvtColor(mat2Edit, greyMat, CV_RGB2GRAY);<br>
<br>        //Devuelve la modificacion<br>        imgOut = greyMat;<br>    }<br><br>    void Control::setImg2Gui(Api *api){<br>        <br>        pthread_mutex_lock(&amp;api-&gt;controlGui);    <br>        //Copio imagen de entrada al gui<br>
        api-&gt;cvImageDataIn = matOriginal.clone();;<br>        <br>        //Hago copia de la matriz y la paso al gui.<br>        imgOut = mat2Edit.clone();<br>        api-&gt;cvImageDataOut = mat2Edit.clone();<br>        <br>
        pthread_mutex_unlock(&amp;api-&gt;controlGui);<br>    }<br>}<br><br></span>Un saludo.<br>