he establecido puntos de interrupción en la salida y _exit y mi programa (aplicación multiproceso, que se ejecuta en Linux 2.6.16.46-0.12 SLES10), es de alguna manera todavía salir de una manera que no puedo localizarconfigurando un punto de interrupción de salida de gdb no funciona?
(gdb) c ... [New Thread 47513671297344 (LWP 15279)] [New Thread 47513667103040 (LWP 15280)] [New Thread 47513662908736 (LWP 15281)] Program exited with code 0177. (gdb)
la salida las funciones residen en libc, por lo que no hay problemas de biblioteca compartida de carga diferida. ¿Alguien sabe de algún otro disparador misterioso para la salida que no se puede atrapar?
EDITAR: el problema ahora es solo académico. Probé la depuración de búsqueda binaria, anulando un subconjunto de mis cambios (el problema desapareció). Después de aplicarlos de nuevo en secuencia, ya no puedo reproducir el problema, incluso con las cosas restauradas al estado original.
EDIT2: Encontré una razón para este tipo de error recientemente, que puede haber sido la fuente original de este problema. Por razones históricas, nuestro producto usa el indicador linker maligno -Bsymbolic. Uno de los efectos secundarios de esto es que cuando un símbolo no está definido pero se llama, el enlazador de tiempo de ejecución de GLIBC bombardeará exactamente de esta manera, y lo verá en el depurador como un proceso salido con 0177. Cuando el enlazador de tiempo de ejecución aborta de esta manera, Supongo que hace que syscall salga directamente (en lugar de utilizar la salida de la biblioteca C runtime() o _exit()). Eso sería coherente con el hecho de que no pude detectar esto con los puntos de interrupción de salida en el depurador.
Intentaré construir gdb 7 y veré lo que muestra. el * y da la misma dirección de la instrucción:
(Parece que una llamada al sistema bastante estándar). Creo que al menos he aislado el cambio de código que lleva a esta salida misteriosa, pero aún no entiendo los detalles. –Sería mejor utilizar 'catch syscall exit' y' catch syscall exit_group' en lugar de valores numéricos. En mi sistema, por ejemplo, 'exit' es' [1] 'not' [60] '. – Ruslan
Además, puede configurar ambas cosas a la vez con 'catch syscall exit exit_group'. De hecho, edítelo ahora ... –