Как добавить условную точку останова в Visual C ++

Я хочу добавить условие точки останова в свой код в 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, но проект не был импортирован чисто. Из-за сложности проекта и моих текущих временных масштабов я не могу рассматривать обновление как решение на данный момент.


person seanhodges    schedule 18.03.2009    source источник


Ответы (3)


используйте 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);
}
person Stormenet    schedule 18.03.2009

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

test_list.Length() > 0  

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

test_list.m_nLength > 0

(или какова бы ни была ваша частная длина var).

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

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

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

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

person Ofek Shilon    schedule 11.04.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, и все будет в порядке.

person Aamir    schedule 18.03.2009