Me gustaría poder depurar la construcción de un generador binario. En este momento, básicamente estoy imprimiendo los datos de entrada en el analizador binario, y luego profundizando en el código e imprimiendo la asignación de la entrada a la salida, luego tomando la asignación de salida (enteros) y utilizándola para ubicar el entero correspondiente en el binario Bastante torpe, y requiere que modifique el código fuente profundamente para llegar al mapeo entre entrada y salida.
Parece que podría ver el binario en diferentes variantes (en mi caso, me gustaría verlo en fragmentos de 8 bits como números decimales, porque está bastante cerca de la entrada). En realidad, algunos números son de 16 bits, algunos de 8, algunos de 32, etc. Por lo tanto, tal vez habría una manera de ver el binario con cada uno de estos números diferentes resaltados en la memoria de alguna manera.
La única forma en que podría ver que es posible es si realmente construyes un visualizador específico para el formato / diseño binario real. Por lo tanto, sabe en qué lugar de la secuencia deberían estar los números de 32 bits, y dónde deberían estar los números de 8 bits, etc. Esto es mucho trabajo y algo complicado en algunas situaciones. Entonces me pregunto si hay una forma general de hacerlo.
También me pregunto cuál es la forma general de depurar este tipo de cosas actualmente, por lo que tal vez pueda obtener algunas ideas sobre qué probar con eso.
Respuestas:
Para verificaciones ad-hoc, solo use un hexdump estándar y aprenda a mirarlo.
Si desea prepararse para una investigación adecuada, generalmente escribo un decodificador separado en algo como Python; idealmente, esto será impulsado directamente desde un documento de especificación de mensaje o IDL, y será lo más automatizado posible (por lo que no hay posibilidad de introducirlo manualmente el mismo error en ambos decodificadores).
Por último, no olvide que debe escribir pruebas unitarias para su decodificador, utilizando la entrada enlatada correcta conocida.
fuente
El primer paso para hacer esto es que necesita una forma de encontrar o definir una gramática que describa la estructura de los datos, es decir, un esquema.
Un ejemplo de esto es una característica del lenguaje de COBOL que se conoce informalmente como copybook. En los programas COBOL, definiría la estructura de los datos en la memoria. Esta estructura se asigna directamente a la forma en que se almacenaron los bytes. Esto es común a los lenguajes de esa época en comparación con los lenguajes contemporáneos comunes donde el diseño físico de la memoria es una preocupación de implementación que se abstrae del desarrollador.
Una búsqueda en Google para el lenguaje de esquema de datos binarios muestra varias herramientas. Un ejemplo es Apache DFDL . Es posible que ya haya una interfaz de usuario para esto también.
fuente
ASN.1 , notación de sintaxis abstracta uno, proporciona una forma de especificar un formato binario.
fuente
Otras respuestas han descrito ver un volcado hexadecimal o escribir estructuras de objetos en, por ejemplo, JSON. Creo que combinar ambos es muy útil.
Usar una herramienta que pueda representar el JSON encima del volcado hexadecimal es realmente útil; Escribí una herramienta de código abierto que analizaba los binarios .NET llamados dotNetBytes , aquí hay una vista de un archivo DLL de ejemplo .
fuente
No estoy seguro de entender completamente, pero parece que tienes un analizador para este formato binario y controlas el código. Entonces esta respuesta se basa en esa suposición.
Un analizador de alguna manera llenará estructuras, clases o cualquier estructura de datos que tenga su lenguaje. Si implementa un
ToString
para todo lo que se analiza, entonces termina con un método muy fácil de usar y fácil de mantener para mostrar esos datos binarios en un formato legible para humanos.Esencialmente tendrías:
Y eso es todo, desde el punto de vista de usarlo. Por supuesto, esto requiere que implemente / anule la
ToString
función para suObject
clase / estructura / lo que sea, y también tendría que hacerlo para cualquier clase / estructura / estructura anidada.También puede usar una declaración condicional para evitar que se invoque la
ToString
función en el código de lanzamiento para que no pierda el tiempo en algo que no se registrará fuera del modo de depuración.Tu
ToString
podría verse así:Su pregunta original hace que parezca que ha intentado hacer esto, y que cree que este método es oneroso, pero que en algún momento también implementó el análisis de un formato binario y creó variables para almacenar esos datos. Entonces, todo lo que tiene que hacer es imprimir esas variables existentes en el nivel apropiado de abstracción (la clase / estructura en la que se encuentra la variable).
Esto es algo que solo debe hacer una vez, y puede hacerlo mientras construye el analizador. Y solo cambiará cuando cambie el formato binario (que de todos modos ya provocará un cambio en su analizador).
En una línea similar: algunos lenguajes tienen características robustas para convertir clases en XML o JSON. C # es particularmente bueno en esto. No tiene que renunciar a su formato binario, solo hace el XML o JSON en una declaración de registro de depuración y deja solo su código de lanzamiento.
Yo personalmente recomendaría no ir a la ruta de volcado hexadecimal, ya que es propenso a errores (si comenzaste en el byte derecho, ¿estás seguro cuando estás leyendo de izquierda a derecha que estás "viendo" la endianness correcta, etc.) .
Ejemplo: Di tus
ToStrings
variables de escupira,b,c,d,e,f,g,h
. Ejecutas tu programa y notas un errorg
, pero el problema realmente comenzóc
(pero estás depurando, por lo que aún no lo has descubierto). Si conoce los valores de entrada (y debería hacerlo), verá instantáneamente quec
allí comienzan los problemas.En comparación con un volcado hexadecimal que simplemente te dice
338E 8455 0000 FF76 0000 E444 ....
; si sus campos varían de tamaño, dóndec
comienza y cuál es el valor, un editor hexadecimal le dirá, pero mi punto es que esto es propenso a errores y consume mucho tiempo. No solo eso, sino que no puede automatizar fácil / rápidamente una prueba a través de un visor hexadecimal. Imprimir una cadena después de analizar los datos le dirá exactamente qué está 'pensando' su programa, y será un paso en el camino de las pruebas automatizadas.fuente