EEAddIn Sample: Depuração expressão Evaluator suplemento
O exemplo EEAddin mostra como estender o nativo avaliador da expressão usando a Expression Evaluator suplemento API do depurador.
Observação de segurança: |
---|
Este código de exemplo é fornecido para ilustrar um conceito e não deve ser usado em aplicativos ou sites da Web, pois ele não pode ilustrar sistema autônomo práticas de codificação mais seguras.Microsoft sistema autônomo sumes nenhuma responsabilidade por danos incidentais ou conseqüenciais deve o código de exemplo ser usado para fins diferentes de sistema autônomo se destina. |
Para obter exemplos e instruções para instalá-los:
Sobre o Visual Studio Ajuda menu, clicar Exemplos.
Para obter mais informações, consulte Localizando arquivos de exemplo.
A versão mais recente e a lista completa das Exemplos está disponível online a partir de O Visual Studio 2008 Exemplos página.
Você também pode localizar exemplos no disco rígido do seu computador.Por padrão, exemplos e um arquivo Leiame são copiados para uma pasta sob \programa Files\Visual Studio 9.0\Samples\.Para edições Express do Visual Studio, todos os exemplos estão localizados online.
Suplemento do EE API
O avaliador da expressão é a parte do depurador que interpreta (avalia) expressões.Quando você conjunto um ponto de interrupção em uma expressão ou digite uma expressão em uma janela do depurador, o avaliador da expressão interpreta a entrada.Para obter detalhes, consulte Expressões no depurador.Com o API Expression Evaluator suplemento, você pode estender o avaliador da expressão para lidar com novos tipos.
Para estender o avaliador da expressão para um novo tipo, você precisará gravar uma função sistema autônomo parte de uma DLL Win32 (no mesmo diretório sistema autônomo autoexp.dat) e exportá-los pelo nome.Você também precisará adicionar uma linha à autoexp.datarquivo .Você pode estender o avaliador da expressão mais de um tipo pela exportação de várias funções da DLL.
Criando e executando o exemplo
As etapas necessárias para compilação e executar esse exemplo se encaixam em três partes.
Para compilação e executar a amostra
Compilação um avaliador de expressão DLL do suplemento (eeaddin.dll).
edição autoexp.dat para usar o avaliador da expressão DLL do suplemento.
Teste o suplemento, criando um projeto que usa o tipo de dados personalizados avaliado por autoexp.dat.
Os procedimentos a seguir explicam essas etapas na detalhes.
Para criar o avaliador da expressão DLL do suplemento
No Visual Studio, abra a solução eeaddin.sln.
From a Compilação menu, clicar Compilação.
Copie eeaddin.dll resultante para seu diretório common7\ide (o mesmo diretório que contém devenv.exe).
From a Arquivo menu, clicar Fechar solução.
Para edição autoexp.dat
From a Arquivo menu, point to em aberto e clicar Arquivo.
No em em aberto arquivo caixa de diálogo, localize o arquivo autoexp.dat (na pasta common7\packages\debugger) e clicar em aberto.
Edite autoexp.dat para adicionar as seguintes linhas:
_SYSTEMTIME=$ADDIN(eeaddin.dll,AddIn_SystemTime@28) _FILETIME=$ADDIN(eeaddin.dll,AddIn_FileTime@28)
salvar autoexp.dat.
Para criar um projeto que usa os tipos de dados personalizados
From a Arquivo , aponte para New e clicar Projeto.
No Novo projeto caixa de diálogo de do realceProjetos do Visual C++, clicar Aplicativo MFC, digite um nome para o projeto e clicar OK.
No MFC aplicativo assistente, clicar Concluir.O projeto deve ser um aplicativo MFC porque na próxima etapa, você irá adicionar funções do MFC.
No aplicativo MFC, adicione um SYSTEMTIME or FILETIME objeto.
SYSTEMTIME *s = new SYSTEMTIME(); FILETIME *f = new FILETIME(); GetSystemTime(s); SystemTimeToFileTime(s,f);
From a Compilação menu, clicar Compilação.
Iniciar a depuração e examine o seu SYSTEMTIME ou FILETIME objetos na janela Inspeção.
Como funciona o exemplo
Para estender o avaliador da expressão para um tipo de dados personalizado, você pode escrever uma função de visualizador personalizado no avaliador da expressão DLL do suplemento.A função usa um ponteiro para um objeto no espaço de memória do programa que está sendo depurado (não o espaço de memória do avaliador da expressão que estiver estendendo).Não é possível usar projeções normais com esse ponteiro.Você deve ler a ele e os dados que ela aponta para usar uma função de retorno de chamada.Um ponteiro de retorno de chamada do tipo DEBUGHELPER* aponta para um objeto com vários métodos.
A sintaxe tem esta aparência:
HRESULT WINAPI CustomViewer(
DWORD dwAddress, // low 32-bits of address
DEBUGHELPER *pHelper, // callback pointer to access helper functions
int nBase, // decimal or hex
BOOL bIgnore, // not used
char *pResult, // where the result needs to go
size_t max, // how large the above buffer is
DWORD dwReserved // always pass zero
)
O exemplo possui duas implementações desse tipo de função, AddIn_SystemTime e AddIn_FileTime em timeaddin.cpp. The DEBUGHELPER struct (definido em custview.h) consiste em ponteiros de função que podem ajudá-lo a escrever sua extensão. Esse ponteiro é passado para o seu CustomViewer função e você pode usá-lo para chamar as funções do auxiliar.
Você pode obter o tipo de processador com pHelper->GetProcessorType. Há dois métodos para leitura de memória, pHelper->ReadDebuggeeMemory e pHelper->ReadDebuggeeMemoryEx. ReadDebuggeeMemoryEx lida com endereços de 64 bit e é suportado pelo depurador Visual Studio. NET. ReadDebuggeeMemory não controla os endereços de 64 bit e é suportado pelo Visual Studio .NET e Visual C++ 6.0 depuradores. Se o suplemento é projetado para o depurador do Visual Studio .NET apenas, você pode usar ReadDebuggeeMemoryEx. Se o suplemento precisa trabalhar com o Visual C++ 6.0 também, você deve verificar o dwVersion campo e evitar chamada ReadDebuggeeMemoryEx Visual c++ 6.0.
O código a seguir funciona com ambos os depuradores e lê o Sumário de um localobject (cujo tipo é MyType) do programa que está sendo depurado:
DWORDLONG qwRealAddress;
DWORD dwGot;
MyType localobject;
if (pHelper->dwVersion<0x20000)
{
// Visual C++ 6.0 version
qwRealAddress = dwAddress;
pHelper->ReadDebuggeeMemory( pHelper, dwAddress,
sizeof(localobject), &localobject, &dwGot );
}
else
{
qwRealAddress = pHelper->GetRealAddress(pHelper);
pHelper->ReadDebuggeeMemoryEx( pHelper, qwRealAddress,
sizeof(localobject), &localobject, &dwGot );
}
// TODO: display localobject here
Editando autoexp.dat
No [AutoExpand] seção autoexp.dat, as linhas que você irá adicionar ter a seguinte sintaxe:
type=$ADDIN(dllname.dll,exportname)
Por exemplo:
_SYSTEMTIME=$ADDIN(eeaddin.dll,AddIn_SystemTime)
Ou:
_FILETIME=$ADDIN(eeaddin.dll,AddIn_FileTime)
Se a DLL for não no diretório que contém devenv.exe ou no PATH, você deve usar um nome de caminho completo para a DLL.The exportname argument is case sensitive and must exactly match the exported name you got when you ran dumpbin –exports on your DLL.
Para testar o depurador com o suplemento novo, primeiro interrompa a depuração de qualquer programa que você for depurando ao instalar a nova DLL e, em seguida, inicie uma nova sessão do depurador.
Observação: O suplemento é executado dentro do depurador, portanto, se o seu código falhar, você travará o IDE.