Compartir a través de


Anatomía de un archivo DLL de extensión DbgEng

Un archivo DLL de extensión DbgEng exporta varias funciones de devolución de llamada, algunas de las cuales pueden ser implementaciones de comandos de extensión.

El motor del depurador carga estos archivos DLL de extensión y pueden proporcionar funcionalidad adicional o automatización de tareas mientras se realiza la depuración en modo de usuario o modo kernel en Microsoft Windows.

Si ha realizado una instalación completa de herramientas de depuración para Windows, se puede encontrar una extensión dbgEng de ejemplo denominada "exts" en el subdirectorio sdk\samples\exts del directorio de instalación.

Comandos de extensión

Un archivo DLL de extensión puede exportar cualquier número de funciones que se usan para ejecutar comandos de extensión. Cada función se declara explícitamente como una exportación en el archivo .def y su nombre debe constar completamente de letras minúsculas.

Las funciones usadas para implementar comandos de extensión deben coincidir con el prototipo PDEBUG_EXTENSION_CALL.

Estas funciones se denominan según la convención estándar de C++, salvo que no se permiten letras mayúsculas. El nombre de la función exportada y el nombre del comando de extensión son idénticos, salvo que el comando de extensión comienza con un signo de exclamación (!). Por ejemplo, al cargar myextension.dll en el depurador y, a continuación, escriba !stack en la ventana Comando del depurador, el depurador busca una función exportada denominada stack en myextension.dll.

Si myextension.dll aún no está cargado o si puede haber otros comandos de extensión con el mismo nombre en otros archivos DLL de extensión, puede escribir !myextension.stack en la ventana Comando del depurador para indicar el archivo DLL de extensión y el comando de extensión en ese archivo DLL.

Otras funciones exportadas

Un archivo DLL de extensión DbgEng debe exportar DebugExtensionInitialize. Se llamará cuando se cargue el archivo DLL para inicializar el archivo DLL. El archivo DLL puede usarlo para inicializar variables globales.

Un archivo DLL de extensión puede exportar DebugExtensionUninitialize. Si se exporta, se llamará antes de que se descargue el archivo DLL de extensión. El archivo DLL puede usarlo para limpiarlo antes de descargarlo.

Un archivo DLL de extensión puede exportar DebugExtensionNotify. Si se exporta, se llamará cuando una sesión comience o finalice, y cuando un destino se inicie o deje de ejecutarse. Estas notificaciones también se proporcionan a los objetos IDebugEventCallbacks registrados con un cliente.

Un archivo DLL de extensión puede exportar KnownStructOutput. Si se exporta, se llamará cuando se cargue el archivo DLL. Esta función devuelve una lista de estructuras que el archivo DLL sabe cómo imprimir en una sola línea. Se puede llamar más adelante para dar formato a las instancias de estas estructuras para imprimir.

Procedimiento de motor para cargar un archivo DLL de extensión DbgEng

Cuando se carga un archivo DLL de extensión, el motor llama a las funciones de devolución de llamada en el orden siguiente:

  1. DebugExtensionInitialize se denomina para que el archivo DLL de extensión pueda inicializarse.

  2. Si se exporta, se llama a DebugExtensionNotify si el motor tiene una sesión activa y se llama de nuevo si la sesión se suspende y es accesible.

  3. Si se exporta, se llama a KnownStructOutput para solicitar una lista de estructuras que el archivo DLL sabe cómo imprimir en una sola línea.

Consulte Carga de archivos DLL de extensión del depurador para obtener información sobre cómo usar el depurador para cargar y descargar un archivo DLL de extensión y vea Usar comandos de extensión del depurador para obtener información sobre cómo ejecutar un comando de extensión.

El motor del depurador colocará un try/ excepto un bloque alrededor de una llamada a un archivo DLL de extensión. Esto protege el motor de algunos tipos de errores en el código de extensión; pero, dado que las llamadas de extensión se ejecutan en el mismo subproceso que el motor, todavía pueden provocar que se bloquee.