Отладка ввода-вывода в модуле пакета внутри GHCi
Я делаю IO низкого уровня (для связывания библиотек) в Haskell и испытываю segfault. Я хотел бы использовать GHCi:перерыв чтобы понять, что происходит, но вот что происходит:
> import SDL
> :break SDL.setPaletteColors
cannot set breakpoint on setPaletteColors: module SDL.Video.Renderer is not interpreted
Поскольку нарушающий код находится не внутри моих собственных модулей, а скорее внутри модуля во внешнем пакете, он загружается как скомпилированный код и, очевидно, я не могу его использовать.:перерыв на скомпилированных модулях.
Руководство по GHCi подтверждает это и дает подсказку:
Есть одно главное ограничение: точки останова и пошаговое выполнение доступны только в интерпретируемых модулях; скомпилированный код невидим для отладчика [5].
[5] Обратите внимание, что пакеты содержат только скомпилированный код, поэтому для отладки пакета необходимо найти его источник и загрузить его напрямую.
Давайте попробуем это напрямую:
> :load some_path/sdl2/src/SDL/Video/Renderer.hs
some_path/sdl2/src/SDL/Video/Renderer.hs:101:8:
Could not find module ‘Control.Monad.IO.Class’
It is a member of the hidden package ‘transformers-0.3.0.0’.
Perhaps you need to add ‘transformers’ to the build-depends in your .cabal file.
Use -v to see a list of the files searched for.
Я могу добавить зависимости в мой файл .cabal, но это уже кажется неправильным. Как только я это сделал:
> :load some_path/sdl2/src/SDL/Video/Renderer.hs
some_path/sdl2/src/SDL/Video/Renderer.hs:119:8:
Could not find module ‘SDL.Internal.Numbered’
it is a hidden module in the package ‘sdl2-2.0.0’
Use -v to see a list of the files searched for.
Я мог бы сделать эти модули общедоступными (возможно, «изменив пакет .cabal»), но на данный момент это кажется очень неловким способом сделать что-то, и я не стал его развивать.
РЕДАКТИРОВАТЬ:
Я действительно попробовал это и получил удивительный результат:
> :load some_path/sdl2/src/SDL/Video/Renderer.hs
[1 of 1] Compiling SDL.Video.Renderer ( some_path/sdl2/src/SDL/Video/Renderer.hs, interpreted )
Ok, modules loaded: SDL.Video.Renderer.
> :break SDL.setPaletteColors
cannot set breakpoint on SDL.setPaletteColors: module SDL.Video.Renderer is not interpreted
Мое (необразованное) предположение: это потому, что внешний модуль все еще связан с моим кодом в виде двоичного файла, и загрузка его динамически в интерпретируемом режиме не меняет этого.
Итак, подведем итоги вопроса: Что такое хороший способ отладки ввода-вывода во внешнем пакете?
Дополнительные примечания:
У меня есть исходный код пакета, который мне нужен для отладки; на самом деле, он был добавлен в проект сКабал песочница add-source
Альтернативным вариантом использования GHCi было бы добавление трассировок в исходный код пакета, но это неудачный вариант, поскольку он включает перекомпиляцию пакета при каждой модификации (всякий раз, когда мне нужно больше информации о выполнении и изменении трассировок), и это занимает очень много времени. Интерактивная отладка с помощью GHCi кажется лучшим инструментом для этой работы, если бы я только знал, как его использовать.