Это странно. У меня есть функция класса, в котором есть точка останова, которая ударяется, хотя остальная часть функции не запущена. Количество кода, что потребуется, чтобы воспроизвести это, вероятно, нецелесообразно размещать здесь, но это то, что я вижу:Запуск точки останова в функции, которая не называется
MyClass.h:
enum OptionsEnum { OPTION_1, OPTION_2 };
struct OptionsStruct
{
OptionsEnum options;
int value;
};
class MyClass
{
private:
Initialize(...);
Process(const OptionsStruct&);
OptionsStruct m_Options { };
}
MyClass.cpp:
#include "MyClass.h"
void MyClass::Initialize(...)
{
...do some stuff with local variables... //<--Breakpoint here not triggered
...do some more stuff...
Process(m_Options); //<--Breakpoint here is triggered! How?!
...do yet more stuff... //<--Breakpoint here not triggered
}
void MyClass::Process(const OptionsStruct& options)
{
...do some other stuff... //<--Breakpoint here not triggered
}
Я видел множество сообщений, которые имеют противоположную проблему, когда точка останова, которую они ожидали получить, была оптимизирована и, таким образом, никогда не срабатывала, но я не могу представить, как было бы возможно обратное: для оптимизации, чтобы вызвать точка останова должна быть удалена в середине функции, которая никогда не вызывалась в первую очередь.
Выполнение кода показывает, что он никогда не входит в функцию Initialize()
, но при запуске с контрольными точками он запускает его. Разумеется, я даже отключил оптимизацию и позволял ей работать, и она все еще попадает в эту точку останова. И только эта точка останова. Я поставил точку останова на каждую строку кода в функции, и только один из них попал. Точка останова в Process()
также не срабатывает, хотя она вызывается самой строкой, которая вызывала.
Образец кажется, что попадают только линии, которые имеют переменные-члены в них. И когда они это сделают, если вы нажмете над m_Options
, все поля в структуре являются ненужными (неинициализированными) значениями.
Столбец не полезен - он просто указывает на [External Code]
и ниже этого [Frames below may be incorrect and/or missing...]
Функция закрыта, поэтому я не знаю, как это можно сделать для внешнего кода. Это ошибка в отладчике? Какое-то волшебство оптимизации? Что могло бы сделать что-то подобное?
Убедитесь, что вы скомпилировали проект в режиме DEBUG без оптимизации. Я могу только предположить, что вы скомпилировали его как RELEASE или DEBUG, но с оптимизацией, и компилятор оптимизировал некоторые вещи, делающие процесс отладки, несколько запутанными. –
Сбой компилятора C++ (clxx.exe) при интерпретации строки 'OptionsStruct m_Options {};'. Если я удалю фигурные скобки, все будет работать нормально, и точки останова не будут удалены. Weird. –
@AlexLop. Мы на самом деле делаем обратное - он скомпилирован как RELEASE, но без оптимизации. Существуют другие части кода, которые зависят от того, что он находится в выпуске сборки. Я мог бы попробовать вернуться к просто DEBUG, но это примерно 20-минутный компилятор (база кода довольно велика) при каждом переключении режимов, поэтому я не делаю этого очень часто. –