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.
Depurar uma aplicação é mais fácil se puder analisar o código fonte, em vez dos binários desmontados.
WinDbg, CDB e KD podem usar o código-fonte na depuração, se a linguagem de origem for C, C++ ou assembly.
Requisitos de compilação
Para usar a depuração de código-fonte, você deve fazer com que seu compilador ou vinculador crie arquivos de símbolo (arquivos .pdb) quando os binários forem criados. Esses arquivos de símbolo mostram ao depurador como as instruções binárias correspondem às linhas de origem.
Além disso, o depurador deve ser capaz de acessar os arquivos de origem reais, porque os arquivos de símbolo não contêm o texto de origem real.
Se for possível, o compilador e o vinculador não devem otimizar seu código. A depuração de origem e o acesso a variáveis locais são mais difíceis e, às vezes, quase impossíveis, se o código tiver sido otimizado. Se você estiver usando o utilitário Build como seu compilador e vinculador, defina a macro MSC_OPTIMIZATION como /Od /Oi para evitar otimização.
Localizando os arquivos de símbolo e os arquivos de origem
Para depurar no modo de origem, o depurador deve ser capaz de encontrar os arquivos de origem e os arquivos de símbolo. Para obter mais informações, consulte caminho de origem.
Iniciando a depuração do código-fonte
O depurador pode exibir informações de origem sempre que tiver símbolos apropriados e arquivos de origem para o thread que está sendo depurado no momento.
Se você iniciar um novo aplicativo de modo de usuário usando o depurador, a interrupção inicial ocorrerá quando Ntdll.dll carregar o aplicativo. Como o depurador não tem acesso aos arquivos de origem Ntdll.dll, você não pode acessar as informações de origem do seu aplicativo neste momento.
Para mover o contador do programa para o início do aplicativo, adicione um ponto de interrupção no ponto de entrada ao seu binário. Na janela Comando do Depurador, digite o seguinte comando.
bp main
g
O aplicativo é então carregado e para quando a função principal é inserida. (Claro, você pode usar qualquer ponto de entrada, não apenas principal.)
Se o aplicativo lançar uma exceção, ele entra no depurador. As fontes de informação estão disponíveis neste momento. No entanto, se você emitir uma interrupção usando CTRL+C, CTRL+BREAK ou Debug | Comando Break, o depurador cria um novo thread, para que você não possa ver seu código-fonte.
Depois de chegar a um thread para o qual você tem arquivos de origem, você pode usar a janela Comando do Depurador para executar comandos de depuração de origem. Se você estiver usando WinDbg, a janela Source será exibida. Se já tiver aberto uma janela de Código-fonte clicando em Abrir Arquivo de Origem no menu Arquivo, o WinDbg normalmente criará uma nova janela para o código-fonte. Você pode fechar a janela anterior sem afetar o processo de depuração.
Depuração de código-fonte na GUI do WinDbg
Se você estiver usando WinDbg, uma janela Source aparecerá assim que o contador do programa estiver no código para o qual o depurador tem informações de origem.
WinDbg exibe uma janela de origem para cada arquivo de origem que você ou WinDbg abriu. Para obter mais informações sobre as propriedades de texto desta janela, consulte Windows de origem.
Em seguida, pode percorrer a sua aplicação ou executar até um ponto de paragem ou até ao cursor. Para obter mais informações sobre comandos de passo a passo e rastreamento, consulte Controlar o Alvo.
Se estiveres no modo de origem, a janela de origem apropriada será movida para o primeiro plano à medida que vais percorrendo a tua aplicação. Como também há rotinas do Microsoft Windows que são chamadas durante a execução do aplicativo, o depurador pode mover uma janela Desmontagem para o primeiro plano quando esse tipo de chamada ocorre (porque o depurador não tem acesso à origem para essas funções). Quando o contador do programa retorna aos arquivos de origem conhecidos, a janela Source apropriada torna-se ativa.
À medida que você se move pelo aplicativo, o WinDbg destaca sua localização na janela Origem e na janela Desmontagem. As linhas nas quais os pontos de interrupção são definidos também são realçadas. O código-fonte é colorido de acordo com a análise da linguagem. Se a janela Origem tiver sido selecionada, você poderá passar o mouse sobre um símbolo para avaliá-lo. Para obter mais informações sobre esses recursos e como controlá-los, consulte Windows de origem.
Para ativar o modo de origem no WinDbg, use o comando l+t , clique em modo de origem no menu de depuração ou clique no botão modo de origem em . Quando o modo de origem está ativo, o indicador ASM aparece indisponível na barra de status.
Você pode exibir ou alterar os valores de quaisquer variáveis locais à medida que percorre uma função no modo de origem. Para obter mais informações, consulte Memória de leitura e gravação.
Depuração de origem na janela de comando do depurador
Se você estiver usando CDB, você não tem uma janela de origem separada. No entanto, você ainda pode ver seu progresso à medida que percorre a fonte.
Antes de poderes fazer a depuração de código-fonte no CDB, precisas carregar símbolos de linha de origem emitindo o comando .lines (Toggle Source Line Support) ou iniciar o depurador com a opção de linha de comandos -lines.
Se você executar um comando l+t, toda a execução do programa será realizada uma linha de código de cada vez. Use l-t para executar uma instrução de montagem de cada vez. Se você estiver usando o WinDbg, esse comando terá o mesmo efeito que selecionar ou limpar o Modo de origem no menu Depurar ou usar os botões da barra de ferramentas.
O comando l+s exibe a linha de origem atual e o número da linha no prompt. Se quiser ver apenas o número da linha, use l+l .
Se você usar l+o e l+s, somente a linha de origem será exibida enquanto você percorre o programa. O contador do programa, o código de desmontagem e as informações de registro estão ocultos. Esse tipo de exibição permite que você percorra rapidamente o código e visualize nada além da fonte.
Você pode usar o comando lsp (set Number of Source Lines) para especificar exatamente quantas linhas de origem são exibidas quando você percorre ou executa o aplicativo.
A sequência de comandos a seguir é uma maneira eficaz de percorrer um arquivo de origem.
.lines enable source line information
bp main set initial breakpoint
l+t stepping will be done by source line
l+s source lines will be displayed at prompt
g run program until "main" is entered
pr execute one source line, and toggle register display off
p execute one source line
Como ENTER repete o último comando, agora você pode percorrer o aplicativo usando a tecla ENTER. Cada etapa faz com que a linha de origem, o deslocamento de memória e o código de assembly apareçam.
Para obter mais informações sobre como interpretar a exibição de desmontagem, consulte Depurando no modo de montagem.
Quando o código de montagem é exibido, qualquer local de memória que está sendo acessado é exibido na extremidade direita da linha. Você pode usar os comandos d* (Display Memory) e e* (Enter Values) para exibir ou alterar os valores nesses locais.
Se você tiver que visualizar cada instrução de montagem para determinar deslocamentos ou informações de memória, use l-t para instruções de montagem passo a passo em vez de linhas de origem. As informações da linha de origem ainda podem ser exibidas. Cada linha de origem corresponde a uma ou mais instruções de montagem.
Todos esses comandos estão disponíveis no WinDbg e no CDB. Você pode usar os comandos para exibir informações da linha de origem da Janela de Comandos do Depurador do WinDbg em vez da Janela de Origem.
Linhas de origem e deslocamentos
Você também pode executar a depuração de origem usando o avaliador de expressão para determinar o deslocamento que corresponde a uma linha de origem específica.
O comando a seguir mostra um deslocamento de memória.
? `[[module!]filename][:linenumber]`
Se você omitir o nome do arquivo, o depurador procurará o arquivo de origem que corresponde ao contador do programa atual.
O depurador lê linenumber como um número decimal, a menos que você adicione 0x antes dele, independentemente do radix padrão atual. Se omitir o número de linha, a expressão será avaliada como o endereço inicial do ficheiro executável relativo ao ficheiro de origem.
Essa sintaxe só será compreendida em CDB se o comando .lines ou a opção de linha de comando -lines tiver carregado símbolos de linha de origem.
Esta técnica é muito versátil, porque você pode usá-lo independentemente de onde o contador do programa está apontando. Por exemplo, essa técnica permite que você defina pontos de interrupção com antecedência, usando comandos como os seguintes.
bp `source.c:31`
Para obter mais informações, consulte Sintaxe da linha de origem e Usando pontos de interrupção.
Revisão e rastreamento no modo de origem
Quando você está depurando no modo de origem, pode haver várias chamadas de função em uma única linha de origem. Não é possível usar os comandos p e t para separar essas chamadas de função.
Por exemplo, no comando a seguir, o comando t entra em GetTickCount e printf, enquanto o comando p passa por ambas as chamadas de função.
printf( "%x\n", GetTickCount() );
Se pretender passar por cima de determinadas chamadas enquanto executa outras, use .step_filter (Definir Filtro de Etapa) para indicar quais chamadas deve saltar.
Você pode usar _step_filter para filtrar funções de estrutura (por exemplo, chamadas Microsoft Foundation Classes (MFC) ou Ative Template Library (ATL)).