2012-03-14 3 views
8

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

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

The Graphics Diagnostics engine couldn't provide the results, most likely because the vsglog is making DirectX calls not supported on this machine.

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

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

+2

Вы также рассмотрели сообщение об этой проблеме в качестве обратной связи для Microsoft и на соответствующих форумах предварительного просмотра и списках рассылки? Фактические сотрудники Microsoft могут лучше ответить на этот вопрос. – MrGomez

+0

Здесь есть ссылка на форум отладчика Microsoft VS. Я немного осмотрелся, но еще не нашел письмо/блог для кого-то, близкого к отладчику VS. Я все еще смотрю. –

+0

Я был бы рад попросить моих профессиональных контактов от вашего имени. Я знаю несколько человек, близких к команде отладки, которые могли бы предложить вам лучший ответ, чем, по общему признанию, общий, который я представил ниже. – MrGomez

ответ

9

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

DXGI ERROR: No target window specified in DXGI_SWAP_CHAIN_DESC, and no window associated with owning factory. [ UNKNOWN ERROR #7: ]

PIX: IDXGIFactory2::CreateSwapChainForHwnd returned 887a0001

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

С дальнейшими испытаниями я обнаружил, что всякая попытка D3D11CreateDeviceAndSwapChain() терпит неудачу, с запущенным нулевым адаптером, но захваты дают bizzare. «Этот механизм диагностики графики не поддерживает 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 * *) 
[email protected]() 
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() vs. CreateDXGIFactory()):

D3D11: ERROR: ID3D11Device::CreateTexture2D: D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX is only available for devices created off of Dxgi1.1 factories or later. [ STATE_CREATION ERROR #103: CREATETEXTURE2D_INVALIDMISCFLAGS ]

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

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

Принадлежит к @MrGomez для идеи для отладки отладчика

+0

Я тоже посмотрел на другой ответ, но я не могу это понять - как именно вы присоединяете отладчик к VsGraphicsDesktopEngine.exe и получаете это, чтобы снова подключиться к вашему проекту? –

+1

@ReiMiyasaka: Простой, начните первый экземпляр, начните отладку графики, затем запустите другой экземпляр, а затем используйте «Attach to Process» для отладки VsGraphicsDesktopEngine.exe, который был запущен первым VS.(Attach появляется только в некоторых конфигурациях пользовательского интерфейса: я предлагаю перезагрузить настройки «General Development», если это не входит в меню Debug) –

+0

Прохладный, спасибо за это! –

3

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

MSDN предоставляет вам a help article on this scenario,, используя стандартные инструменты для отладки этого процесса. В частности, хотя вы, вероятно, уже это рассмотрели, dxdiag может помочь вам отладить текущие текущие расширения в вашей системе для Windows 7 или Windows 8 Consumer Preview. Вы также должны иметь возможность save a crash dump when Visual Studio 11 crashes для последующей отладки, которая должна подсвечивать, какой процесс отказался.

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

+0

Полное раскрытие: я не сотрудник Microsoft, поэтому искусство психической отладки не позволяет мне. :) – MrGomez

+1

Я не уверен, как бы захватить дамп сбоя, когда VS не сбой - по-видимому, я мог бы поймать исключение первого шанса, если я отлаживаю VS. D3D10 отменил расширения в пользу функциональных уровней (слава богу!), Поэтому я не ожидаю, что так будет, но я мог бы попробовать программное обеспечение/WARP и т. Д. –

+0

Я вижу. Извините мое замешательство. Конечно, сложность заключается в том, что вы пытаетесь отлаживать графический отладчик, который сам отказывается от графического провала без дополнительной информации. О, радости круговых зависимостей. Могу ли я предположить, что вы заблокированы [все это дерево справки] (http://msdn.microsoft.com/en-us/library/hh315751 (v = vs.110) .aspx), включая каждую ветвь в Связанных Темы до трех уровней? – MrGomez

Смежные вопросы