Partilhar via


Perguntas frequentes sobre depuração de código nativo

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 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, dado 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, você verá a seguinte caixa de diálogo de exceção:

Captura de tela de uma caixa de diálogo de exceção do Microsoft Visual Studio, mostrando uma violação de acesso de leitura para 'A-B> was nullptr'. O botão Quebrar está selecionado.

Se você não puder determinar por que o ponteiro causou uma violação de acesso, rastreie o código para certificar-se de que o ponteiro que causou 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 garantir que ele não esteja sendo modificado em outro lugar do 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 de pilha. A maior parte da corrupção de memória é devido à corrupção de pilha. Tente usar o Global Flags Utility (gflags.exe) ou pageheap.exe. Consulte GFlags e PageHeap.

Para encontrar onde o endereço de memória é modificado:

  1. 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).

  2. 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:

  1. Defina um ponto de interrupção de local no início da função.

  2. Right-click the breakpoint and select Condition.

  3. In the Breakpoint Condition dialog box, click on the Condition check box. See Advanced Breakpoints.

  4. Insira uma expressão, como Var==3, na caixa de texto, onde Var é o nome do parâmetro que contém o valor incorreto e 3 é o valor incorreto passado para ele.

  5. Select the is True radio button, and click the OK button.

  6. Agora execute o programa novamente. O ponto de interrupção faz com que o programa pare no início da função quando o Var parâmetro tem o valor 3.

  7. Use a janela Pilha de chamadas para localizar a função de chamada e navegue até seu código-fonte. Para obter mais informações, consulte Como usar a janela da pilha de chamadas.

Ao chamar uma função centenas de vezes, como posso 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 localização no CnvtV, o programa para em todas as chamadas para essa função, e eu não quero isso. Não sei que condições fazem com que a chamada falhe, por isso não posso definir um ponto de interrupção condicional. Que posso eu 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 veja a lista de pontos de interrupção. O ponto de interrupção definido é CnvtV 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 chamada 101. Se você redefinir o ponto de interrupção com uma contagem de acertos de 101 e executar o programa novamente, o programa para na chamada para CnvtV que causou a falha.

Onde posso procurar códigos de erro 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 a minha aplicação?

Exemplo: Meu programa tem um problema de ativação de janela. Percorrer o programa com o depurador interfere com a minha capacidade de reproduzir o problema porque o meu programa continua a perder o foco. Existe 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@4
    

    Para obter o nome decorado, consulte Exibindo nomes decorados.

    Você pode testar o nome decorado e visualizá-lo no código de desmontagem. Enquanto pausado 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 da pilha de chamadas e escolha Ir para desmontagem.

  • No código de 64 bits, você pode usar o nome não decorado.

    {,,USER32.DLL}MessageBeep
    

Next steps

Você pode saber mais sobre depuração de código nativo no Visual Studio usando estes links: