Как добавить условную точку останова в Visual C ++ - PullRequest
5 голосов
/ 18 марта 2009

Я хочу добавить условие точки останова в мой код в VC ++ Express 2005, чтобы точка останова срабатывала только в том случае, если локальная переменная соответствует заданным критериям. например,

bool my_test(UIDList test_list) {
    foo(test_list);
    bar(test_list); // I have a breakpoint here, but only want it to trigger if test_list.Length() > 0
    print(test_list);
}

Щелкнув правой кнопкой мыши по моей точке останова и выбрав «Условие ...», я обнаружил диалоговое окно, которое, кажется, выполняет то, что я хочу, однако все, что я пытаюсь ввести в текстовое поле, приводит к следующей ошибке:

Невозможно оценить точку останова. условие: CX0052: ошибка: участник функция отсутствует

Я попробовал справочную документацию, но не смог найти ответ. Я надеюсь, что кто-то, имеющий опыт работы с VC ++, сможет указать мне правильное направление ...

Ранее я пытался перейти на более новую версию VC ++ Express, но проект не был импортирован корректно. Из-за сложности проекта и моих текущих временных масштабов я не могу рассматривать модернизацию как решение в данный момент.

Ответы [ 3 ]

10 голосов
/ 11 апреля 2009

VS имеет несколько механизмов микрооценки - в переменных окнах наблюдения, непосредственном окне, условиях точки останова и т. Д. Я никогда не мог найти приличную документацию по ним. Насколько я могу судить, они требовательны к методам, которые они готовы вызывать, , но они также нечувствительны к ограничениям доступа.
Таким образом, вы, вероятно, можете перефразировать ваше состояние с

test_list.Length() > 0  

к чему-то вроде

test_list.m_nLength > 0

(или какова ваша личная длина var).

(РЕДАКТИРОВАТЬ) Только что нашел эта страница MSDN , объясняющая, какие выражения может и не может отладчик обрабатывать. Итак, во-первых, действительно -

'Отладчик может получить доступ ко всем классам участники независимо от контроля доступа. Вы можете изучить любой объект класса член, включая базовые классы и встроенные объекты-члены. '

И, во-вторых, мое предположение о невозможности оценить 'Length ()' - вероятно, оно было встроено:

'Выражение отладчика не может вызвать встроенная или встроенная функция, если функция появляется хотя бы один раз как нормальная функция. '

8 голосов
/ 18 марта 2009

использовать DebugBreak (); Функция:

bool my_test(UIDList test_list) {
    foo(test_list);
    if (bar(test_list) /* or whatever check :) */) // I have a breakpoint here, but only want it to trigger if test_list.Length() > 0
        DebugBreak();
    }
    print(test_list);
}

Или вы всегда можете использовать assert (выражение)

bool my_test(UIDList test_list) {
    foo(test_list);
    bar(test_list);
    assert(test_list.Length() > 0); // will break here
    print(test_list);
}
4 голосов
/ 18 марта 2009

Условия в точке останова не могут вызывать методы, насколько я знаю. Итак, что вам нужно сделать, это рассчитать длину перед рукой. Как то так.


bool my_test(UIDList test_list) {
 foo(test_list);
 int i = test_list.Length();
 bar(test_list); // I have a breakpoint here, but only want it to trigger if test_list.Length() > 0
 print(test_list);
}

Поставьте условную точку останова на значение i здесь, и все будет в порядке.

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