7.13. Отладка компилятора
ХАЦКЕРСКАЯ ЗОНА. ХАЦКЕРСКАЯ ЗОНА. (Вы были предупреждены.)
Флаги вывода
7.13.1. Вывод промежуточных структур компилятора
-
-ddump-to-file -
Приводит к выводу из всех флагов, перечисленных ниже, в файл. Имя файла зависит от выводимой информации; например, вывод из
-ddump-simplбудет записан вmodule.dump-simpl.
-
-ddump-file-prefix=⟨str⟩ -
Устанавливает префикс имён файлов, используемых для отладочного вывода. Например,
-ddump-file-prefix=Fooприведет к выводу из-ddump-simplв файлFoo.dump-simpl.
-
-ddump-json -
Выводит сообщения об ошибках в формате JSON. Предполагается, что это будет использоваться внешними инструментами. Хороший способ использовать его — в сочетании с
-ddump-to-file.
-
-dshow-passes -
Выводит имя каждого этапа, его время выполнения и выделенную память по мере выполнения. Обратите внимание, что это может немного сказаться на производительности, так как компилятор будет более активно подсчитывать затраты ресурсов для получения более точных показателей.
Создаются два типа сообщений: те, которые начинаются с
***, указывают на начало этапа компиляции, а те, которые начинаются с!!!— на завершение этапа и сопровождаются статистикой выделенной памяти и времени выполнения.
-
-dfaststring-stats -
Отображает статистику использования быстрых строк компилятором.
-
-dppr-debug -
Отладочный вывод представлен в нескольких «стилях». Например, рассмотрим вывод типов. В стиле «пользователь» (по умолчанию) внутренние представления компилятора о типах отображаются в синтаксисе исходного кода Haskell, насколько это возможно. В стиле «отладка» (который используется по умолчанию для отладочного вывода) типы выводятся со явными «foralls», а переменным присваиваются уникальные идентификаторы (чтобы можно было проверять похожие, но разные вещи).
Этот флаг делает отладочный вывод более подробным, в стиле «отладка».
-
-ddump-timings -
Отображает статистику выделенной памяти и времени выполнения на различных этапах компиляции.
GHC — большая программа, состоящая из множества этапов. Вы можете настроить GHC на вывод информации с различных этапов компиляции, используя флаги -ddump-⟨pass⟩ ниже. Обратите внимание, что некоторые из них могут генерировать большое количество вывода. Вы можете предотвратить их переполнение стандартного вывода, передав -ddump-to-file.
7.13.1.1. Фронтенд
Эти флаги выводят различную информацию из фронтенда GHC. Включая парсер и читатель файлов интерфейса.
-
-ddump-parsed -
Вывод выходных данных парсера
-
-ddump-parsed-ast -
Вывод выходных данных парсера в виде синтаксического дерева
-
-ddump-if-trace -
Сделайте загрузчик интерфейса более разговорчивым относительно его действий.
7.13.1.2. Проверка типов и переименование
Эти флаги выводят различную информацию из модуля проверки типов и переименования GHC.
-
-ddump-tc-trace -
Сделайте проверяющий типы более разговорчивым относительно его действий.
-
-ddump-rn-trace -
Сделайте переименовыватель более разговорчивым относительно его действий.
-
-ddump-ec-trace -
Сделайте проверяющий полноту сопоставления шаблонов более разговорчивым относительно его действий.
-
-ddump-rn-stats -
Выводит сводку о типе информации, которую переименовыватель должен был получить.
-
-ddump-rn -
Вывод выходных данных переименовывателя
-
-ddump-rn-ast -
Вывод выходных данных переименовывателя в виде синтаксического дерева
-
-ddump-tc -
Вывод выходных данных проверяющего типы. Обратите внимание, что по умолчанию это скрывает множество деталей; вы можете рассмотреть возможность использования этого с
-fprint-typechecker-elaboration.
-
-ddump-tc-ast -
Вывод выходных данных проверяющего типы в виде синтаксического дерева
-
-ddump-splices -
Выводит выражения Template Haskell, которые мы вставляем, и соответствующий код Haskell, к которому они приводят.
-
-dth-dec-file -
Выводит расширения всех глобальных выражений Template Haskell в
module.th.hsдля каждого файлаmodule.hs.
-
-ddump-types -
Выводит подпись типа для каждого определённого на верхнем уровне значения модуля. Список отсортирован по алфавиту. Используя
-dppr-debugвыводятся подписи типов для всех импортированных и системных определений; полезно для отладки компилятора.
-
-ddump-deriv -
Выводит производные реализации
7.13.1.3. Представление ядра и упрощение
Эти флаги выводят различные этапы процесса преобразования ядра GHC. Это начинается с разагриговывателя и включает упроститель, преобразование worker-wrapper, движок правил, специализатор, анализатор строгости/встречи и этап общих подвыражений.
-
-ddump-core-stats -
Выводит в одной строке сводку о размере программы Core в конце оптимизационного конвейера.
-
-ddump-ds -
-ddump-ds-preopt -
Выводит результат разагриговывателя.
-ddump-dsвыводит результат после выполнения очень простого оптимизатора (который отбрасывает много мусора, поэтому это разумный вариант по умолчанию).-ddump-ds-preoptпоказывает результат после разагриговывания, но перед очень простым оптимизатором.
-
-ddump-simpl-iterations -
Выводит результат каждой итерации упростителя (каждый запуск упростителя имеет максимальное количество итераций, обычно 4).
-
-ddump-simpl-stats -
Выводит статистику о том, сколько преобразований каждого типа произошло. Если добавить
-dppr-debug, вы получите более подробную информацию.
-
-dverbose-core2core -
Выводит результат промежуточного этапа преобразования Core-to-Core. (очень много вывода!) Поэтому: когда мы действительно отчаиваемся:
% ghc -noC -O -ddump-simpl -dverbose-core2core -dcore-lint Foo.hs
-
-ddump-spec -
Выводит результат этапа специализации
-
-ddump-rules -
Выводит все правила переписывания, заданные в этом модуле; см. Управление действиями в правилах переписывания.
-
-ddump-rule-firings -
Выводит имена всех правил, которые сработали в этом модуле
-
-ddump-rule-rewrites -
Выводит подробную информацию обо всех правилах, которые сработали в этом модуле
-
-drule-check=⟨str⟩ -
Этот флаг полезен для отладки того, почему ожидаемое правило не срабатывает.
Правила фильтруются по заданной пользователем строке, правило сохраняется, если префикс его имени совпадает со строкой. Затем этап проверяет, можно ли применить эти правила к программе, но они почему-то не сработали. Например, указание
-drule-check=SPECпроверит, существуют ли какие-либо применения, которые могут быть подвластны правилу, созданному с помощью специализации.
-
-dinline-check=⟨str⟩ -
Этот флаг полезен для отладки причин, по которым определение не включено в строку.
Когда в этот флаг передаётся строка, мы сообщаем информацию обо всех функциях, имена которых содержат префикс, совпадающий со строкой.
Например, если вы проверяете ядро своей программы и замечаете, что
fooне включён в строку. Вы можете передать-dinline-check fooи получите отчёт о причинах, по которымfooне включён в строку.
-
-ddump-simpl -
Вывести результат упрощения (переходы «Core-to-Core»)
-
-ddump-inlinings -
Выводит информацию о встраивании из модуля упрощения. Обратите внимание, что если используется в сочетании с
-dverbose-core2core, компилятор также выведет встраивания, которые он рассматривает, но пропускает, вместе с обоснованием.
-
-ddump-stranal -
Вывести результат анализа строгости
-
-ddump-str-signatures -
Вывести подписи строгости
-
-ddump-cse -
Вывести результат прохода по устранению общих подвыражений (CSE)
-
-ddump-worker-wrapper -
Вывести результат разделения worker/wrapper
-
-ddump-occur-anal -
Вывести результат анализа «встречи»
-
-ddump-prep -
Вывести результат прохода подготовки Core
7.13.1.4. Представление STG
Эти флаги выдают различные этапы конвейера STG GHC.
-
-ddump-stg -
Показать результат прохода CoreToStg.
-
-dverbose-stg2stg -
Показать результат промежуточного прохода STG-to-STG. (очень много вывода!)
-
-ddump-stg-unarised -
Показать результат прохода unarise.
-
-ddump-stg-final -
Показать результат последнего прохода STG перед генерацией Cmm.
7.13.1.5. Представление C--
Эти флаги выдают различные этапы конвейера C-- GHC.
-
-ddump-cmm-verbose-by-proc -
Вывести результаты основных этапов конвейера C--. В случае
.cmmкомпиляции также выводится результат разбора файла. Не включены этапы, выполняемые выбранным бэкендом. В настоящее время только бэкэнды NCG выполняют дополнительные проходы (-ddump-opt-cmm).Cmm-выводы не включают недостижимые блоки, так как мы выводим блоки в обратном порядке обхода.
-
-ddump-cmm-verbose -
Если используется в сочетании с
-ddump-to-file, записывает выводы этапов основного конвейера C-- в файлы (по одному файлу на этап).
-
-ddump-cmm-from-stg -
Вывести результат преобразования STG в C--
-
-ddump-cmm-raw -
Вывести «сырой» C--.
-
-ddump-cmm-cfg -
Вывести результаты прохода оптимизации потока управления C--.
-
-ddump-cmm-cbe -
Вывести результаты прохода по устранению общих блоков (CBE) в C--.
-
-ddump-cmm-switch -
Вывести результаты прохода по понижению switch в C--.
-
-ddump-cmm-proc -
Вывести результаты прохода анализа точек proc в C--.
-
-ddump-cmm-sp -
Вывести результаты прохода по размещению стека в C--.
-
-ddump-cmm-sink -
Вывести результаты прохода по погружению в C--.
-
-ddump-cmm-caf -
Вывести результаты прохода анализа CAF в C--.
-
-ddump-cmm-procmap -
Вывести результаты прохода по созданию карты точек proc в C--.
-
-ddump-cmm-split -
Вывести результаты прохода по разделению точек proc в C--.
-
-ddump-cmm-info -
Вывести результаты прохода по дополнению таблицы информации в C--.
-
-ddump-cmm-cps -
Вывести результаты прохода CPS.
-
-ddump-cmm -
Вывести результат обработки конвейера C--.
-
-ddump-cfg-weights -
Выводит CFG с весами, используемыми новым кодом расположения блоков. Каждый CFG выводится в формате графа dot, что облегчает визуализацию.
7.13.1.6. Генератор кода LLVM
-
-ddump-llvm -
- Подразумевает
Код LLVM от генератора кода LLVM
7.13.1.7. Генератор кода нативного языка
Эти флаги выводят различные этапы конвейера генератора кода нативного языка, который начинается с C-- и генерирует исходный код ассемблера.
-
-ddump-opt-cmm -
Вывести результаты оптимизирующих проходов C-- в C--, выполняемых NCG.
-
-ddump-asm-native -
Вывести исходный код ассемблера, полученный из C--.
-
-ddump-asm-liveness -
Вывести результат прохода по определению жизнеспособности регистров.
-
-ddump-asm-regalloc -
Вывести результат прохода по распределению регистров.
-
-ddump-asm-regalloc-stages -
Вывести этапы построения/сброса
-fregs-graphраспределения регистров.
-
-ddump-asm-stats -
Вывести статистику распределения регистров.
-
-ddump-asm-expanded -
Вывести результат прохода по расширению синтетических инструкций.
-
-ddump-asm -
Вывести окончательный код ассемблера, сгенерированный генератором кода нативного языка.
7.13.1.8. Разные выводы бэкенда
Эти флаги выводят различные данные от других бэкэндов.
-
-ddump-bcos -
Вывести байткодовые объекты (BCO), сгенерированные для интерпретатора байткода GHC.
-
-ddump-rtti -
Отследить вычисление типов во время выполнения, выполняемое различными командами интерпретатора.
-
-ddump-foreign -
Вывести плагины внешних экспортов.
-
-ddump-ticked -
Вывести код, инструментированный HPC (Просмотр охвата кода).
-
-ddump-hpc -
Псевдоним для
-ddump-ticked.
-
-ddump-mod-map -
Вывести отображение модулей к их происхождению и способу:
-
(hidden module): Модуль скрыт и поэтому никогда не будет доступен для импорта. -
(unusable module): Модуль недоступен, потому что пакет неприменим. -
(hidden package): Этот модуль находится в списке экспортированных модулей кого-то, но этот пакет скрыт. -
(exposed package): Модуль доступен для импорта. -
(reexport by <PACKAGES>): Этот модуль доступен из повторной экспорта некоторого набора опубликованных пакетов. -
(hidden reexport by <PACKAGES>): Этот модуль доступен из повторной экспорта некоторого набора скрытых пакетов. -
(package flag): Этот экспорт модуля происходит из флага пакета.
-
7.13.2. Форматирование выводов
-
-dppr-user-length -
В сообщениях об ошибках выражения печатаются на определённой «глубине», а подвыражения, выходящие за пределы глубины, заменяются многоточием. Этот флаг устанавливает глубину. Его значение по умолчанию равно 5.
-
-dppr-cols=⟨n⟩ -
Установить ширину вывода отладки. Используйте это, если ваш код слишком много обрезает. Например:
-dppr-cols=200.
-
-dppr-case-as-let -
Печатать одиночные альтернативные выражения case так, как если бы они были строгими выражениями let. Это полезно, когда ваш код выполняет много распаковки.
-
-dhex-word-literals -
Выводить значения типа
Word#иWord64#(но не значения типаInt#иInt64#) в шестнадцатеричном формате вместо десятичного. Шестнадцатеричное значение дополняется нулями до длины, являющейся степенью двойки. Например:0x0A0A##,0x000FFFFF##,0xC##. Этот флаг может быть полезен, когда вы генерируете битовый шаблон, который должен корректно работать в 32-битной или 64-битной архитектуре. Вывод шестнадцатеричных литералов после оптимизаций и сворачивания констант упрощает подтверждение корректности сгенерированного битового шаблона.
-
-dno-debug-output -
Запретить любой нежелательный вывод отладки. Когда GHC был скомпилирован с опцией
DEBUG, он иногда генерирует вывод отладки, который интересен разработчикам. Дополнительный вывод может сбить с толку фреймворк тестирования и привести к ложным ошибкам теста, поэтому этот флаг предназначен для его отключения.
7.13.3. Запрещение нежелательной информации
Сводки дампов содержат большое количество информации. В зависимости от задачи, не вся информация будет полезной. Используйте эти флаги, чтобы запретить части, которые вас не интересуют.
-
-dsuppress-all -
Запретить все, что можно запретить, за исключением уникальных идентификаторов, так как это часто делает вывод неоднозначным. Если вы хотите увидеть общую структуру кода, начните с этого флага.
-
-dsuppress-ticks -
Запретить вывод «тиков» в выводе красивого принтера.
-
-dsuppress-uniques -
Запретить вывод уникальных идентификаторов. Это может сделать вывод неоднозначным (например, неясно, где переменная ‘x’ связана), но это делает вывод от двух компиляций с меньшим количеством излишних различий, поэтому вы можете реально применить
diff. После того, какdiffпоказал вам, где искать, вы можете повторить попытку без-dsuppress-uniques
-
-dsuppress-idinfo -
Запретить вывод дополнительной информации об идентификаторах, где они связаны. Это включает информацию о строгости и шаблоны инлайнинга. Использование этого флага может сократить размер сводки дампа вдвое из-за отсутствия шаблонов инлайнинга.
-
-dsuppress-unfoldings -
Запретить вывод стабильного разворачивания переменной в месте ее связывания.
-
-dsuppress-module-prefixes -
Запретить вывод префиксов квалификации модулей. Это
Data.ListвData.List.length.
-
-dsuppress-timestamps -
Запретить вывод временных меток. Это упрощает сравнение дампов.
-
-dsuppress-type-signatures -
Запретить вывод сигнатур типов.
-
-dsuppress-type-applications -
Запретить вывод применений типов.
-
-dsuppress-coercions -
Запретить вывод преобразований типов.
-
-dsuppress-var-kinds -
Запретить вывод видов переменных
-
-dsuppress-stg-free-vars -
Запретить вывод списков свободных переменных замыканий в выводе STG.
7.13.4. Проверка согласованности
-
-dcore-lint -
Включить проверку целостности внутри прохода GHC на уровне Core. (Проверяет корректность GHC, а не вашу.)
-
-dstg-lint -
То же самое для уровня STG.
-
-dcmm-lint -
То же самое для уровня C--.
-
-fllvm-fill-undef-with-garbage -
Инструктирует генератор кода LLVM заполнять неинициализированные регистры STG мусором вместо
undefв вызовах. Это упрощает обнаружение скрытых ошибок генератора кода и системного времени выполнения (например, см. #11487).
-
-falignment-sanitisation -
Компилировать с проверками выравнивания для всех обращений к таблице информации. Это может быть полезно при поиске проблем с указателями.
-
-fproc-alignment -
Выравнивать функции по кратным значениям. Допустимы только степени двойки.
-fproc-alignment=64может использоваться для ограничения влияния выравнивания на производительность, так как каждая функция будет начинаться с кэша строки. Однако принудительное использование большего выравнивания в целом снижает производительность.
-
-fcatch-bottoms -
Инструктирует упроститель генерировать выражения
errorв продолжении пустых анализов случая (которые должны завершаться сбоем и, следовательно, не возвращать значение). Это полезно при отладке ошибок анализа спроса, которые иногда могут проявляться как сбои сегментации.
7.13.5. Проверка детерминизма
-
-dinitial-unique=⟨s⟩ -
Начать выделение памяти
UniqSupplyс ⟨s⟩.
-
-dunique-increment=⟨i⟩ -
Установить шаг для сгенерированных
Uniqueна ⟨i⟩.Это полезно в сочетании с
-dinitial-unique=⟨s⟩для проверки, зависят ли сгенерированные файлы от порядкаUnique.Некоторые интересные значения:
-
-dinitial-unique=0 -dunique-increment=1— текущий последовательныйUniqSupply -
-dinitial-unique=16777215 -dunique-increment=-1—UniqSupply, генерируемый в порядке убывания -
-dinitial-unique=1 -dunique-increment=PRIME— где PRIME достаточно большой, чтобы часто переполняться — не последовательный порядок
-
7.13.6. Другое
-
-dno-typeable-binds -
Это предотвращает генерацию связей, относящихся к Typeable, для модулей и типов. Это полезно при отладке, так как это приводит к более маленьким модулям и сводкам дампов, но компилятор вызовет ошибку, если вы попытаетесь использовать экземпляры Typeable для элементов, созданных с этим флагом.
© 2002–2007 The University Court of the University of Glasgow. All rights reserved.
Licensed under the Glasgow Haskell Compiler License.
https://downloads.haskell.org/~ghc/8.10.2/docs/html/users_guide/debugging.html