Personalizar la salida de depuración con ID3D10InfoQueue (Direct3D 10)
La cola de información se administra mediante una interfaz (vea ID3D10InfoQueue Interface) que almacena, recupera y filtra los mensajes de depuración. La cola consta de: una cola de mensajes, una pila de filtros de almacenamiento opcional y una pila de filtros de recuperación opcional. La pila de filtro de almacenamiento se puede usar para filtrar los mensajes que desea almacenar; La pila de filtros de recuperación se puede usar para filtrar los mensajes que desea almacenar. Una vez que haya filtrado un mensaje, el mensaje se imprimirá en la ventana de depuración y se almacenará en la pila adecuada.
En general:
- Llamar a ID3D10InfoQueue::AddApplicationMessage para generar mensajes definidos por el usuario
- La llamada ID3D10InfoQueue::GetMessage se usa para obtener mensajes (que pasan un filtro de recuperación opcional).
Controles del Registro
Use las claves del Registro para ajustar la configuración del filtro, ajustar los puntos de interrupción y silenciar la salida de depuración. La capa de depuración comprobará estas rutas de acceso para las claves del Registro; se usará la primera ruta de acceso encontrada.
- HKCU\Software\Microsoft\Direct3D\<subclave definida por el usuario>
- HKLM\Software\Microsoft\Direct3D\<subclave definida por el usuario>
- HKCU\Software\Microsoft\Direct3D
Donde:
- HKCU significa HKEY_CURRENT_USER y HKLM para HKEY_LOCAL_MACHINE.
- <la subclave> definida por el usuario es un nombre arbitrario para almacenar la configuración de depuración de una aplicación.
Filtrado de mensajes de depuración mediante claves del Registro
Si el registro contiene una clave InfoQueueStorageFilterOverride (y no es cero), los mensajes (y la salida de depuración) se pueden filtrar agregando los siguientes controles del Registro.
- DWORD Mute_CATEGORY_*: salida de depuración si esta clave no es cero.
- DWORD Mute_SEVERITY_*: la salida de depuración está deshabilitada si esta clave no es cero.
- DWORD Mute_ID_*: el nombre o el número del mensaje se pueden usar para * (al igual que para BreakOn_ID_* descritos anteriormente). La salida de depuración está deshabilitada si esta clave no es cero.
- DWORD Unmute_SEVERITY_INFO: la salida de depuración está habilitada si esta clave no es cero. De forma predeterminada, cuando InfoQueueStorageFilterOverride está habilitado, se silencian los mensajes de depuración con gravedad INFO; por lo tanto, para esta clave se permite volver a activar INFO.
Estos controles cambian si se registra o se muestra un mensaje; no afectan a si una API pasa o produce un error.
Establecer condiciones de interrupción mediante claves del Registro
Las aplicaciones se pueden forzar a interrumpir en un mensaje mediante las siguientes claves del Registro.
EnableBreakOnMessage : esta clave permite interrumpir los mensajes (y hace que se omita la configuración de SetBreakOnCategory()/SetBreakOnSeverity()/SetBreakOnID(). Los mensajes reales en los que se interrumpirán se definen mediante uno o varios valores BreakOn_* definidos a continuación.
- BreakOn_CATEGORY_* : interrumpa en cualquier mensaje que pase por los filtros de almacenamiento. * es uno de los mensajes de D3D10_MESSAGE_CATEGORY.
- BreakOn_SEVERITY_* : interrumpa en cualquier mensaje que pase por los filtros de almacenamiento. * es uno de los mensajes de D3D10_MESSAGE_SEVERITY_.
- BreakOn_ID_* : interrumpa en cualquier mensaje que pase por los filtros de almacenamiento. * es uno de los mensajes D3D10_MESSAGE_ID_ o puede ser el valor numérico de la enumeración de errores. Por ejemplo, suponga que el mensaje con el identificador "D3D10_MESSAGE_ID_HYPOTHETICAL" tenía el valor 123 en la enumeración D3D10_MESSAGE_ID. En este caso, la creación del valor BreakOn_ID_HYPOTHETICAL=1 o BreakOn_ID_123=1 lograría lo mismo: se interrumpiría cuando se encuentra un mensaje que tiene el identificador D3D10_MESSAGE_ID_HYPOTHETICAL.
Silenciar la salida de depuración mediante claves del Registro
La salida de depuración se puede silenciar mediante una clave MuteDebugOutput. La presencia de este valor en el Registro fuerza la invalidación del método ID3D10InfoQueue::SetMuteDebugOutput de InfoQueue . MuteDebugOutput detiene los mensajes que pasan el filtro de almacenamiento de que se envían a la salida de depuración.
Deshabilitación de mensajes de capa de depuración
Los mensajes de capa de depuración se pueden deshabilitar individualmente o como grupo en tiempo de ejecución especificando filtros mediante ID3D10InfoQueue::AddStorageFilterEntries. El argumento pFilter de ID3D10InfoQueue::AddStorageFilterEntries toma una estructura de D3D10_INFO_QUEUE_FILTER que contiene una lista de permitidos y una lista de denegación. Las listas de permitidos y denegados se describen mediante estructuras D3D10_INFO_QUEUE_FILTER_DESC que permiten especificar el filtrado mediante la ordenación, la gravedad y el identificador de mensaje individual.
El código siguiente es un ejemplo de configuración de la interfaz ID3D10InfoQueue para denegar el mensaje de D3D10_MESSAGE_ID_DEVICE_DRAW_INDEX_BUFFER_TOO_SMALL.
//retrieve the ID3D10InfoQueue from a Direct3D device created with the D3D10_CREATE_DEVICE_DEBUG flag
ID3D10InfoQueue * pInfoQueue;
g_pd3dDevice->QueryInterface( __uuidof(ID3D10InfoQueue), (void **)&pInfoQueue );
//set up the list of messages to filter
D3D10_MESSAGE_ID messageIDs [] = { D3D10_MESSAGE_ID_DEVICE_DRAW_INDEX_BUFFER_TOO_SMALL };
//set the DenyList to use the list of messages
D3D10_INFO_QUEUE_FILTER filter = { 0 };
filter.DenyList.NumIDs = 1;
filter.DenyList.pIDList = messageIDs;
//apply the filter to the info queue
pInfoQueue->AddStorageFilterEntries( &filter );
Temas relacionados