A veces, cuando eres muy bueno con una herramienta, eres reacio a aprender otras que a veces podrían ser más poderosas. Me gusta la simplicidad de los mensajes estándar. Especialmente si usa contenedores que los habilitan / deshabilitan en función de una variable de tiempo de ejecución o un indicador de tiempo de compilación. Esta técnica prevalece en varias herramientas y demonios de línea de comandos de código abierto de Linux. stdout se puede redirigir a un registro o / dev / null que facilita la gestión del flujo de datos, incluso si se hace grande. El siguiente paso es usar stderr para la depuración: esto le permite distinguir entre diagnóstico / depuración y la salida real del programa que puede ir a stdout.
Sin embargo, a pesar de lo poderosos que son los volcados stdout / stderr, existen otras herramientas que a veces hacen el trabajo más rápido. Suponga que está trabajando con una estructura / objeto que tiene muchos miembros, desea volcarlos todos una o dos veces con fines de aprendizaje, pero esto no justifica escribir un volquete completo. Puede usar gdb para establecer puntos de interrupción e imprimir esos objetos.
Otro ejemplo: su programa se bloquea con un segfault. Puede usar gdb para averiguar dónde se bloqueó y en qué estaban las variables cuando sucedió. Si un bloqueo es particularmente misterioso, es posible que deba desmontar el código alrededor del valor del PC bloqueado (registro del contador del programa) y examinar los registros; nuevamente, gdb puede ayudar.
gdb también puede ser muy útil para depurar puntos muertos de subprocesos de pthread, aunque esto requiere cierto conocimiento del ensamblaje y los internos de pthread, puede ver qué hilos están tratando de adquirir un bloqueo y qué hilos lo están reteniendo.
- Quiero eliminar mi familia de origen. ¿Cómo hago esto?
- Me siento bien. ¿por qué?
- Soy una persona silenciosa, escuché historias de ‘FISH MARKET’ en SSB Intrerview, ¿necesito levantar la voz durante GD, GPE?
- ¿Debería sentirme culpable mientras juego videojuegos cuando sé que debería estar trabajando en mi programación / trabajando en mi inicio?
- Quiero “encontrarme” a través de la meditación. ¿Qué debo tener en cuenta con respecto a este ‘viaje’?
Otro uso de gdb es el diagnóstico en tiempo de ejecución: puede adjuntarlo a su proceso y descubrir por qué está utilizando un 100% de CPU o no responde a los comandos. Incluso puede hacerlo con una interrupción muy mínima como esta:
gdb -p $(pidof your_process_name) --batch --ex "set pagination 0" --ex "thread apply all bt"
Como se mencionó anteriormente, afirmar () también es una poderosa herramienta de depuración. Me gusta usar una envoltura que arroje algo para que los “mortales” se queden porque todo lo que hace cuando falla es bloquear el programa con un coredump: quieres algo diagnóstico que no implique “hurgar en el núcleo” para tener alguna idea de la causa del accidente
A veces soy demasiado vago para usar mis propios diagnósticos o gdb, y recurro a strace. Esto es adecuado en particular cuando estoy haciendo una misteriosa llamada a la API para la cual no tengo la fuente, o soy demasiado flojo para leerla, y sé que la clave de la solución está oculta en algún lugar de la comunicación entre la aplicación y El sistema operativo. Strace le dirá exactamente lo que está sucediendo en el nivel del sistema operativo detallando cada intento de abrir un archivo, hacer una conexión de red, asignar memoria del sistema, etc. A lo largo de los años he resuelto muchos “imposibles” cómo diablos sabias? tipo de problemas con strace.
Los métodos anteriores son aplicables no solo a la depuración de C / C ++ porque al final del día la mayoría (si no todos) los programas escritos en un lenguaje de nivel superior ejecutarán algún código escrito en C. Por ejemplo, me pareció conveniente usar strace al depurar una aplicación PHP / MySQL para averiguar qué consultas estaba enviando a MySQL y qué estaba recuperando. Sí, podría haber agregado el registro a la clase de base de datos, pero era demasiado vago y podía leer el protocolo MySQL sin formato de manera correcta.