Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
A extensão C++/WinRT do Visual Studio (VSIX) fornece visualização de depuração nativa (natvis) no Visual Studio para tipos projetados de C++/WinRT. Isto proporciona-lhe uma experiência semelhante à depuração em C#.
Note
Para mais informações sobre a Extensão Visual Studio C++/WinRT (VSIX), consulte o suporte Visual Studio para C++/WinRT e o VSIX.
Ativar natvis
O Natvis é ativado automaticamente numa compilação de depuração porque WINRT_NATVIS é definido quando o símbolo _DEBUG estiver definido.
Aqui está como optar por ele para uma versão de lançamento.
- Compila o teu código com o símbolo WINRT_NATVIS definido. Ao fazê-lo, exporta uma função WINRT_abi_val , que fornece o ponto de entrada para o visualizador de depuração avaliar os valores das propriedades no processo de destino.
- Gera um PDB completo. Isto porque o visualizador de depuração utiliza o Visual Studio C++ Expression Evaluator, que por sua vez requer definições simbólicas para os tipos de propriedades apresentados.
- Um tipo visualizado deve reportar uma classe de execução ou uma interface definida em metadados descobertos. Faz isto através da implementação de IInspectable::GetRuntimeClassName.
Dado o exposto, o visualizador de depuração funciona melhor com tipos de sistema Windows cujos metadados podem ser encontrados na C:\Windows\System32\WinMetadata pasta. No entanto, também pode suportar tipos definidos pelo utilizador e depuração remota, desde que localize corretamente os ficheiros .winmd.
Utilização de metadados personalizados
O visualizador de depuração procura metadados definidos pelo utilizador (ficheiros .winmd) a par do processo .exe. Utiliza um algoritmo semelhante ao de RoGetMetaDataFile, procurando subcadeias sucessivas no nome de tipo totalmente qualificado. Por exemplo, se o tipo visualizado for Contoso.Controls.Widget, então o visualizador procura, em sequência, por:
- Contoso.Controls.Widget.winmd
- Contoso.Controls.winmd
- Contoso.winmd
Depuração remota com metadados personalizados
Quando se faz depuração remota, o processo .exe não é local, por isso a pesquisa por metadados personalizados (mencionados na secção anterior) falha. Nesse caso, o visualizador recorre a uma pasta de cache local (%TEMP%) à procura de um ficheiro .winmd adequado. Se encontrar um ficheiro, regista o tamanho e a data do ficheiro e, em seguida, procura o mesmo .winmd no alvo remoto de depuração, ao lado do binário. Se necessário, o ficheiro remoto é descarregado, atualizando a cache local. Esta estratégia garante que o cache .winmd local está sempre atualizado, além de fornecer um meio para armazenar manualmente um arquivo em cache .
winmd se não for possível encontrá-lo remotamente (por exemplo, se a implementação do F5 não o tiver colocado lá).
Para um exemplo do comportamento de cache, veja a secção de Resolução de Problemas abaixo.
Solução de problemas
O visualizador de depuração utiliza o Avaliador de Expressões Visual Studio C++ para invocar a função WINRT_abi_val exportada e obter valores de propriedades. Normalmente, o visualizador pode detetar exceções não tratadas e degradar-se de forma elegante, exibindo "<Objeto não inicializado ou informação indisponível>" nas janelas do Visual Studio Watch.
Isto é útil quando o visualizador tenta avaliar uma variável local fora do seu âmbito de vida útil (por exemplo, antes da construção). Em alguns contextos, como testes unitários, é instalado um filtro de exceções não tratado. Isto pode fazer com que o processo termine quando o avaliador de expressões C++ falha. Para evitar falhas, o visualizador faz várias chamadas VirtualQuery em WINRT_abi_val.
Diagnósticos
Se uma propriedade não estiver a ser apresentada corretamente, ative o diagnóstico detalhado do Natvis no Visual Studio (Ferramentas>Opções>Depuração>Janela de Saída>Mensagens de diagnóstico do Natvis) e, em seguida, consulte a janela Saída para ver erros do Natvis.
O excerto seguinte mostra várias tentativas de sondar um .winmd ficheiro, seguidas de um download do alvo remoto para a pasta de cache local, e depois uma carga desse .winmd ficheiro.
Natvis C++/WinRT: Looking for C:\Users\...\AppData\Local\DevelopmentFiles\ffcddd4f-cfc0-44cb-b736-0b2d026def77VS.Debug_x64....\Consoso.Controls.Widget.winmd
Natvis C++/WinRT: Looking for C:\Users\...\AppData\Local\DevelopmentFiles\ffcddd4f-cfc0-44cb-b736-0b2d026def77VS.Debug_x64....\Consoso.Controls.winmd
Natvis C++/WinRT: Downloading C:\Users\...\AppData\Local\DevelopmentFiles\ffcddd4f-cfc0-44cb-b736-0b2d026def77VS.Debug_x64....\Consoso.Controls.winmd
Natvis C++/WinRT: Loaded C:\Users\...\AppData\Local\Temp\Consoso.Controls.winmd
Se o visualizador não encontrar um .winmd ficheiro, então este erro é gerado:
Natvis C++/WinRT: Could not find metadata for Consoso.Controls.Widget
Existem vários outros cenários de erro que todos produzem diagnósticos.
Se os metadados estiverem disponíveis, os diagnósticos de saída apresentarão muitas chamadas como esta:
Natvis C++/WinRT: WINRT_abi_val(*(::IUnknown**)0x32dd4ffc18, L"{96369F54-8EB6-48F0-ABCE-C1B211E627C3}", 0).s,sh
Natvis C++/WinRT: WINRT_abi_val(*(::IUnknown**)0x32dd4ffc18, L"{AF86E2E0-B12D-4C6A-9C5A-D7AA65101E90}", -2).s,sh
A primeira é uma chamada a IStringable.ToString para obter a representação de cadeias de um tipo complexo (o valor de exibição não expandido).
A segunda é uma chamada a IInspectable::GetRuntimeClassName, para refletir sobre as propriedades do tipo.
As chamadas subsequentes para WINRT_abi_val são avaliações de propriedades para cada interface descoberta no tipo.
Invocando WINRT_abi_val
Podes usar as janelas Visual Studio Immediate/Command para invocar diretamente WINRT_abi_val para resolução de problemas.
Por exemplo, dada uma variável projetada stringable, pode avaliar o IStringable.ToString da mesma como:
>? WINRT_abi_val((::IUnknown*)&stringable, L"{96369F54-8EB6-48F0-ABCE-C1B211E627C3}", 0).s,sh
L"string"
Tópicos relacionados
Windows developer