Требования к целевому приложению для отладчика графики Visual Studio 11

Я был очень счастлив, когда для Visual Studio 11 была объявлена ​​функция «Отладчик графики», я сразу же попытался заставить ее работать в различных проектах, которые у меня были, но, к сожалению, мне удалось заставить ее работать только для приложений Windows 8 Metro! В частности, шаблоны проектов C++ Metro запускаются и правильно фиксируют всю ожидаемую информацию.

В версиях Visual Studio Developer Preview и в Windows 7 любая попытка запуска приложений в отладчике графики (Alt-F5) приводит к сбою в D3D11CreateDeviceAndSwapChain(), даже если они работают нормально. На моей рабочей машине Visual Studio 11 Beta на Windows 8 Consumer Preview я продвинулся немного дальше, графический отладчик HUD отображается правильно, но любая попытка получить захват (экран печати в приложении или кнопка панели инструментов) просто приводит к сообщение (в журнале вывода и желтая полоса вверху открытого .vsglog):

Механизм диагностики графики не смог предоставить результаты, скорее всего, потому, что vsglog выполняет вызовы DirectX, которые не поддерживаются на этом компьютере.

Это касается даже прямого переноса вызовов Direct3D из шаблонных приложений Metro! Я не вижу никаких сообщений из документации MSDN о том, что эта функция предназначена только для Metro, поэтому я ожидаю, что просто делаю какую-то глупость, но приложения работают правильно, когда не под отладчиком графики.

Дополнительная информация: D3D11_CREATE_DEVICE_DEBUG установлен, панель управления DirectX включает отладку Direct3D, и я получаю ожидаемые информационные сообщения Create/Destroy и никаких других сообщений в Output.


person Simon Buchan    schedule 14.03.2012    source источник
comment
Рассматривали ли вы также возможность сообщить об этой проблеме в виде отзыва в Microsoft и на соответствующих предварительных форумах и в списках рассылки? Настоящие сотрудники Microsoft могут лучше ответить на этот вопрос.   -  person MrGomez    schedule 19.03.2012
comment
Здесь есть ссылка на форум отладчика Microsoft VS. Я немного осмотрелся, но еще не нашел сообщения электронной почты/блога для кого-то, близкого к отладчику VS, хотя я все еще ищу.   -  person Simon Buchan    schedule 20.03.2012
comment
Я был бы рад попросить моих профессиональных контактов от вашего имени. Я знаю нескольких человек, близких к группе отладки, которые могли бы предложить вам лучший ответ, чем общепризнанный общий ответ, который я предоставил ниже.   -  person MrGomez    schedule 21.03.2012


Ответы (2)


Windows 8: А-ха! Подключив другой отладчик к узлу графического отладчика VsGraphicsDesktopEngine.exe (находится в C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\VsGraphics\x86) и принудительно отладив Direct3D через панель управления DirectX, я получил вывод:

ОШИБКА DXGI: в DXGI_SWAP_CHAIN_DESC не указано целевое окно, и нет окна, связанного с владением фабрикой. [НЕИЗВЕСТНАЯ ОШИБКА №7:]

PIX: IDXGIFactory2::CreateSwapChainForHwnd вернул 887a0001

Я подумал, что это довольно странно, поскольку, хотя я и использую CreateSwapChainForHwnd(), он использует DXGI_SWAP_CHAIN_DESC1, в котором даже не имеет поля OutputWindow. Однако я попытался заменить использование CreateSwapChainForHwnd() на CreateSwapChain() с указанным OutputWindow, и все работает!

При дальнейшем тестировании я обнаружил, что любая попытка D3D11CreateDeviceAndSwapChain() терпит неудачу, с нулевым адаптером она работает, но захваты дают странный результат. Этот механизм диагностики графики не поддерживает D3D9. Воспроизведение вашего приложения может быть неполным, а с указанным адаптером оно вылетает с таким стеком:

04246c83()
[Frames below may be incorrect and/or missing]
dxgi.dll!CDXGIFactory::CreateSwapChainForHwndImpl(struct IUnknown *,struct DXGI_SWAP_CHAIN_DESC_INTERNAL *,bool,struct IDXGIOutput *,struct IDXGISwapChain1 * *)
dxgi.dll!CDXGIFactory::CreateSwapChain(struct IUnknown *,struct DXGI_SWAP_CHAIN_DESC *,struct IDXGISwapChain * *)
VsGraphicsHelper.dll!CHookedIDXGIFactory::CreateSwapChain(struct IUnknown *,struct DXGI_SWAP_CHAIN_DESC *,struct IDXGISwapChain * *)
VsGraphicsHelper.dll!CSpyHookedIDXGIFactory::CreateSwapChain(struct IUnknown *,struct DXGI_SWAP_CHAIN_DESC *,struct IDXGISwapChain * *)
d3d11.dll!_D3D11CreateDeviceAndSwapChain@48()
VsGraphicsHelper.dll!CHookedD3D11Top::D3D11CreateDeviceAndSwapChain(struct IDXGIAdapter *,enum D3D_DRIVER_TYPE,struct HINSTANCE__ *,unsigned int,enum D3D_FEATURE_LEVEL *,unsigned int,unsigned int,struct DXGI_SWAP_CHAIN_DESC *,struct IDXGISwapChain * *,struct ID3D11Device * *,enum D3D_FEATURE_LEVEL *,struct ID3D11DeviceContext * *)
VsGraphicsHelper.dll!CSpyHookedD3D11Top::D3D11CreateDeviceAndSwapChain(struct IDXGIAdapter *,enum D3D_DRIVER_TYPE,struct HINSTANCE__ *,unsigned int,enum D3D_FEATURE_LEVEL *,unsigned int,unsigned int,struct DXGI_SWAP_CHAIN_DESC *,struct IDXGISwapChain * *,struct ID3D11Device * *,enum D3D_FEATURE_LEVEL *,struct ID3D11DeviceContext * *)
Win32ProjectScratch.exe!Direct3DWindowBase::CreateDeviceResources() Line 363
...

