Red de conocimientos turísticos - Conocimientos sobre calendario chino - ¿Por qué el archivo central gdb no puede localizar el problema? Esto suele deberse a un acceso fuera de límites a una matriz, un puntero nulo o una lectura o escritura comodín. Si el programa es más pequeño, es más fácil solucionar el problema examinando cuidadosamente el código fuente. Pero para un programa con una gran cantidad de código, que contiene N múltiples llamadas a funciones y N múltiples accesos a punteros de matriz, no es fácil localizar el problema en este momento (en este momento, los expertos aún pueden obtener puntos extra imprimiendo printf en la ubicación correspondiente) Método cruzado para localizar rápidamente:P). Si eres vago, simplemente usa GDB. El artefacto es el archivo Core Dump. De vez en cuando, puedo escuchar a otros programadores quejarse: "¡Maldita sea, Core volvió a salir!". Los archivos Core Dump son simples. En pocas palabras, un volcado de núcleo es una operación realizada por el sistema operativo. Cuando un proceso finaliza inesperadamente (falla) por algún motivo, el sistema operativo volcará la información de la memoria del proceso en el disco 1. El archivo resultante es el archivo principal, generalmente llamado core.xxx. Cómo generar un volcado de núcleo Un volcado ocurre cuando un proceso recibe una señal, hay más de 60 señales en Linux, puede usar el comando kill -l para enumerarlas todas. sagi@sagi-laptop:~$ kill -l 1) SIGHUP 2)sigint 3) sigquit 4) sigill 5) sigtrap 6)sigabrt 7) sigbus 8) sigfpe 9) sigkill 10) sigusr1 11) sigsegv 12) sigusr2 13) sigpipe 14) sigalrm 15) sigterm 16) sigstkflt 17) sigchld 18)sigcont 19) sigstop 20) sigtstp 21) sigttin 22) sigttou 23) sigurg 24) sigxcpu 25) sigxfsz 26) sigvtalrm 27 ) sigprof 28) 29) sigio30) SIGPWR 31) Sigsys 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+742) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX Para una señal específica, el programa de aplicación puede escribir el programa de procesamiento de señal correspondiente y el programa de aplicación puede escribir la función de procesamiento de señal correspondiente.

¿Por qué el archivo central gdb no puede localizar el problema? Esto suele deberse a un acceso fuera de límites a una matriz, un puntero nulo o una lectura o escritura comodín. Si el programa es más pequeño, es más fácil solucionar el problema examinando cuidadosamente el código fuente. Pero para un programa con una gran cantidad de código, que contiene N múltiples llamadas a funciones y N múltiples accesos a punteros de matriz, no es fácil localizar el problema en este momento (en este momento, los expertos aún pueden obtener puntos extra imprimiendo printf en la ubicación correspondiente) Método cruzado para localizar rápidamente:P). Si eres vago, simplemente usa GDB. El artefacto es el archivo Core Dump. De vez en cuando, puedo escuchar a otros programadores quejarse: "¡Maldita sea, Core volvió a salir!". Los archivos Core Dump son simples. En pocas palabras, un volcado de núcleo es una operación realizada por el sistema operativo. Cuando un proceso finaliza inesperadamente (falla) por algún motivo, el sistema operativo volcará la información de la memoria del proceso en el disco 1. El archivo resultante es el archivo principal, generalmente llamado core.xxx. Cómo generar un volcado de núcleo Un volcado ocurre cuando un proceso recibe una señal, hay más de 60 señales en Linux, puede usar el comando kill -l para enumerarlas todas. sagi@sagi-laptop:~$ kill -l 1) SIGHUP 2)sigint 3) sigquit 4) sigill 5) sigtrap 6)sigabrt 7) sigbus 8) sigfpe 9) sigkill 10) sigusr1 11) sigsegv 12) sigusr2 13) sigpipe 14) sigalrm 15) sigterm 16) sigstkflt 17) sigchld 18)sigcont 19) sigstop 20) sigtstp 21) sigttin 22) sigttou 23) sigurg 24) sigxcpu 25) sigxfsz 26) sigvtalrm 27 ) sigprof 28) 29) sigio30) SIGPWR 31) Sigsys 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+742) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX Para una señal específica, el programa de aplicación puede escribir el programa de procesamiento de señal correspondiente y el programa de aplicación puede escribir la función de procesamiento de señal correspondiente.

Si no se especifica, se procesará de forma predeterminada. El método de procesamiento predeterminado es coredump. La señal es la siguiente: 3) SIGQUIT 4) SIGILL 6) SIGABRT 8) SIGFPE 11) SIGSEGV 7) SIGBUS 31) SIGSYS 5) SIGTRAP 24) SIGXCPU 25) SIGXFSZ 29) SIGIOT Vemos SIGSEGV en señales mixtas, lo que generalmente ocurre cuando una matriz se sale de los límites o cuando se accede a un puntero nulo. Además, aunque el valor predeterminado es este, también puede escribir su propia función de procesamiento de señales para cambiar el comportamiento predeterminado. Para obtener más información sobre las señales, consulte el enlace de referencia 33. El contenido anterior es solo una condición necesaria para generar coredump, pero no una condición suficiente. La generación de archivos principales también depende del shell en el que se ejecuta el programa. Puede usar el comando ulimit -a para ver el resultado. El resultado es aproximadamente el siguiente: sagi@sagi-laptop:~$ ulimit -a tamaño del archivo principal (. bloques, -c) 0 tamaño de segmento de datos (kbytes, -d) programación de prioridad ilimitada (-e) 20 tamaño de archivo (bloques, -f) señal pendiente ilimitada (-i) 16382 memoria máxima bloqueada (kbytes, -l) 64 máx tamaño de memoria (kbytes, -m) archivos abiertos ilimitados ( -n) 1024 tamaño de tubería (512 bytes. -p) 8 mensajes POSIX, -p) 8 cola de mensajes POSIX (bytes, -q) 819200 prioridad en tiempo real (-r ) 0 tamaño de pila (kilobytes, -s) 8192 Tiempo de CPU (segundos, -t) Procesos de usuario máximos ilimitados (-u) Memoria virtual ilimitada (kilobytes, -v) Bloqueos de archivos ilimitados (-x) Ilimitado ¿Ves esa primera línea? Tamaño del archivo principal, este valor se utiliza para limitar el tamaño del archivo principal generado. Si excede este valor, no se guardará. Mi resultado aquí es 0, lo que significa que el archivo principal no se guardará, e incluso si se genera, no se guardará ==. Para cambiar esta configuración, use ulimit -c unlimited. Bien, ahora tenemos todo lo que necesitamos, excepto el programa para generar el kernel, que es demasiado simple para los programadores de C. #include ; #include ; int crash() { char *xxx = "crash!!!"; xxx[1] = 'D'; 2; } int foo() { return crash(); } int main() { return foo() } Primeros pasos con la depuración Una cosa a la que debes prestar atención al compilar el programa anterior es que debes traer -g para que el ejecutable generado Habrá suficiente información de depuración en el archivo. Después de compilar y ejecutar el programa, debería ver el esperado "Error de segmento (núcleo volcado)" o "Error de segmento (núcleo volcado)". Busque archivos core o core.xxx en el directorio actual. Usaremos el clásico depurador de Linux GDB para cargar un programa con un archivo principal: gdb exefile core. Cabe señalar que el archivo principal debe generarse mediante un archivo exe; de ​​lo contrario, la tabla de símbolos no se alineará. El resultado después de la carga es el siguiente: sagi@sagi-laptop:~$ gdb coredump core El núcleo fue generado por ./coredump'. El programa finaliza con la señal 11, fallo de segmentación.
turísticos All Rights Reserved.