2015-08-18 3 views
1

Это странно. У меня есть функция класса, в котором есть точка останова, которая ударяется, хотя остальная часть функции не запущена. Количество кода, что потребуется, чтобы воспроизвести это, вероятно, нецелесообразно размещать здесь, но это то, что я вижу:Запуск точки останова в функции, которая не называется

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...] Функция закрыта, поэтому я не знаю, как это можно сделать для внешнего кода. Это ошибка в отладчике? Какое-то волшебство оптимизации? Что могло бы сделать что-то подобное?

+3

Убедитесь, что вы скомпилировали проект в режиме DEBUG без оптимизации. Я могу только предположить, что вы скомпилировали его как RELEASE или DEBUG, но с оптимизацией, и компилятор оптимизировал некоторые вещи, делающие процесс отладки, несколько запутанными. –

+0

Сбой компилятора C++ (clxx.exe) при интерпретации строки 'OptionsStruct m_Options {};'. Если я удалю фигурные скобки, все будет работать нормально, и точки останова не будут удалены. Weird. –

+0

@AlexLop. Мы на самом деле делаем обратное - он скомпилирован как RELEASE, но без оптимизации. Существуют другие части кода, которые зависят от того, что он находится в выпуске сборки. Я мог бы попробовать вернуться к просто DEBUG, но это примерно 20-минутный компилятор (база кода довольно велика) при каждом переключении режимов, поэтому я не делаю этого очень часто. –

ответ

0

Повреждение памяти может вызвать проблемы. Возможно, где-то в вашем коде есть поврежденный указатель, и это может быть побочным эффектом его использования. Это частично объясняет, почему вы не можете получить стоп-код. Просто, чтобы быть уверенным ... Является ли точка останова в том же исходном коде, который вы запускаете? Можно отлаживать, даже если код отличается от скомпилированной версии. Это сделает бесполезные точки останова.

+0

Да, это точно такой же код. Я сделал полную очистку/восстановление, чтобы быть уверенным, что я не получаю устаревшего кода. –

+0

Вы пытались поставить контрольные точки в других местах программы, чтобы локализовать, какая часть кода вызывает проблему? Если проблема не возникает, когда вы выполняете выполнение упражнения, возможно, проблема связана с параллелизмом. – Estiny

+0

Я поставил точку останова в каждом call-центре, где вызывается 'Initialize()', и ни один из них не попадает перед триггерами точки останова. Некоторые из них запускаются позже, но это ожидаемое поведение. Это просто странно, что эта одна строка в середине функции попадает перед любой другой частью функции или любой другой функцией, которая ее называет ... –

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