Кажется, что работает только D3D11CreateDevice(), за которым следует IDXGIFactory::CreateSwapChain() - либо путем указания адаптера, либо путем запроса устройства для его фабрики позже.

В Windows 7 есть еще одна проблема: вам все еще нужно использовать D3D11CreateDevice()/IDXGIFactory::CreateSwapChain(), но она также вызывает ошибку слоя отладки DirectX при первом Present(), если вы используете фабрику DXGI 1.0 (CreateDXGIFactory() против CreateDXGIFactory1()):

D3D11: ОШИБКА: ID3D11Device::CreateTexture2D: D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX доступен только для устройств, созданных на заводах Dxgi1.1 или более поздней версии. [STATE_CREATION ERROR #103: CREATETEXTURE2D_INVALIDMISCFLAGS]

Если у вас включена опция прерывания уровня отладки при серьезности (что, как правило, и должно быть), это приведет к возникновению исключения в отладчике, что сделает его похожим на еще один сбой, однако его можно безопасно продолжить — однако вы не получите VS Graphics Debugger HUD, и окно таблицы объектов имеет поврежденное содержимое. С другой стороны, если вы последуете его совету и воспользуетесь фабрикой DXGI 1.1, вы получите настоящий сбой в Present().

Таким образом, кажется, что графический отладчик еще не совсем готов!

Спасибо @MrGomez за идею отладки отладчика

person Simon Buchan    schedule 21.03.2012
comment
Я тоже посмотрел на другой ответ, но не могу понять - как именно вы подключаете отладчик к VsGraphicsDesktopEngine.exe и заставляете его снова подключаться к вашему проекту? - person Rei Miyasaka; 17.06.2012
comment
@ReiMiyasaka: Просто, запустите первый экземпляр, запустите отладку графики, затем запустите другой экземпляр, затем используйте Присоединение к процессу для отладки VsGraphicsDesktopEngine.exe, запущенного первым VS. (Прикрепить отображается только в некоторых конфигурациях пользовательского интерфейса: я предлагаю перезагрузить общие настройки разработки, если они не находятся в меню «Отладка») - person Simon Buchan; 24.07.2012

На основании предоставленной вами информации инструмент аварийно завершает работу в D3D11CreateDeviceAndSwapChain, поскольку уровень абстракции не может удовлетворить необходимые расширения Direct3D во время рендеринга. Это подтверждается приведенным вами сообщением об ошибке, поскольку запрашиваемые вызовы Direct3D не поддерживаются вашим текущим компьютером.

MSDN предоставляет справочную статью по этому сценарию, в которой рассказывается, как использовать стандартный инструменты для отладки этого процесса. В частности, хотя вы, вероятно, уже рассмотрели это, dxdiag может помочь вам отладить текущие запущенные расширения в вашей системе для Windows 7 или Windows 8 Consumer Preview. Вы также должны иметь возможность сохранить аварийный дамп при сбое Visual Studio 11 для последующей отладки, который должен показать, какой вызов процесса завершился неудачно.

Пожалуйста, сделайте это и, если возможно, обновите этот вопрос с результатами. Это должно осветить вызов API, который требуется вашей системе, чтобы мы могли решить эту проблему.

person MrGomez    schedule 18.03.2012
comment
Полное раскрытие: я не сотрудник Microsoft, поэтому искусство психической отладки меня не устраивает. :) - person MrGomez; 19.03.2012
comment
Я не уверен, как бы я зафиксировал аварийный дамп, когда VS не дает сбой - предположительно, я мог бы поймать исключение первого шанса, если бы я отлаживал VS. D3D10 отменил расширения в пользу уровней функций (слава богу!), поэтому я не ожидаю, что это так, но я мог бы попробовать программное обеспечение/WARP и т. д.... - person Simon Buchan; 20.03.2012
comment
Понимаю. Простите мое замешательство. Конечно, трудность заключается в том, что вы пытаетесь отладить отладчик графики, который сам по себе дает сбой при графическом отказе без дополнительной информации. О, радости круговых зависимостей. Могу ли я с уверенностью предположить, что вы заблокированы на все это справочное дерево, включая каждую ветвь в разделе «Связанные темы», вплоть до трех уровней? - person MrGomez; 20.03.2012
comment
Кроме того: если это не противоречит условиям обслуживания, доступным с VS2011, поскольку вы пытаетесь исследовать проблему системной зависимости, правильным решением может быть перехват процесса в динамическом дизассемблере, таком как OllyDbg или IDA Pro, чтобы пройти через цепочку выполнения и устранить проблему. Понятно, что это крайняя мера из-за различных законов и правовых ограничений. IANAL, но если Microsoft предоставит тестировщикам сообщества исключение для исследований, это можно сделать. - person MrGomez; 20.03.2012
comment
Удалось решить - спасибо за помощь/тыкание палкой! Наслаждайтесь баллами :) - person Simon Buchan; 21.03.2012