Spec-Zone.ru › Haskell 8

7.13. Отладка компилятора

ХАЦКЕРСКАЯ ЗОНА. ХАЦКЕРСКАЯ ЗОНА. (Вы были предупреждены.)

Флаги вывода

  • Отладка компилятора

    • Вывод промежуточных структур компилятора

      • Фронтенд
      • Проверка типов и переименование
      • Представление ядра и упрощение
      • Представление STG
      • Представление C--
      • Генератор кода LLVM
      • Генератор нативного кода
      • Различные дампы бэкенда
    • Форматирование дампов
    • Подавление нежелательной информации
    • Проверка на непротиворечивость
    • Проверка на детерминизм
    • Прочие

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
Подразумевает

-fllvm

Код 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API