Spec-Zone.ru › Haskell 9

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

ТЕРРИТОРИЯ ХАКЕРА. ТЕРРИТОРИЯ ХАКЕРА. (Вы были предупреждены.)

Флаги вывода

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

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

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

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

-ddump-to-file

Приводит к выводу из каждого флага, начинающегося с «-ddump», в файл или файлы. Если вы хотите сохранить весь вывод одного флага в один файл, используйте -ddump-file-prefix=⟨str⟩ (см. описания ниже). В противном случае вывод будет направлен в несколько файлов, включая один для немодульных и несколько для модульных случаев. Суффикс файла вывода зависит от включенного флага, например, вывод из -ddump-simpl окажется в prefix.dump-simpl.

-ddump-file-prefix=⟨str⟩

Устанавливает префикс имён файлов, используемых для вывода отладки. Например, -ddump-file-prefix=Foo приведет к выводу из -ddump-simpl в Foo.dump-simpl.

-fdump-with-ways
По умолчанию:

включено

При компиляции Main.hs с профилированием и без этого флага теперь будут созданы Main.p.dump-simpl и Main.dump-simpl вместо перезаписи вывода одного способа выводом другого.

-ddump-json

Этот флаг ранее использовался для генерации вывода диагностики GHC в формате JSON, но устарел. Используйте вместо него -fdiagnostics-as-json.

-dshow-passes

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

Производятся два типа сообщений: те, которые начинаются с ***, обозначают начало фазы компиляции, в то время как те, которые начинаются с !!!, обозначают завершение этапа и сопровождаются статистикой выделения памяти и времени выполнения.

-dipe-stats

Для каждого модуля показываются некоторые простые статистические данные о том, какие таблицы информации содержат информацию IPE, и сколько таблиц информации с информацией IPE имеет каждый тип замыкания. Это полезно, например, для проверки того, что STACK таблицы информации опускаются или включаются в карту таблицы информации.

-dfaststring-stats

Показать статистику использования быстрых строк компилятором.

-ddump-faststrings

Вывести всю таблицу быстрых строк по окончании. Подумайте об использовании -ddump-file-prefix=⟨str⟩ для вывода её в файл.

-dppr-debug

Вывод отладки представлен в нескольких «стилях». Например, рассмотрим вывод типов. В стиле «пользователь» (по умолчанию) внутренние представления компилятора о типах представляются в синтаксисе языка Haskell на уровне исходного кода, насколько это возможно. В стиле «отладки» (который является по умолчанию для вывода отладки) типы печатаются с явными forall, а переменные имеют прикреплённый уникальный идентификатор (чтобы вы могли проверить вещи, которые выглядят одинаково, но таковыми не являются). Этот флаг заставляет вывод отладки отображаться в более подробном стиле отладки.

-ddump-timings

Показать статистику выделения памяти и времени выполнения для различных стадий компиляции. Память измеряется в байтах. Время выполнения измеряется в миллисекундах.

GHC — большая программа, состоящая из множества этапов. Вы можете сообщить GHC о выводе информации с различных этапов компиляции, используя флаги -ddump-⟨pass⟩ ниже. Обратите внимание, что некоторые из них склонны генерировать большой объём вывода. Вы можете предотвратить их заполнение стандартного вывода, передавая -ddump-to-file.

5.13.1.1. Фронтенд

Эти флаги выводят различную информацию из фронтенда GHC. Это включает в себя парсер и читатель файлов интерфейса.

-ddump-parsed

Вывести вывод парсера

-ddump-parsed-ast

Вывести вывод парсера как синтаксическое дерево

-dkeep-comments

Включить комментарии в парсер. Полезно в сочетании с -ddump-parsed-ast.

-ddump-if-trace

Заставить загрузчик интерфейса быть действительно болтливым о том, что он делает.

5.13.1.2. Проверка типов и переименование

Эти флаги выводят различную информацию из модуля проверки типов и переименования GHC.

-ddump-tc-trace

Заставить проверяющий типы быть действительно болтливым о том, что он делает.

-ddump-rn-trace

Заставить переименовыватель быть действительно болтливым о том, что он делает.

-ddump-ec-trace

Заставить проверятель исчерпываемости шаблонов быть действительно болтливым о том, что он делает.

-ddump-cs-trace

Заставить решатель ограничений быть действительно болтливым о том, что он делает.

-ddump-rn-stats

Вывести сводку о том, какой тип информации пришлось получить переименователю.

-ddump-rn

Вывести вывод переименовывателя

-ddump-rn-ast

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

-ddump-tc

Вывести вывод проверяющего типы. Обратите внимание, что это по умолчанию скрывает много деталей; вы можете рассмотреть возможность использования этого с -fprint-typechecker-elaboration.

-ddump-tc-ast

Вывести вывод проверяющего типы как синтаксическое дерево

-ddump-hie

Вывести синтаксическое дерево файла hie, если мы генерируем расширенные файлы интерфейса

-ddump-splices

Вывести выражения Template Haskell, которые мы вставляем, и к какому коду Haskell эти выражения приводят.

-dth-dec-file

Вывести расширения всех выражений Template Haskell верхнего уровня в module.th.hs для каждого файла module.hs.

-ddump-types

Вывести сигнатуру типа для каждого значения, определённого на верхнем уровне модуля. Список отсортирован в алфавитном порядке. Используя -dppr-debug, выводится сигнатура типа для всех импортированных и системных вещей; полезно для отладки компилятора.

-ddump-deriv

Вывести производные экземпляры

5.13.1.3. Ядерное представление и упрощение

Эти флаги выводят различные фазы конвейера GHC от ядра к ядру. Он начинается с десахаризатора и включает в себя упроститель, преобразование worker-wrapper, движок правил, специализатор, анализатор строгости/встречи и проход по удалению общих подвыражений.

-ddump-call-arity

Выводит результат прохода анализа арности вызова (-fcall-arity).

-ddump-core-stats

Выводит однострочный сводный отчёт о размере программы ядра в конце конвейера оптимизации.

-ddump-ds
-ddump-ds-preopt

Выводит результат работы десахаризатора. -ddump-ds выводит результат после выполнения очень простого оптимизатора (который отбрасывает много мусора, поэтому является разумным значением по умолчанию). -ddump-ds-preopt показывает результат после десахаризации, но до очень простого оптимизатора.

-ddump-exitify

Выводит результат прохода эксетификации (-fexitification), который пытается вынести код из рекурсивных функций.

-ddump-simpl-iterations

Показывает вывод каждой итерации упростителя (каждый запуск упростителя имеет максимальное количество итераций, обычно 4).

-ddump-simpl-stats

Выводит статистику о том, сколько преобразований каждого типа произошло. Если добавить -dppr-debug, вы получите более подробную информацию.

-ddump-simpl-trace

Выводит сообщения отслеживания из различных функций упростителя. Выводит довольно много вывода.

-dverbose-core2core

Показывает вывод промежуточного прохода ядро-к-ядру. (очень много вывода!) Итак: когда мы действительно отчаиваемся:

% ghc -noC -O -ddump-simpl -dverbose-core2core -dcore-lint Foo.hs
-ddump-spec

Вывод результата прохода специализации типов

-ddump-spec-constr
Since:

9.8.1

Выводит результат прохода специализации SpecConstr

-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

Выводит внедрения, выполненные упростителем.

-ddump-verbose-inlinings

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

-ddump-stranal

Было переименовано в -ddump-dmdanal.

-ddump-dmdanal

Выводит вывод анализа спроса.

См. -fstrictness для синтаксиса и семантики аннотаций спроса.

-ddump-str-signatures

Было переименовано в -ddump-dmd-signatures.

-ddump-dmd-signatures

Выводит сигнатуры спроса верхнего уровня, созданные анализом спроса.

См. -fstrictness для синтаксиса и семантики аннотаций спроса.

-ddump-cpranal

Выводит вывод анализа результатов построенного продукта.

-ddump-cpr-signatures

Выводит сигнатуры результатов построенного продукта.

-ddump-cse

Выводит вывод прохода удаления общих подвыражений (CSE).

-ddump-full-laziness
-ddump-float-out

Выводит вывод прохода полной ленивости (также известного как float-out) (см. -ffull-laziness)

-ddump-float-in

Выводит вывод прохода float-in (см. -ffloat-in)

-ddump-liberate-case

Выводит вывод прохода liberate case (см. -fliberate-case)

-ddump-static-argument-transformation

Выводит вывод прохода преобразования статических аргументов (см. -fstatic-argument-transformation)

-ddump-worker-wrapper

Выводит вывод разделения worker/wrapper.

-ddump-occur-anal

Выводит вывод анализа «встречи».

-ddump-prep

Выводит результат прохода подготовки Core.

-ddump-late-cc

Выводит вывод прохода LateCC после добавления центров затрат.

-ddump-view-pattern-commoning

Выводит представления шаблонов, которые являются общими.

5.13.1.4. Представление STG

Эти флаги выводят различные фазы конвейера GHC STG.

-ddump-stg-from-core

Показывает вывод прохода CoreToStg.

-dverbose-stg2stg

Показывает вывод промежуточного прохода STG-в-STG. (много вывода!)

-ddump-stg-unarised

Показывает вывод прохода unarise.

-ddump-stg-cg

Показывает вывод STG после Stg2Stg. Это результат после применения оптимизаций прохода Stg2Stg.

-ddump-stg-tags

Показывает вывод прохода вывода тегов.

-ddump-stg-final

Показывает вывод последнего прохода STG перед генерацией Cmm.

-ddump-stg

Псевдоним для -ddump-stg-from-core. Устарел в пользу более явных флагов: -ddump-stg-from-core, -ddump-stg-final и т. д.

5.13.1.5. Представление C-\-

Эти флаги выводят различные фазы конвейера GHC C-\-.

-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-thread-sanitizer

Вывод результатов прохода C-\-, отвечающего за добавление инструментирования, добавленного -fcmm-thread-sanitizer.

-ddump-cmm-cbe

Вывод результатов прохода C-\- устранения общих блоков (CBE).

-ddump-cmm-switch

Вывод результатов прохода понижения переключателей C-\-.

-ddump-cmm-proc

Вывод результатов прохода анализа точек C-\-.

-ddump-cmm-sp

Вывод результатов прохода размещения стека C-\-.

-ddump-cmm-sink

Вывод результатов прохода утоньшения C-\-.

-ddump-cmm-caf

Вывод результатов прохода анализа CAF C-\-.

-ddump-cmm-procmap

Вывод результатов прохода составления карты точек C-\-.

-ddump-cmm-split

Вывод результатов прохода разделения точек C-\-.

-ddump-cmm-info

Вывод результатов прохода дополнения таблицы информации C-\-.

-ddump-cmm-cps

Вывод результатов прохода CPS.

-ddump-cmm

Вывод результата обработки конвейера C-\-.

-ddump-cfg-weights

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

5.13.1.6. Генератор кода LLVM

-ddump-llvm
Подразумевает:

-fllvm

Код LLVM от генератора кода LLVM

5.13.1.7. Генератор кода C

-ddump-c-backend
Краткое описание:

Вывод кода C, сгенерированного C (незарегистрированным) бэкендом.

5.13.1.8. Генератор кода для нативных платформ

Эти флаги выводят различные этапы конвейера генератора кода для нативных платформ, который начинается с C-\- и генерирует нативный ассемблер.

-ddump-cmm-opt

Вывод результатов оптимизирующих проходов C-\-->C-\-, выполненных NCG.

-ddump-opt-cmm

Псевдоним для -ddump-cmm-opt

-ddump-asm-conflicts

Вывод (виртуальных) конфликтов регистров («перекрытий») из алгоритма распределения регистров по цвету графа (-fregs-graph).

-ddump-asm-native

Вывод начального вывода ассемблера, созданного из C-\-.

-ddump-asm-liveness

Вывод результата прохода жизнеспособности регистров.

-ddump-asm-regalloc

Вывод результата прохода распределения регистров.

-ddump-asm-regalloc-stages

Вывод этапов построения/сброса алгоритма распределения регистров по цвету графа (-fregs-graph).

-ddump-asm-stats

Вывод статистики из алгоритма распределения регистров.

-ddump-asm

Вывод окончательного ассемблерного кода, сгенерированного генератором нативного кода.

-ddump-js

Вывод окончательного кода JavaScript, сгенерированного генератором кода JavaScript.

5.13.1.9. Генератор кода JavaScript

-ddisable-js-minifier

Включает удобочитаемые отступы и форматирование при генерации JavaScript.

-ddisable-js-c-sources

Для отладки может быть полезно избегать связывания с исходными кодами C, скомпилированными в JavaScript с помощью Emscripten. Это также исключает связывание с RTS Emscripten. Обратите внимание, что код, который вызывает этот код C или использует примитивы Emscripten, завершится ошибкой во время выполнения (например, ошибками неопределённой функции).

5.13.1.10. Разные дампы бэкенда

Эти флаги выводят различную информацию из других бэкендов.

-ddump-bcos

Выводит объекты байткода (BCO), созданные для интерпретатора байткода GHC.

-ddump-debug

Выводит сгенерированную отладочную информацию (DWARF), созданную с флагом -g.

-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): Этот экспорт модуля происходит из флага пакета.

5.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, он время от времени выводит отладочную информацию, представляющую интерес для разработчиков. Этот дополнительный вывод может сбивать с толку фреймворк тестирования и приводить к ложным сбоям тестов, поэтому этот флаг предоставлен для его отключения.

5.13.3. Запрещение нежелательной информации

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

-dsuppress-all

Запрещает все, что можно запретить, за исключением уникальных идентификаторов, так как это часто делает вывод неоднозначным. Если вам нужно просто увидеть общую структуру кода, начните с этого.

-dsuppress-ticks

Запрещает «ти́ки» в выводе pretty-printer.

-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-coercion-types
-dsuppress-var-kinds

Запрещает вывод видов переменных

-dsuppress-stg-free-vars

Запрещает вывод списков свободных переменных замыканий в выводе STG.

-dsuppress-core-sizes
Since:

9.4.1

Запрещает вывод статистики размера ядра на привязку.

-dsuppress-stg-reps
Since:

9.6.1

По умолчанию включено

Отключение этого флага добавит аннотации определённым аргументам stg с их представлением prim.

5.13.4. Проверка согласованности

-dlint
Подразумевает:

-dcore-lint, -dstg-lint, -dcmm-lint, -dasm-lint, -fllvm-fill-undef-with-garbage, -fcatch-nonexhaustive-cases, -debug

С:

9.4.1

Включает различные меры проверки целостности внутри проходов GHC и его системы выполнения. Обратите внимание, что это не включает -falignment-sanitisation, так как это влечёт довольно значительные затраты во время выполнения.

-dcore-lint

Включает проверку целостности внутри проходов GHC на уровне ядра (Core). (Проверяется целостность GHC, а не ваша.)

-dlinear-core-lint

Включает проверку линейности в GHC. В настоящее время некоторые оптимизации в GHC могут не сохранять линейность, и существуют корректные программы, которые завершатся с ошибкой Linear Core Lint. В ближайшем будущем этот параметр будет удалён и включён в обычную Core Lint.

-dstg-lint

Аналогично для уровня STG.

-dcmm-lint

Аналогично для уровня C-.

-dasm-lint

Включает проверку целостности внутри проходов GHC на уровне генератора кода.

-fllvm-fill-undef-with-garbage

Указывает генератору кода LLVM на заполнение мёртвых регистров STG мусором вместо undef в вызовах. Это облегчает обнаружение скрытых ошибок генератора кода и системы выполнения (например, см. #11487).

-falignment-sanitisation

Компилировать с проверками выравнивания для всех обращений к таблице информации. Это может быть полезно при поиске проблем с тегами указателей.

-fproc-alignment
С:

8.6.1

Выравнивать функции по кратным заданному значению. Допустимы только степени двойки.

-fproc-alignment=64 можно использовать для ограничения влияния выравнивания на производительность, так как каждая функция будет начинаться с новой строки кэша. Однако принудительное использование более крупных выравниваний обычно снижает производительность.

-fcatch-nonexhaustive-cases

GHC генерирует выражения case без альтернативы по умолчанию в некоторых случаях:

  • Когда анализ спроса считает, что выражение возвращает (т. е. выражение, приводящее к ошибке)
  • Когда scrutinee — это GADT, и его правила типов исключают некоторые конструкторы, а другие конструкторы уже обрабатываются выражением case.

С этим флагом GHC генерирует альтернативу по умолчанию с error в этих случаях. Это полезно при отладке ошибок анализа спроса или проверки типов, которые иногда проявляются как сегментные нарушения.

-forig-thunk-info

При отладке циклических thunk может быть полезно знать исходную таблицу информации thunk, который оценивается. Этот флаг включает логику генерации кода для этого, создавая стек фрейм stg_orig_thunk_info наряду с обычным фреймом обновления; такие фреймы orig_thunk не оказывают операционного воздействия, но сохраняют исходную таблицу информации обновлённого thunk для проверки средствами отладки. Подробнее см. Note [Original thunk info table frames] в GHC.StgToCmm.Bind.

-fcheck-prim-bounds

Обычно операции primops, такие как writeArray#, демонстрируют небезопасное поведение, полагаясь на пользователя для выполнения проверки границ. Этот флаг инструктирует генератор кода на вставку логики проверки границ в такие операции, которая приводит к прерыванию программы при обнаружении доступа за пределы границ.

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

-fcmm-thread-sanitizer

Это включает генерацию ThreadSanitizer <https://github.com/google/sanitizers/wiki/ThreadSanitizerCppManual> инструментирования обращений к памяти. Требуется использование -fsanitize=thread или аналогичного при компиляции и линковке.

5.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 достаточно велико, чтобы часто переполнять — не последовательный порядок

5.13.6. Другие

-dno-typeable-binds

Это позволяет избежать генерации связей, связанных с Typeable, для модулей и типов. Это полезно при отладке, так как это даёт более компактные модули и дампы, но компилятор выдаст ошибку, если вы попытаетесь использовать экземпляры Typeable для вещей, созданных с этим флагом.

-dtag-inference-checks

Когда вывод тегов указывает, что определённое значение должно быть помечено, генерируется код для проверки этого во время выполнения. Если проверка завершится неудачно, программа будет завершена. Это помогает сузить область поиска, если проблема связана с выводом тегов, если что-то пойдёт не так, что в противном случае было бы довольно сложно.

-funoptimized-core-for-interpreter
С:

9.8.1

По умолчанию: включено

В настоящее время ghci отключает оптимизации, потому что не все проходы совместимы с интерпретатором. Этот параметр можно использовать для переопределения этой проверки, например, ghci -O2 -fno-unoptimized-core-for-interpreter. Не рекомендуется для обычного использования и может привести к ошибке компилятора.

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

© 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/9.12.1/docs/users_guide/debugging.html

Spec-Zone.ru

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