2013-03-02 3 views
1

Это код:В Visual Studio 2010 не суммируются раскручивание в режиме отладки

#include <iostream> 

void f() { 
    throw 1; 
    std::cout << "f(): should not be printed!!\n"; 
    std::cout << "f(): not should this!!\n"; 
} 

int main(int, const char**) { 
    f(); 
    std::cout << "main(): This not be printed!!\n"; 
    return 0; 
} 

При запуске в качестве консольного приложения в режиме отладки и в отладчике нет стеки размотки и заявление COUT получить печатное ?

+0

попробуйте использовать пространство имен std, а не все std ::, мне трудно понять, в чем вопрос? – Gilad

+3

@ Андроид: Это плохая идея и не имеет ничего общего с вопросом. –

+0

@MikeSeymour это был комментарий, и почему это плохая идея? – Gilad

ответ

4

Это технически возможно, если вы работаете с отладчиком. Вы не рассказали всю историю. Отладчик сначала отобразит диалог, когда будет выбрано исключение. Он похож на это (шахта VS2012 на Windows 8):

enter image description here

Если нажать кнопку Разорвать, то отладчик будет перерыв в заявлении броска, давая вам возможность инспектировать состояние. Когда вы нажимаете кнопку «Продолжить», то исключение игнорируется, и программа будет продолжаться, как будто ничего не произошло. Это также происходит, когда вы ломаетесь, а затем возобновляете работу.

Это функция, а не ошибка, это позволяет вам спасти отладочную сессию, на которой вы уже потратили много времени. Конечно, не всегда полезно продолжать, так как ваша программа, вероятно, находится в плохом состоянии, но альтернатива тоже невелика. Вы почти всегда хотите одобрить нажатие Break и использовать отладчик для исправления состояния, чтобы вы могли осмысленно продолжить отладку.

Конечно, это не произойдет без отладчика, ваша программа мгновенно завершится.

Единственный возможный способ, с помощью которого происходит раскручивание стека, заключается в том, что выписывает исключение catch. Независимо от того, отлаживаетесь вы или нет.

+0

@Passat Все это очень хорошо, но программа должна делать это в режиме отладки или нет, что говорит код. Бросок не означает перенос на следующую строку исполнения. Когда я отлаживаю, как сообщить отладчику, чтобы он не перешел к следующей строке выполнения? Это просто безумие! Я пишу программу, чтобы что-то сделать, и отладчик решает сделать что-то еще. –

+0

@Passant Я не хочу писать try-catch - так как мне отлаживать, когда код вызывается кодом? –

+0

Ну, это своего рода чушь. Это похоже на дровосека, жалующегося на то, что его бензопила слишком быстро режет дерево. У вас есть электроинструмент в вашем распоряжении, узнайте, как его использовать, чтобы он не отрезал ногу. –

0

Ключ в ответе на мой собственный вопрос заключается в ответе на другой вопрос: сразу после того, как исключение бросается, в какой момент начинается разворот стека? Под удалением стека подразумевается вызов в обратном порядке деструкторов всех автоматических объектов, которые все еще существуют. Ответ: в точке управление передается обработчику исключений, то есть исключение попадает. Если исключение не обнаружено, механизм исключения C++ указывает, что функция terminate должна быть вызвана, и это по умолчанию вызывает abort(). Этот механизм можно увидеть в действии с помощью следующего кода:

struct X { 
    ~X() { std::cout << "~X !!\n"; } 
}; 

int main(int, const char**) { 
    X x; 
    throw 1; 
    return 0; 
} 

После броска, деструктор X никогда не вызывается, поскольку обработчик не исключение получил контроль и поэтому программа будет прервана. Возвращаясь к первоначальному вопросу, когда вы отлаживаете сборку отладки и во время выполнения программы, генерируется исключение, когда вокруг него нет подходящего блока try-catch, отладчик MS Studio разбивается на точку бросания и представляет вам диалоговое окно, показанное выше, и предоставляет вам возможность «продолжить». Продолжить следует интерпретировать не как «продолжать с механизмом исключения», а как «нести, как будто ничего не произошло», то есть со следующей строкой кода после броска.

Смежные вопросы