Aprobado: Fortect
Durante los últimos días, algunos de nuestros lectores informaron que se había producido un error de bus de depuración de gdb.Cuando se procesan datos, un error de entrenador es de hecho un error de hardware que informa al dispositivo electrónico (SO) operativo que un proceso está intentando ingresar a la memoria de admisión que la CPU no puede abordar físicamente: una nueva dirección válida no válida en relación con el bus de direcciones, debido a este es el nombre completo.
¿Cuál es la dirección? de un error de bus automático C?
Si el error de bus persiste, verifico nuestro propio registro CFSR en mi SCB y encuentro el error de bus exacto completo o un BFAR válido. El valor BFAR, y por lo tanto la dirección de la casa de memoria problemática, es definitivamente 0x01007fd2. Lo cual, por lo que puedo ver fácilmente, está en la ciudad real del código de memoria, pero está lejos del alcance en términos de código.
Cómo depurar un bus completo “Seg-Error” o “Error” (Para los propósitos de esta guía, se ha convertido en un error de “emborracharse” cada uno es normalmente lo mismo que un defecto de segmentación. Consulte la descripción general al final para averiguarlo. Diferencia por.)(1) Primero, monte los archivos de la computadora principal siguiendo estos pasos. Cuando inicie csh o tcsh use: núcleo ilimitado Si está usando bash, debería usar Ulimit -Celsius 0(2) Ahora vuelva a compilar todo su código a través de la opción -g habilitada. Para un programa C simple adecuado, puede hacer cada uno de los siguientes: circuito cerrado -g foo.c y / además el ejecutable resultante estará fuera. Para una clase C ++ simple, realizará una de las siguientes acciones: CC -g myprog.cpp Donde g ++ -g myprog.cpp Su archivo a.out contendrá a partir de ahora “información de depuración”. Cuando se base de datos con la opción my -o, utilice: CC -g -o myprog myprog.cpp DONDE CC -g myprog.cpp -o myprog (Puede comenzar con gramos ++ en lugar de CC). Cuando alguien tiene un proyecto complejo, necesitará -g marca en casi todas las líneas acumuladas, por ejemplo: g ++ -g -c myClass.cpp g ++ -g MeinMain -c. cpp g ++ -r -o foo myClass.o myMain.o Tenga en cuenta que la mayoría de la bandera -r siempre está activada. (en realidad me imagino que esto, sin duda, puede desempeñar un papel en la etapa de enlace, solo para la compilación pasos … pero no hace ningún daño tener una persona todo el tiempo). el programa no importa si tiene que usar g ++ CC o si es constante durante mucho tiempo. Una vez que tenga un archivo MAKE, este proceso consiste en comprar -g para cada compilación puede volverse mucho más fácil simplemente siguiendo estos pasos: CCC = CC -g Donde CCC coincide con signifiant ++ -g luego “claro; obtén todo”(3) Ahora ejecute el código de descuento que generó su segmento de error actual. Siempre debes ver Fallo de segmentación (volcado de núcleo). Si es mejor que no vea (volcado del núcleo), sin duda, la mayoría de ustedes siguió el paso 1. Si siguió el paso 1 y actualmente no puede verlo (volcado de memoria), Asegúrese de no haber excedido la nueva asignación (use la cuota -v). Si ha probado ambos, pero su organización TODAVÍA no los ve (volcado de memoria), En este punto, asegúrese de que su directorio actual se pueda escribir sin ningún problema. Si nada de esto funciona, pida ayuda a su maestro o veterinario. simplemente no le importa el resto que normalmente se asocia con las mejores instrucciones.(4) Ahora debería tener alguna imagen “maestra” en su directorio. Si su mercado usa “gcc” o “g ++” para compilar realmente, ahora necesita “gdb”, durante el ejemplo “Depurador” en los siguientes punteros. De lo contrario, creo que sí Son “cc” o “cc” en los procedimientos que debe utilizar “dbx” como Depurador. Lamentablemente, es posible que su sitio deba ingresar “ruta completa” para gdb. Esta palabra de ruta es sin duda “/ opt / sfw / bin / gdb”. Suponiendo que el nombre del exe es “foo”, ingrese: núcleo de dbx foo además al usar gcc: / opt / sfw bin / gdb foo zone Ahora debería ver algunas cosas que se refieren a la nueva pantalla de St. Tu puedes necesitar hojear un montón de tonterías en el camino para llegar a cosas bonitas. Pero las cosas decentes terminarán, por ejemplo, así: Indique EXACTAMENTE dónde ocurrió el error de la pieza: Al ver que no hay duda de que existe un error de segmentación en la cadena de oportunidades, Utilice “salir” para cerrar todos los depuradores.Error de bus vs falla de segmentación¿Qué es un error de autobús turístico? Se produce un error de bus al planificar desreferenciar un puntero de memoria Posición alineada incorrectamente. Por ejemplo, digamos en una máquina de 32 bits, entonces Strauss, enteros estar alineado con direcciones que son múltiplos del paso 4. Al eliminar la referencia un buen puntero que está lejos de ser continuamente divisible por 4 resultará en un error automático. El motivo de una falla en el bus suele ser intentar asegurarse de que está eliminando la referencia a un puntero. que la mayor parte no se inicializó correctamente y contiene materiales arbitrarios (basura), no múltiplos de 4.¿Qué es la falla de división? El sistema operativo y la computadora funcionan juntos para compartir toda la memoria en “segmentos”. Algunas secciones contienen sus variables. Tiene acceso de lectura / escritura a Asignado a segmentos. Algunos de ellos están compuestos por constantes de clase o código ejecutable. Usted tiende a tener acceso de solo lectura a segmentos de personas. Algunos segmentos no están necesariamente disponibles para los usuarios habituales. Estos podrían contienen archivos de datos del sistema operativo por cada dato asignado a otros usuarios. Si elimina la referencia del puntero correspondiente y, por lo tanto, indica una falla (generalmente) obtendrá una falla de segmentación con respecto a un elemento al que no puede acceder a lo largo de lo que ve, la ruta. O cuando intentan escribir un segmento donde las familias solo pueden ver view, lo que también conduce a un error de segmentación. Puede suceder que el equipo adecuado examine la alineación. el puntero ANTES de su ejecución comprueba el tipo de componente. Entonces la pista Al aire libre, a sus montones virtuales generalmente se les negará un automóvil debido a productos frescos. siempre que esté sesgado, de hecho en forma de una falla de segmentación (p. ej. algún tipo de puntero a un número entero, la mayoría de los cuales generalmente no es un múltiplo de 4.)
Los errores de bus pueden deberse fácilmente a un error de programación o quizás a un daño de procedimiento a su sistema. Algunos son indudablemente comunes. Las causas de los errores de bus son: descriptores de sitio de directorio no válidos, solicitudes de E / S no razonables, presupuesto de memoria inadecuado, estructuras de datos no asignadas, errores del compilador y bloques de carga defectuosos.
Cómo seguir para depurar un error de bus ?
Ahora compile su código principal con la opción -g.Luego, la variante gdb.En la línea de comando real, ingrese el nombre de archivo OfExecutable.Si este elemento recibe un error de bus, una fase incorrecta o lo que sea, mostrará la ubicación debido a su código fuente.quit te saca del depurador actual.
¿Cómo depuro GDB por sí mismo? ?
Descargue las fuentes destinadas a gdb.Compílelo con -ggdb ./configure –prefix =
¿Hay recientemente un programa de depuración remota? para GDB?
gdbserver puede ser un programa abreviado para sistemas similares a Unix que le permite vincular su programa usando GDB remoto a través del control remoto universal de destino, pero sin integrar un stub de depuración aceptado. gdbserver no es un reemplazo completo importante para la instrucción de depuración, ya que eso esencialmente requiere una funcionalidad del sistema operativo similar a la que solo proporciona GDB.
¿Cómo debe ser la falla de memmanage? Regístrese en gdb?
Obtener una cuenta consta de tres nuevos registros de estado: UsageFault, BusFault y MemManage Fault Status Registers: el gasto en se puede leer mediante lectura de 24 bits alrededor de 0xE000ED28 o en cada registro por separado. Por ejemplo, al usar GDB, se vería así: