Como anexar o depurador para entrar no código nativo (C++) de um wrapper gerenciado (C#)?
-
09-06-2019 - |
Pergunta
Eu tenho um wrapper em torno de uma chamada de função C++ que chamo do código C#.Como anexei um depurador no Visual Studio para entrar no código C++ nativo?
Este é o wrapper que tenho que chama GetData() definido em um arquivo C++:
[DllImport("Unmanaged.dll", CallingConvention=CallingConvention.Cdecl,
EntryPoint = "GetData", BestFitMapping = false)]
public static extern String GetData(String url);
O código está travando e quero investigar a causa raiz.
Obrigado, Nikhil
Solução
Verifique a guia Debug na página de propriedades do seu projeto.Deve haver uma caixa de seleção "Ativar depuração de código não gerenciado".Isso funcionou para mim quando desenvolvemos uma nova UI .NET para nossas antigas DLLs c++.
Se sua DLL não gerenciada estiver sendo construída a partir de outro projeto (por um tempo a nossa estava sendo construída usando VS6), apenas certifique-se de ter o arquivo pdb da DLL em mãos para a depuração.
A outra abordagem é usar o exe C# como o exe de destino para executar a partir do projeto DLL, você pode então depurar sua DLL normalmente.
Outras dicas
além do conselho de Lou para iniciar o depurador, você pode selecionar quais mecanismos de depuração serão usados ao anexar a um processo existente clicando em 'Selecionar...' na caixa de diálogo 'anexar ao processo' e escolhendo 'código gerenciado' e ' Código nativo'.
A depuração dessa forma é chamada de depuração de modo misto.Veja isso postagem no blog para algumas dicas.
Acredito que isso não seja compatível com processos de 64 bits ...embora adoraria estar errado nesse ponto.
Para qualquer pessoa que use WinDbg:
1> Símbolos de configuração
Veja esses comandos.(Ajuda:no console .hh < comando> )
.sympath
.sympath+
.symfix
2>Configurar caminho de origem
.srcpath
3> Carregue a extensão SOS para depurar programas de modo gerenciado/misto.
(Certifique-se de ter configurado o caminho de extensão corretamente)
Adicione Microsoft.NET\Framework\v2.0.50727 para x86 usando-
.extpath
Defina um ponto de interrupção para o clr carregar.
sxe ld:mscorwks
(F5 / g) (aguarde o Modload BP em mscorwks.dll)
Certifique-se de não ter uma extensão SOS duplicada já carregada.Ver:
.chain
Agora estamos prontos para carregar a extensão sos.:)
.loadby sos mscorwks
4> Recarregue todos os símbolos.
.reload
Agora está tudo pronto :)
(YMMV)
A depuração mista não tem suporte no modo de 64 bits (a partir do Visual Studio 2008).