Отладка вызывает исключения? - PullRequest
0 голосов
/ 18 октября 2008

Я получал неверные данные из приложения, которое писал с использованием C ++ в Visual Studio 2k3, поэтому я решил отладить его. Потом я обнаружил, что это исключение, которое я не могу отследить.

Затем я разместил несколько блоков try / catch и low, и вот, когда я не отлаживаю, нет исключения. То есть у меня есть код, который выглядит так:

std::vector<MyClass*> ListOfStuff; . . . try { . . . const MyClass * localPointer = ListOfStuff[i]; //This is where the exception occurs . . } catch (...) { int x = 0; //place break here } Так что, если я буду шаг за шагом проходить через код, я получу исключение и получу улов. Но если я просто позволю ему работать с точкой останова внутри catch, ничего не произойдет. Использование итератора имеет такое же поведение. И я могу успешно проверить размер вектора, чтобы я знал, что я в пределах.
Кто-нибудь может сказать мне, что происходит? Если это имеет значение, я использую некоторые стандартные библиотеки Windows и openGL.

Ответы [ 5 ]

2 голосов
/ 18 октября 2008

Вы можете попробовать разместить

DebugBreak();

вызов в предложении catch. Если приложение работает в отладчике, оно должно получить контроль. Если он не работает в отладчике, вы должны получить возможность подключить отладчик «Just in Time» (обычно это Visual Studio, если он у вас установлен).

1 голос
/ 18 октября 2008

Я имею в виду VS2005, но это должно быть применимо в вашем случае. Если вы обращаетесь к элементу меню IDE Debug > Exceptions .. , вы можете указать типы исключений, которые должен вызывать отладчик IDE при throw , что должно привести к см. строку, в которой было вызвано исключение при однократном пошаговом выполнении приложения.

Возможно, вам придется поэкспериментировать с типами, которые нужно поймать (некоторые исключения 1-го шанса на самом деле не являются проблемами), но это поможет определить точку, в которой возникло исключение.

1 голос
/ 18 октября 2008

Является ли исключение ASSERT? Они могут быть скомпилированы во время компиляции или иным образом вызвать утверждение.

Например, вы могли бы иметь

#ifdef DEBUG
#define ASSERT(cond) if (cond) throw CDebugAssertionObj;
#else
#define ASSERT(cond)
#endif
0 голосов
/ 18 октября 2008

Является ли этот код частью метода класса, и является ли ListOfStuff членом класса? Если это так, убедитесь, что указатель this действителен.

0 голосов
/ 18 октября 2008

Если вы используете хорошую IDE, которая допускает условные точки останова (такие как «break here if i == 5»), то, возможно, само условие вызывает исключение.

Если бы это было какое-то время ... у меня заболела голова, когда я его нашел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...