Поделиться через


Настройка выходных данных отладки с помощью ID3D10InfoQueue (Direct3D 10)

Информационная очередь управляется интерфейсом (см . id3D10InfoQueue Interface), который хранит, извлекает и фильтрует сообщения отладки. Очередь состоит из: очереди сообщений, необязательного стека фильтров хранилища и необязательного стека фильтров извлечения. Стек фильтра хранилища можно использовать для фильтрации сообщений, которые вы хотите сохранить; Стек фильтра извлечения можно использовать для фильтрации хранящихся сообщений. После фильтрации сообщения сообщение будет выведено в окно отладки и сохранено в соответствующем стеке.

а именно:

  • Вызовите ID3D10InfoQueue::AddApplicationMessage для создания определяемых пользователем сообщений
  • Вызов ID3D10InfoQueue::GetMessage используется для получения сообщений (которые передают необязательный фильтр извлечения).

Элементы управления реестром

Используйте разделы реестра для настройки параметров фильтра, точек останова и отключения выходных данных отладки. Уровень отладки будет проверка эти пути для разделов реестра. Будет использован первый найденный путь.

  1. HKCU\Software\Microsoft\Direct3D\<определяемый пользователем подраздел>
  2. HKLM\Software\Microsoft\Direct3D\<определяемый пользователем подраздел>
  3. HKCU\Software\Microsoft\Direct3D

Где:

  • HKCU — HKEY_CURRENT_USER, а HKLM — HKEY_LOCAL_MACHINE.
  • <определяемый пользователем подраздел> — это произвольное имя для хранения параметров отладки для приложения.

Фильтрация сообщений отладки с помощью разделов реестра

Если реестр содержит раздел InfoQueueStorageFilterOverride (и не равен нулю), сообщения (и выходные данные отладки) можно отфильтровать, добавив следующие элементы управления реестра.

  • DWORD Mute_CATEGORY_* — выходные данные отладки, если этот ключ не равен нулю.
  • DWORD Mute_SEVERITY_* — выходные данные отладки отключены, если этот ключ не равен нулю.
  • DWORD Mute_ID_* — имя или номер сообщения можно использовать для параметра * (как и для BreakOn_ID_*, описанных выше). Выходные данные отладки отключены, если этот ключ не равен нулю.
  • DWORD Unmute_SEVERITY_INFO — выходные данные отладки включены, если этот ключ не равен нулю. По умолчанию при включении InfoQueueStorageFilterOverride отладочные сообщения с уровнем серьезности INFO отключены, поэтому для этого ключа можно снова включить INFO.

Эти элементы управления изменяют запись или отображение сообщения; Они не влияют на то, проходит ли API или завершается сбоем.

Настройка условий останова с помощью разделов реестра

Приложения могут быть вынуждены прервать выполнение сообщения с помощью следующих разделов реестра.

EnableBreakOnMessage — этот ключ включает прерывание сообщений (и вызывает пропускание параметров SetBreakOnCategory()/SetBreakOnSeverity()/SetBreakOnID(). Фактические сообщения для прерывания определяются с помощью одного или нескольких значений BreakOn_*, определенных ниже.

  • BreakOn_CATEGORY_* — прервите все сообщения, проходящие через фильтры хранилища. * является одним из D3D10_MESSAGE_CATEGORY сообщений.
  • BreakOn_SEVERITY_* — прервите все сообщения, проходящие через фильтры хранилища. * является одним из D3D10_MESSAGE_SEVERITY_ сообщений.
  • BreakOn_ID_* — прервать все сообщения, проходящие через фильтры хранилища. * является одним из D3D10_MESSAGE_ID_ сообщений или может быть числовым значением перечисления ошибок. Например, предположим, что сообщение с идентификатором "D3D10_MESSAGE_ID_HYPOTHETICAL" имеет значение 123 в перечислении D3D10_MESSAGE_ID. В этом случае создание значения BreakOn_ID_HYPOTHETICAL=1 или BreakOn_ID_123=1 приведет к тому же — прерывание при обнаружении сообщения с идентификатором D3D10_MESSAGE_ID_HYPOTHETICAL.

Отключение выходных данных отладки с помощью разделов реестра

Выходные данные отладки можно отключить с помощью ключа MuteDebugOutput. Наличие этого значения в реестре приводит к переопределении метода ID3D10InfoQueue::SetMuteDebugOutput infoQueue. MuteDebugOutput останавливает отправку сообщений, которые передают фильтр хранилища, в выходные данные отладки.

Отключение сообщений уровня отладки

Сообщения уровня отладки можно отключить отдельно или в группе во время выполнения, указав фильтры с помощью ID3D10InfoQueue::AddStorageFilterEntries. Аргумент pFilter для ID3D10InfoQueue::AddStorageFilterEntries принимает D3D10_INFO_QUEUE_FILTER структуру, содержащую список разрешений и список запрещенных. Списки разрешений и запретов описываются D3D10_INFO_QUEUE_FILTER_DESC структурами, которые позволяют указать фильтрацию по категориям, серьезности и идентификатору отдельного сообщения.

Следующий код является примером настройки интерфейса ID3D10InfoQueue для запрета сообщения 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 );  

Уровни API

Функции API (Direct3D 10)