2009-03-31 9 views
3

Я использую C# с библиотекой XNA, и я получаю NaNs, возникающие в объектах Vector3. Есть ли способ проникнуть в отладчик, когда происходит оскорбительный расчет (например, деление на ноль)? В настоящее время программа продолжает работать. Я использую VS2008 Professional. Все исключения в диалоговом окне «Исключения» выбираются в столбце «пользовательский необработанный».Перерыв на C# отладчик для деления на ноль

Редактировать: Чтобы уточнить, я не могу решить, где плохой расчет. Вот почему я хочу, чтобы отладчик автоматически разбивался. Установка контрольных точек не является решением.

ответ

4

во-первых, разделив двойной/поплавок на ноль дает бесконечность/бесконечность в зависимости от того, является ли двойной положительным или отрицательным. Только нулевой double/float, деленный на ноль, дает NaN. В любом случае исключение не будет выбрано.

Вы должны иметь возможность использовать условные точки останова, чтобы определить, когда определенная переменная устанавливается на одно из этих значений. Будьте осторожны при проверке NaN, хотя, как NaN! = NaN.

double a = double.NaN; 
Console.Out.WriteLine(a == double.NaN); // false 
Console.Out.WriteLine(a == a); // false 
Console.Out.WriteLine(double.IsNaN(a)); // true 
+0

Насколько я могу судить, условные точки останова оцениваются в определенной строке источника. Это правильно? Проблема в том, что я понятия не имею, откуда происходит NaN, поэтому я просто хотел, чтобы отладчик остановился, когда это произойдет. –

+0

Да, вы должны установить точку останова на строке кода. Тем не менее, вы должны уметь оттачивать исходный код, добавляя контрольные точки и повторяя код. Первоначально я думал, что ключевое слово 'checked' поможет, но в моих тестах это не так. –

+0

Да, похоже, что спецификация с плавающей запятой IEEE. не предусматривает никаких исключений для этой ситуации. Похоже, мне придется найти это с трудом. Благодарю. –

4

Похоже, что вы каким-то образом обрабатываете исключение (например, вы получаете общее исключение). Что вы можете сделать, это нажать Ctrl + alt + E, чтобы открыть диалог с исключениями - убедитесь, что вы установите флажок «когда выбрано» за исключением (ы) вы заинтересованы в

+0

Никакой другой. Он просто продолжает работать. –

+0

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

+0

Ну, может быть, это не бросается. Хотелось бы. Поскольку вычисление почти наверняка входит в функции члена Vector3 библиотеки XNA, у меня нет контроля над тем, исключает ли он исключения. Я бы ожидал, что «когда его бросят», чтобы работать там. –

3

вы можете установить conditional breakpoint, что только разрушает, когда делитель выражения равен 0.

1

Я знаю, что это старый пост, но .....

из опыта его почти всегда Vector3.Normalize, что я использую по ошибке.

Когда я не уверен, будет ли это нулевой длины я теперь всегда делать

поплавок L = V.Length(); if (L! = 0.0) V/= L;

Деление на ноль в Normalize должно давать исключение, но это не так. Вызвал мне много царапин на голове.