Como posso depurar violações de acesso ao executar meu programa fora do depurador do Visual Studio?
Set the Just-in-time debugging option and run your program stand-alone until the access violation occurs. Then, in the Access Violation dialog box, you can click Cancel to start the debugger.
Como posso depurar uma violação de acesso do C++?
Se você receber uma violação de acesso em uma linha de código que desreferencia vários ponteiros, pode ser difícil descobrir qual ponteiro causou a violação de acesso. No Visual Studio, a caixa de diálogo de exceção nomeia explicitamente o ponteiro que causou a violação de acesso.
Por exemplo, considerando o código a seguir, você deve obter uma violação de acesso:
#include <iostream>
using namespace std;
class ClassC {
public:
void printHello() {
cout << "hello world";
}
};
class ClassB {
public:
ClassC* C;
ClassB() {
C = new ClassC();
}
};
class ClassA {
public:
ClassB* B;
ClassA() {
// Uncomment to fix
// B = new ClassB();
}
};
int main() {
ClassA* A = new ClassA();
A->B->C->printHello();
}
Se você executar esse código no Visual Studio, deverá ver a seguinte caixa de diálogo de exceção:
Se você não puder determinar por que o ponteiro causou uma violação de acesso, rastreie o código para verificar se o ponteiro que causa o problema foi atribuído corretamente. If it is passed as a parameter, make sure that it is passed correctly, and you aren't accidentally creating a shallow copy. Em seguida, verifique se os valores não estão sendo alterados involuntariamente em algum lugar do programa criando um Ponto de Interrupção de Dados para o ponteiro em questão para verificar se ele não está sendo modificado em outro lugar no programa. For more information about data breakpoints, see the data breakpoint section in Using Breakpoints.
Como posso descobrir se meus ponteiros corrompem um endereço de memória?
Verifique se há corrupção no heap. A maior parte da corrupção de memória é devido à corrupção do heap. Tente usar o Utilitário de Sinalizadores Globais (gflags.exe) ou pageheap.exe. Consulte GFlags e PageHeap.
Para localizar onde o endereço de memória é modificado:
Defina um ponto de interrupção de dados em 0x00408000. Consulte Definir um ponto de interrupção de alteração de dados (somente C++ nativo).
When you hit the breakpoint, use the Memory window to view memory contents starting at 0x00408000. For more information, see Memory Windows.
Como posso descobrir quem está passando um valor de parâmetro errado?
Para resolver esse problema:
Defina um ponto de interrupção de local no início da função.
Right-click the breakpoint and select Condition.
In the Breakpoint Condition dialog box, click on the Condition check box. See Advanced Breakpoints.
Insira uma expressão, como
Var==3, na caixa de texto, ondeVarestá o nome do parâmetro que contém o valor incorreto e3é o valor incorreto passado para ele.Select the is True radio button, and click the OK button.
Agora execute o programa novamente. O ponto de interrupção faz com que o programa pare no início da função quando o
Varparâmetro tiver o valor3.Use a janela Pilha de Chamadas para localizar a função de chamada e navegar até seu código-fonte. Para obter mais informações, consulte Como usar a janela Pilha de Chamadas.
Ao chamar uma função centenas de vezes, como saber qual chamada falhou?
Exemplo: meu programa falha em uma chamada para uma determinada função. CnvtV O programa provavelmente chama essa função algumas centenas de vezes antes de falhar. Se eu definir um ponto de interrupção de CnvtVlocalização, o programa será interrompido em cada chamada para essa função e eu não quero isso. Não sei quais condições fazem com que a chamada falhe, portanto, não posso definir um ponto de interrupção condicional. O que posso fazer?
You can set a breakpoint on the function with the Hit Count field to a value so high that it will never be reached. In this case, because you believe the function CnvtV is called a couple hundred times, you might set Hit Count to 1000 or more. Em seguida, execute o programa e aguarde a chamada falhar. Quando falhar, abra a janela Pontos de Interrupção e examine a lista de pontos de interrupção. O ponto de interrupção em CnvtV que você definiu é exibido, seguido pela contagem de ocorrências e pelo número de iterações restantes:
CnvtV(int) (no condition) when hit count is equal to 1000 (currently 101)
Agora você sabe que a função falhou na 101ª chamada. Se você redefinir o ponto de interrupção com uma contagem de ocorrências de 101 e executar o programa novamente, o programa será interrompido na chamada que CnvtV causou falha.
Onde posso procurar códigos de erro do Win32?
WINERROR.H in the INCLUDE directory of your default system installation contains the error code definitions for the Win32 API functions.
You can look up an error code by typing the code in the Watch window or the QuickWatch dialog box. For example:
0x80000004,hr
Como posso manter o foco ao percorrer meu aplicativo?
Exemplo: meu programa tem um problema de ativação de janela. Percorrer o programa com o depurador interfere na minha capacidade de reproduzir o problema porque meu programa continua perdendo o foco. Há alguma maneira de evitar perder o foco?
Se você tiver um segundo computador, use a depuração remota. Você pode operar seu programa no computador remoto enquanto executa o depurador no host. Para obter mais informações, consulte Como selecionar um computador remoto.
Como posso depurar funções da API do Windows?
Para definir um ponto de interrupção em uma função de API do Windows com símbolos NT carregados:
In the function breakpoint, enter the function name together with the name of the DLL where the function resides (see the context operator). No código de 32 bits, use a forma decorada do nome da função. To set a breakpoint on MessageBeep, for example, you must enter the following.
{,,USER32.DLL}_MessageBeep@4Para obter o nome decorado, consulte Exibindo nomes decorados.
Você pode testar o nome decorado e exibi-lo no código de desmontagem. Enquanto pausa na função no depurador do Visual Studio, clique com o botão direito do mouse na função no editor de código ou na janela pilha de chamadas e escolha Ir para Desmontagem.
No código de 64 bits, você pode usar o nome não corrigido.
{,,USER32.DLL}MessageBeep
Next steps
Você pode saber mais sobre a depuração de código nativo no Visual Studio usando estes links: