2009-04-15 6 views
2

В VC++ 6.0 MFC Application Project, я не получаю ошибку компиляции, но когда я запускаю проект я получу ошибкуAssertion Ошибка

 
Debug Assertion Failed! 
program:project.exe 
File:winocc.cpp 
Line:345 

For information on how your program can cause an assertion 
failure, see the Visual C++ documentation on asserts. 

(Press Retry to debug the application)

, что ошибка это и почему этот тип ошибки происходит, как отлаживать эту ошибку, plz help any body,

ответ

6

Возможно, вы найдете подтверждение в winocc.cpp на линии 345. Посмотрите на этот исходный файл, чтобы узнать, что он проверяет (что вы должны делать не делайте этого), а затем прекратите делать это :-)

Если у вас нет то вам придется либо:

  • связаться с кем бы он ни написал и выяснить, что такое утверждение; или
  • прочитайте документы API, чтобы узнать, не делаете ли вы что-то неправильно.

Утверждение является выполнения проверки, что кодер использует для обеспечения правила соблюдаются или неожиданные ситуации пойманы прежде, чем любой реальный ущерб нанесен. Такие вещи, как двусвязный список, становятся коррумпированными (например, что-то вроде assert (x-> next-> prev! = X), которое будет утверждать проблему, если предыдущий узел узла A не имеет узла A в качестве следующего узла).

Что-то вроде:

Assert (p1 == NULL); 

(в моем мифическом языке в случае, если у меня есть C синтаксис неправильно) в начале функции вызовет утверждение, если p1 равно NULL.

Веб-поиск поворачивает вверх следующую строку 345 (см here):

ASSERT; (m_pCtrlSite = NULL!) // не OLE-контроль (пока нет, по крайней мере).

и похоже, что проблема связана с тем, что вы пытаетесь динамически создать лицензированный элемент управления ActiveX. Эта ссылка также содержит номер KB Q151804, в котором говорится, что это по дизайну (что означает, что MS, вероятно, не будет исправлено) - вам нужно создать элемент управления с допустимой строкой лицензии.

Еще один комментарий, который я нашел состояние:

Это не достаточно просто создать экземпляр элемента управления ActiveX. Элемент управления ActiveX должен быть правильно размещен до его использования. Твой нет. Вам нужно, скажем, поместить его в диалог и создать экземпляр этого диалога.

Не видя остальную часть вашего кода, это трудно сказать, если это ваша конкретная проблема, но если ваша линии 345 является один я думаю, что это, что имеет смысл - это жалуется, что сайт управления NULL (т. е. элемент управления не размещен).

Последним, что нужно следить за:

Если элемент управления ActiveX находится в диалоге, вы пытаетесь сделать что-то для контроля перед тем вы вызываете Диалог DoModal()?

Элемент управления будет инициализирован только после вызова DoModal(), чтобы вы не могли играть с контролем до тех пор, пока это не произошло. Вы должны сделать это в диалоговом окне OnInitDialog() - в этот момент элемент управления должен быть полностью инициализирован, и вы можете делать с ним то, что хотите.

Если вы пытаетесь использовать параметры из конструктора диалогов манипулировать управление, вы должны хранить их где-нибудь в диалоговом и передать их в управление в OnInitDialog().

Эта информация была собрана в основном из here.

+1

+1 для хорошего описания –

+0

как напрямую я могу найти winocc.cpp – 2009-04-15 06:44:59

+0

Если у вас есть источник, он должен быть где-то в вашем проекте. См. Мой обновленный ответ (дайте мне минуту или две). – paxdiablo

1

«Утверждение (...)» должно помочь вам найти ошибки в вашей программе на C++, проверив определенные условия во время выполнения. Возможно, что-то не так правильно настроено в вашей программе, что вызывает этот сбой. Как сказал Пакс, посмотрите, можете ли вы открыть winocc.cpp и посмотреть на строку 345, чтобы увидеть, что проверяет «assert», и посмотреть, можете ли вы понять, почему он терпит неудачу.

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

+0

Я всегда оставляю в утверждениях даже для производственного кода. Я бы предпочел, чтобы они сбой немедленно, а затем вызвали некоторые непонятные проблемы с 100 000 инструкциями CPU позже. Безопасность над скоростью - одна из моих мантр. – paxdiablo

+0

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

+0

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

0

Утверждения используются для проверки предварительных условий/постусловий и промежуточных результатов в коде во время выполнения.

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

В VC утверждения вводятся в двоичных файлах с целью отладки, а не в цели Release.

0

Если вы не управляете dll (иногда поставщик оставляет заявку в библиотеке отладки), вы можете показать разборку и изменить местоположение памяти assert (где он сломается) от 3 до 90. Это будет измените свой __asm ​​int 3 на __noop. Хорошо для устранения прерывания, от которого вы можете избавиться - по крайней мере, для этого сеанса отладки. :)

+0

Err, вы путаете точку останова с утверждением? – paxdiablo

+0

В этот момент все прерывается. –