Описание пользователя
Глава 3. Использование стандартных модулей автокомпиляции
§3.8. Настройки стандартного модуля автокомпиляции
§3.8.7. Разбор ошибок компиляции
Описывается настройка автоматического разбора создаваемых компилятором отчетов для выделения из них сообщений об ошибках. Эти сообщения показываются пользователю непосредственно в окне редактора компилируемой модели.
Если в процессе компиляции модели в ее тексте обнаружены какие-либо ошибки, модуль автокомпиляции должен показать список этих ошибок пользователю в окне редактора на специальной панели под вкладками с текстом реакций модели на события (см. рис. 332). При этом желательно, чтобы двойной щелчок на ошибке в списке автоматически открывал вкладку с фрагментом исходного текста, в котором она возникла, и устанавливал курсор в строку с ошибкой. Для этого модуль должен уметь разбирать отчеты, выдаваемые компилятором и редактором связей.
Практически все компиляторы выдают текстовые отчеты о своей работе. Эти тексты имеют сложную структуру: обычно они содержат имя и версию компилятора, имена обработанных файлов, обнаруженные ошибки, сводные данные о результатах компиляции и т.п. В настройках модуля автокомпиляции задаются правила обработки таких текстов. Необходимо указать, откуда модуль должен считывать эти тексты отчетов, как в них отмечены строки, содержащие ошибки и предупреждения, где в этих строках находится номер строки исходного текста, а где – описание ошибки. Поскольку редактор связей чаще всего является отдельной программой со своим форматом отчетов, правила разбора текстов для него задаются отдельно. Настройка разбора отчетов – довольно сложная задача, поэтому, перед тем, как приступать к ней, настоятельно рекомендуется изучить описание используемого компилятора и провести несколько компиляций вручную, специально внося в текст программы различные ошибки и наблюдая, как они отражаются в отчетах.
Для того, чтобы задать правила разбора отчета компилятора, следует вызвать окно настройки модуля и на его вкладке «» нажать кнопку «». В открывшемся дополнительном окне настроек следует выбрать вкладку «» (рис. 499).
Рис. 499. Настройка разбора ошибок компилятора (на примере Borland C++ 5.5)
Самый верхний флажок на вкладке, называющийся «», разрешает обработку отчета компилятора. Если его не установить, модуль автокомпиляции не будет обрабатывать отчет. Пользователь в этом случае сможет узнать о том, что в его программе есть ошибки, только по сообщению о невозможности создать DLL с моделью, которое модуль выдает самостоятельно, без анализа работы компилятора. Этого следует всячески избегать, поскольку пользователю в этом случае будет очень сложно обнаружить ошибку. Нормально настроенный модуль должен обрабатывать ошибки, и этот флажок должен быть установлен.
Справа от флажка находится выпадающий список, в котором нужно указать, куда именно компилятор выводит отчет о своей работе. Следует выбрать один из трех вариантов: «из STDOUT», «из файла» или «из STDERR». Большинство компиляторов – консольные приложения Windows, а консольные приложения обычно работают с тремя стандартными потоками ввода-вывода: потоком ввода данных «stdin», потоком вывода данных «stdout» и потоком вывода сообщений об ошибках «stderr». Если компилятор выводят сообщения об ошибках в потоки «stdout» или «stderr», модуль автокомпиляции, запустивший компилятор, может перед его запуском перенаправить эти потоки и получить из них данные, которые будут анализироваться. В какой именно поток компилятор выводит сообщения об ошибках, следует узнать из его описания или определить опытным путем, скомпилировав программу с ошибкой и перенаправив стандартные потоки вручную (перенаправление вывода в командной строке производится при помощи символа «>», подробнее об этом можно узнать в описании пользователя Windows). В выпадающем списке при этом следует выбрать вариант «из STDOUT» или «из STDERR», в зависимости от используемого компилятором потока. Если же компилятор выводит отчет не в стандартный поток, а в отдельный файл, в выпадающем списке следует выбрать вариант «из файла», а в поле ввода справа от списка указать имя этого файла (в имени можно использовать символические обозначения путей, рассмотренные в §3.8.4).
Ниже находятся два поля ввода: «» и «», которые позволяют исключить из рассмотрения заданное число начальных и конечных строк отчета компилятора. В начальных строках часто выводится название и версия компилятора, а в конечных – сводные данные о результатах компиляции. К ошибкам эти строки не имеют прямого отношения, поэтому их обрабатывать не нужно.
Далее расположен флажок «». Его следует устанавливать только в том случае, если сообщения об ошибках компилятора не имеют четкой формальной структуры и не могут анализироваться способами, описанными ниже. В этом случае любая строка отчета, не входящая в число пропускаемых начальных и конечных, будет показана пользователю как сообщение об ошибке без привязки к какой-либо строке введенного им текста. Это очень неудобно, поскольку поиск ошибки в тексте в этом случае ложится на пользователя, и установки этого флажка следует, по возможности, избегать.
Флажок «», как следует из его названия, исключает из рассмотрения строки отчета компилятора, которые начинаются с пробелов или знаков табуляции. В таких строках обычно содержится различная дополнительная информация, которую можно не анализировать.
Ниже расположены три похожих флажка, управляющие выделением из отчета интересующих модуль строк: «», «» и «». После каждого из этих флажков находится поле ввода, в котором указывается искомое слово, и дополнительный флажок, требующий нахождения этого слова в начале строки отчета. Кроме того, под этими флажками находится флажок «», управляющий поиском слова в строке.
Если установлен флажок «», сообщениями об ошибках будут считаться только строки отчета, содержащие указанное после флажка слово (с учетом или без учета регистра символов, определяется флажком «»). При этом, если установлен дополнительный флажок «», строки, в которых найденное слово не находится в начале строки отчета, будут исключены из рассмотрения. Точно так же работает флажок «». Флажок «» исключает их рассмотрения строки, содержащие заданное слово, даже если они содержат слова, указанные в качестве слов-признаков ошибок и предупреждений (так можно пропускать диагностические сообщения компилятора). Настройки, приведенные в качестве примера на рис. 499, указывают модулю считать сообщениями об ошибках любые строки, начинающиеся со слова «error» в любом регистре (то есть подойдут и «ERROR», и «Error»), а предупреждениями – строки, начинающиеся со слова «warning». Пропуск строк по слову в этих настройках отключен.
Установка флажка «» исключает из рассмотрения строки отчета, в которых не оказалось ни слова, отмечающего сообщение об ошибке, ни слова, отмечающего предупреждение. Без установки одного из флажков поиска, описанных выше, установка этого флажка не рекомендуется, поскольку это заставит модуль игнорировать все строки отчета, так как все они окажутся неопознанными.
Далее располагаются два поля ввода, управляющие анализом опознанных строк отчета, то есть строк, в которых обнаружено либо слово, отмечающее ошибку, либо слово, отмечающее предупреждение (для этого хотя бы один из флажков «» и «» должен быть установлен). В поле ввода «» через пробел указываются условные обозначения, отмечающие последовательность слов в сообщениях об ошибке и предупреждениях. Можно использовать следующие обозначения:
- «FILE» – имя файла исходного текста;
- «LINE» – номер строки исходного текста;
- «CODE» – код ошибки;
- «MARK» – пропустить все слова до обнаруженного слова-маркера ошибки или предупреждения (то есть одного из слов, указанных после флажков «» и «») включительно;
- «SKIP» – пропуск одного слова.
Эти обозначения можно как вводить вручную с клавиатуры, так и выбирать из меню, открываемого кнопкой с многоточием рядом с полем.
Справа от поля «», в поле «», подряд вводятся символы, которые в строке отчета должны считаться разделителями слов. Пробел и символ табуляции всегда считаются разделителями, и их не нужно указывать отдельно. Строка отчета, опознанная как сообщение об ошибке или предупреждение, разбивается на слова согласно указанному списку разделителей, а затем ее начало разбирается согласно обозначениям из поля «»: оттуда извлекается код ошибки, номер строки и т.п. Не разобранный конец строки считается описанием ошибки и показывается пользователю.
На рис. 499 формат строки указан в виде «SKIP CODE FILE LINE», а в качестве разделителя указан символ двоеточия. Проиллюстрируем разбор сообщения об ошибке на примере следующего отчета компилятора Borland C++ 5.5:
src_p2_4.cpp: Error E2303 src_p2_4.cpp 20: Type name expected *** 1 errors in Compile ***
Согласно настройкам на рисунке, в этом тексте только вторая строка будет опознана модулем как сообщение об ошибке: в ее начале содержится слово «error». Таким образом, только она будет разобрана по формату «SKIP CODE FILE LINE». Разбор будет выглядеть следующим образом:
| SKIP | CODE | FILE | LINE | остаток строки | |
| Error | E2303 | src_p2_4.cpp | 20 | : | Type name expected |
| пропуск | код ошибки | имя файла | номер строки | разделитель | текст описания ошибки |
Ошибка опознана как ошибка «type name expected» («требуется имя типа») с кодом E2303 в строке номер 20. На данный момент извлеченные из строки код ошибки и имя файла никак не используются модулем автокомпиляции, используется только номер строки и текст описания. В окне редактора пользователь увидит сообщение об этой ошибке в следующем виде:
[Ошибка С++] Описания (2): Type name expected
Здесь «описания» – название фрагмента введенного пользователем фрагмента текста модели, а 2 – номер строки в этом тексте. Модуль автоматически находит фрагмент текста по номеру строки из сообщения об ошибке и выводит в сообщении номер строки не во всем автоматически сформированном тексте программы, который обработал компилятор, а внутри этого найденного фрагмента. При двойном щелчке на этом сообщении автоматически откроется вкладка глобальных описаний модели (см. §3.7.1) и курсор будет установлен на вторую строку этой вкладки, то есть на ту строку, в которой компилятор нашел ошибку.
В нижней части вкладки находится кнопка «», заполняющая вкладку параметрами, которые разработчики модуля считают подходящими для компилятора, для которого предназначен настраиваемый модуль.
Чаще всего редактор связей для преобразования скомпилированного объектного файла в DLL вызывается как отдельная программа (см. §3.8.6). Однако, некоторые компиляторы способны сами вызывать редактор связей, и, в этом случае, у компилятора и редактора связей будет один общий отчет. Если редактор связей запускается самим компилятором, то есть если на вкладке «» не установлен флажок «» (см. рис. 497), на вкладке «» под горизонтальной чертой будет активна группа флажков, задающая разбиение общего отчета на отчет компилятора и отчет редактора связей (рис. 500).
Рис. 500. Настройка выделения отчета редактора связей
Общий отчет всегда начинается с отчета компилятора. Отчет редактора связей обычно начинается с какого-то текста – например, с имени редактора связей. Этот текст можно указать в поле ввода после флажка «». При этом флажок «» будет требовать того, чтобы этот текст находился в начале строки отчета (обычно так и бывает), а флажок «» будет требовать совпадения регистра всех символов найденного текста с введенным образцом. Как только строка с указанным текстом будет найдена, все строки после нее будут считаться отчетом редактора связей и обрабатываться по другим правилам.
Правила обработки отчета редактора связей (не важно, вызывается он отдельно или запускается автоматически самим компилятором) задаются на вкладке «» того же окна дополнительных настроек модуля (рис. 501).
Рис. 501. Настройка разбора ошибок редактора связей
Поля этой вкладки совпадают с полями вкладки разбора ошибок компилятора (см. рис. 499) и разбор отчета производится по таким же правилам. Следует учитывать, что редактор связи работает не с исходным текстом программы, а с уже скомпилированным объектным файлом, поэтому в его сообщениях об ошибках номера строк, как правило, отсутствуют. Редактор связей может, например, определить, что какая-то функция описана в программе, но тело ее отсутствует – у такой ошибки в принципе не может быть номера строки. По этой причине ошибки редактора связей, чаще всего, не разбираются и показываются пользователю «как есть». Кроме того, если файл не скомпилирован из-за ошибок, редактор связей тоже выдаст ошибку из-за отсутствия объектного файла, который он должен обработать. Такие вторичные ошибки сами исчезают после исправления ошибок, о которых сообщил компилятор.
Ранее был приведен пример отчета компилятора с ошибкой «type name expected» («требуется имя типа») – такая ошибка делает невозможным компиляцию и, таким образом, создание объектного файла. В результате пользователь, допустивший ее, увидит сразу три сообщения об ошибках:
[Ошибка С++] Описания (2): Type name expected [Ошибка ilink32]: Fatal: Unable to open file 'src_p2_4.obj' [Анализ]: Файл DLL не создан
Первая строка в этом списке – обнаруженная и разобранная ошибка компилятора, уже рассмотренная выше. Вторая строка – обнаруженная ошибка редактора связей, который не смог открыть объектный файл, не созданный компилятором из-за первой ошибки. Третья строка – сообщение самого модуля о том, что, по каким-то причинам, в результате компиляции не был создан файл DLL с моделью блока. Это третье сообщение не связано с разбором отчетов компилятора и редактора связей, модуль выводит его автоматически. Если отключить в параметрах модуля анализ отчетов, это сообщение будет единственным, которое увидит пользователь.
Если в параметрах модуля автокомпиляции задан запуск дополнительной программы после редактора связей (см. рис. 498), модуль может также разобрать отчет о работе, формируемый этой программой. Правила его разбора задаются на вкладке «» того же окна дополнительных настроек модуля. Все поля этой вкладки совпадают с полями вкладки разбора отчета редактора связей (см. рис. 501) и имеют тот же смысл, поэтому она здесь не описывается.
В процессе настройки модуля на разбор отчетов нестандартного компилятора большую помощь может оказать функция показа отчета компилятора, которую можно вызвать пунктом меню «» из окна редактора модели. Если запуск компилятора и редактора связей уже настроен, эта функция покажет на отдельной вкладке командные строки и параметры запуска этих программ, а также полные тексты сформированных ими отчетов.