Pregunta

Tengo una aplicación que consta de diferentes módulos escritos en C ++.
Uno de los módulos está destinado para el manejo de tareas distribuidas en SunGrid motor. Utiliza la API de DRMAA Presentación y monitorización de red jobs.If el cliente no es compatible con la red, el equipo local se deben utilizar
El objeto compartido de la libdrmaa.so API está vinculado en tiempo de compilación y se carga en tiempo de ejecución.
Si el cliente que utiliza mi aplicación tiene esta ".so" todo está bien, pero en el caso de que el cliente no tiene que, se cierra la aplicación en su defecto para cargar las bibliotecas compartidas.
Para evitar esto, he sustituido las llamadas a la API con punteros de función obtenidos utilizando dlsym () y dlopen (). Ahora puedo utilizar la máquina local en lugar de la rejilla si la llamada a dlopen no lo hace tiene éxito y se logre mi objetivo.
El problema ahora es que ahora la aplicación se ejecuta correctamente para pequeños casos de prueba, pero con mayores casos de prueba que arroja violación de segmento, mientras que el mismo código utilizando la carga dinámica funciona correctamente.

Me estoy perdiendo algo durante el uso de dlsym () y dlopen ()?
¿Hay alguna otra manera de lograr el mismo objetivo?

Cualquier ayuda sería apreciada.

Gracias,

¿Fue útil?

Solución

Es muy poco probable que sea un problema directo con el código de carga a través de dlsym() -. En el sentido de que la carga dinámica hace que sea SEG-culpa

Lo que puede estar haciendo es exponer un problema aparte, probablemente moviendo cosas alrededor. Esto probablemente significa un puntero perdida (no inicializado) que señala en alguna parte 'legítima' en el caso de vínculos estáticos sino en otra parte en el caso de vínculos dinámicos - y en otro lugar desencadena la seg-fault. De hecho, esto es un beneficio para usted en el largo plazo -. Muestra que hay un problema que de otro modo podrían no ser detectados por un largo tiempo

I esto como particularmente probable, ya que menciona que ocurre con las pruebas más grandes y no con los pequeños respecto.

Otros consejos

Como dice Jonathan Leffler, el problema es muy probable existe en el caso de que usted está utilizando directamente la API; sólo que no ha causado una caída aún.

Su primer paso cuando se obtiene un SIGSEGV debe analizando el volcado de memoria resultante (o simplemente ejecutar la aplicación directamente bajo el depurador), y mirando donde se estrelló. Apuesto $ 0,02 que está estrellarse en algún lugar dentro malloc o free, en cuyo caso el problema es sencillo daños en la pila de edad, y hay muchas herramientas montón ortográfico disponibles para ayudar a que se captura. Solaris proporciona watchmalloc , que es un buen comienzo.

Si usted está lanzando una excepción a través de una función extern "C" a continuación, la aplicación tiene que dejar de fumar. Esto es debido a que el C ABI no tiene las instalaciones para propagar excepciones.

Para contrarrestar esto cuando se utiliza DLL (o bibliotecas compartidas) que normalmente tienen una función que devuelve un objeto C en C ++. Entonces la interacción restante es con ese objeto C ++ que se ha devuelto desde el DLL.

Este patrón sugiere (y subrayo sugiere) una fábrica como objeto, por lo tanto el archivo DLL debe tener una sola función extern "C" que devuelve un void * que se puede reinterpret_cast <> de nuevo en un objeto de C ++ fábrica.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top