Почему Visual C ++ не достигает точки останова или не выполняет определенные функции? - PullRequest
4 голосов
/ 19 ноября 2008

У меня есть следующее:

classA::FuncA()
{
 ... code
   FuncB();
 ... code
}

classA::FuncB(const char *pText)
{
    SelectObject(m_hDC, GetStockObject (  SYSTEM_FONT)); 
    wglUseFontBitmaps(m_hDC, 0, 255, 1000); 
    glListBase(1000); 
    glCallLists(static_cast<GLsizei>(strlen(pText)), GL_UNSIGNED_BYTE, pText); 
}

Я могу поразить точки останова в любом месте FuncA. Если я пытаюсь войти в FuncB, он переходит. Он будет принимать точку останова в FuncB, но никогда не достигнет ее. Я знаю, что он выполняет FuncB, потому что я могу поместить вызов MessagBox () в FuncB и получить окно сообщения.

Я новичок в VS2005 через несколько лет после интенсивного использования VC6. Одна из подобных ситуаций, которую я помню из моих дней VC6, заключается в том, что информация о символах недоступна. Однако в этом случае обе функции находятся в одном файле, поэтому информация о символах должна быть правильной. Также в этом случае я думаю, что вы даже не могли установить точку останова.

Я испробовал все глупые вуду, как восстановление всего решения.

Что за глупость я пропускаю?

РЕДАКТИРОВАТЬ: Добавлен код для FuncB в ответ на комментарий о том, что он может быть по сути встроенным. (Это просто точный пример кода из MSDN для wglUseFontBitmaps [минус комментарии здесь]). Я не понимаю, как встраивание это помешало бы проходить через каждый звонок.

Ответы [ 5 ]

6 голосов
/ 19 ноября 2008

Убедитесь, что все оптимизации компилятора отключены (/ Od). Оптимизация компилятора может вызвать проблемы с точками останова отладчика.

4 голосов
/ 19 ноября 2008

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

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

0 голосов
/ 16 марта 2009

на самом деле у меня была похожая проблема, я обнаружил, что код не компилируется, когда я запускаю программу, поэтому убедитесь, что вы 'скомпилировали' программу, прежде чем пытаться ее запустить

0 голосов
/ 19 ноября 2008

Спасибо за размещение кода. Это явно не то, что я догадался.


Для потомков, и чтобы прояснить ситуацию, я предположил, что если (1) функция была бы одной строкой и (2) компилятор вставил функцию, то (3) отладчик мог бы не знать, как войти в нее , Это предположение основано на том факте, что некоторые отладчики имеют проблемы с встроенным кодом и другими оптимизациями компилятора . Я недостаточно знаком с отладчиком Visual Studio, чтобы сказать, есть ли он в этом списке.

В большинстве систем, использующих формат stabs, -g позволяет использовать дополнительную информацию отладки, которую может использовать только GDB; эта дополнительная информация улучшает работу отладки в GDB, но, вероятно, приведет к аварийному завершению работы других отладчиков или отказу от чтения программы. ...

GCC позволяет вам использовать -g с -O. Сокращения, используемые оптимизированным кодом, могут иногда давать неожиданные результаты: некоторые объявленные вами переменные могут вообще не существовать; поток контроля может ненадолго переместиться туда, где вы этого не ожидали; некоторые операторы могут не выполняться, потому что они вычисляют постоянные результаты или их значения уже были под рукой; некоторые операторы могут выполняться в разных местах, потому что они были удалены из циклов.

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

0 голосов
/ 19 ноября 2008

Если все не удается, попробуйте обновить до VS2005 SP1, если у вас его еще нет ...

Звучит действительно странно!

...