Este artículo de wakelift.de explora cómo proporcionar información sobre código JIT (Just-In-Time) compilado a diferentes partes del sistema, incluyendo el sistema operativo, herramientas de desarrollo como depuradores y profilers. El problema surgió en MoarVM, una máquina virtual escrita en C que ejecuta código Raku, cuando se compiló en Windows con una versión específica de MSVC. La raíz del problema radicaba en un cambio en la implementación de longjmp en Windows, que ahora intenta 'desenredar' la pila por frame en lugar de simplemente ajustar el puntero de pila. Esto afectó a MoarVM porque, aunque escrito en C, utiliza longjmp para una forma rudimentaria de manejo de excepciones, y el código JIT compilado llama a funciones de implementación compartidas. La falta de información de desenredado para el código JIT compilado provocaba fallos en tiempo de ejecución.
El artículo describe el proceso de desarrollo para solucionar este problema, que implicó la creación de código para proporcionar la información de desenredado necesaria utilizando las APIs de Windows (RtlAddFunctionTable). Sin embargo, se encontró una solución más simple. El artículo luego se centra en las diferentes formas en que el compilador JIT puede comunicar información sobre el código generado a otras herramientas. Estas incluyen:
- Perf Map: Un archivo de texto simple que contiene información sobre las funciones JIT compiladas (dirección, longitud, nombre). Es la solución más sencilla pero limita la capacidad de ver el ensamblador del código.
- Creación de un objeto compartido cargable (ELF/DLL/DYLIB): La solución más completa, pero también la más compleja, ya que implica crear un archivo ejecutable completo y mantenerlo en el disco.
- RtlAddFunctionTable: Permite proporcionar información de desenredado a la API de Windows, pero no permite proporcionar nombres de función.
- _U_dyn_register: Permite proporcionar un nombre de función y una tabla de instrucciones de desenredado.
- JITDUMP: Formato para Linux's 'perf' tool, permite proporcionar nombres de función, tablas de desenredado y anotaciones de línea.
El autor expresa un deseo de encontrar una forma aún más integrada de proporcionar esta información, pero aún no la ha encontrado. El artículo destaca la importancia de proporcionar metadatos sobre el código JIT compilado para facilitar la depuración, el perfilado y la integración con otras herramientas del sistema.
