Как выполнить отладку нарушений доступа при запуске программы за пределами отладчика 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.
Как выполнить отладку нарушения доступа C++?
Если вы получаете нарушение доступа в строке кода, который разыменовывает несколько указателей, может быть трудно выяснить, какой указатель вызвал нарушение доступа. В Visual Studio диалоговое окно исключения явно присваивает имя указателю, вызвавшем нарушение доступа.
Например, учитывая следующий код, необходимо получить нарушение доступа:
#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();
}
Если вы запускаете этот код в Visual Studio, вы увидите следующее диалоговое окно исключения:
Если невозможно определить, почему указатель вызвал нарушение доступа, выполните трассировку по коду, чтобы убедиться, что указатель, вызывающий проблему, был назначен правильно. If it is passed as a parameter, make sure that it is passed correctly, and you aren't accidentally creating a shallow copy. Затем убедитесь, что значения не изменяются непреднамеренно в программе, создав точку останова данных для указателя, чтобы убедиться, что она не изменяется в другом месте программы. For more information about data breakpoints, see the data breakpoint section in Using Breakpoints.
Как узнать, поврежден ли указатель на адрес памяти?
Проверьте наличие повреждения кучи. Большая часть повреждения памяти связана с повреждением кучи. Попробуйте использовать программу глобальных флагов (gflags.exe) или pageheap.exe. См. раздел GFlags и PageHeap.
Чтобы найти расположение адреса памяти, выполните следующие действия.
Задайте точку останова данных в 0x00408000. См. раздел "Установка точки останова изменений данных" (только для машинного языка C++).
When you hit the breakpoint, use the Memory window to view memory contents starting at 0x00408000. For more information, see Memory Windows.
Как узнать, кто передает неправильное значение параметра?
Для решения этой проблемы сделайте следующее:
Задайте точку останова расположения в начале функции.
Right-click the breakpoint and select Condition.
In the Breakpoint Condition dialog box, click on the Condition check box. See Advanced Breakpoints.
Введите выражение, например
Var==3
, в текстовое поле, гдеVar
имя параметра, содержащего плохое значение, и3
является плохим значением, переданным в него.Select the is True radio button, and click the OK button.
Теперь снова запустите программу. Точка останова приводит к остановке программы в начале функции, когда
Var
параметр имеет значение3
.Используйте окно стека вызовов, чтобы найти вызывающую функцию и перейти к исходному коду. Дополнительные сведения см. в разделе "Практическое руководство. Использование окна стека вызовов".
При вызове функции сотни раз, как узнать, какой вызов произошел сбой?
Пример. Моя программа завершается сбоем при вызове определенной функции. CnvtV
Программа, вероятно, вызывает функцию пару сотен раз, прежде чем она завершается ошибкой. Если установить точку CnvtV
останова расположения, программа останавливается на каждом вызове этой функции, и я не хочу этого. Я не знаю, какие условия вызывают сбой, поэтому я не могу задать условную точку останова. Что я могу сделать?
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. Затем запустите программу и дождитесь сбоя вызова. При сбое откройте окно точек останова и просмотрите список точек останова. Появляется точка CnvtV
останова, за которой следует число итераций, а также количество оставшихся итераций:
CnvtV(int) (no condition) when hit count is equal to 1000 (currently 101)
Теперь вы знаете, что функция завершилась сбоем при вызове 101-го. Если вы сбросите точку останова с числом попаданий 101 и снова запустите программу, программа останавливается при вызове CnvtV
, что привело к сбою.
Где можно найти коды ошибок 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
Как сосредоточиться при пошаговом переходе по моему приложению?
Пример. У моей программы возникла проблема с активацией окна. Пошаговое выполнение программы с отладчиком мешает моей способности воспроизвести проблему, так как моя программа теряет фокус. Есть ли какой-либо способ избежать потери фокуса?
Если у вас есть второй компьютер, используйте удаленную отладку. Вы можете работать с программой на удаленном компьютере при запуске отладчика на узле. Дополнительные сведения см. в разделе "Практическое руководство. Выбор удаленного компьютера".
Как выполнить отладку функций API Windows?
Чтобы задать точку останова в функции API Windows с загруженными символами NT:
In the function breakpoint, enter the function name together with the name of the DLL where the function resides (see the context operator). В 32-разрядном коде используйте декорированную форму имени функции. To set a breakpoint on MessageBeep, for example, you must enter the following.
{,,USER32.DLL}_MessageBeep@4
Чтобы получить украшенное имя, см. раздел "Просмотр украшенных имен".
Вы можете протестировать украшенное имя и просмотреть его в коде дизассембли. При приостановке работы функции в отладчике Visual Studio щелкните правой кнопкой мыши функцию в редакторе кода или окне стека вызовов и выберите "Перейти к дизассембли".
В 64-разрядном коде можно использовать неоценированное имя.
{,,USER32.DLL}MessageBeep
Next steps
Дополнительные сведения об отладке машинного кода в Visual Studio см. по следующим ссылкам: