在 GHCi 内的包模块中调试 IO

2023-12-30

我正在 Haskell 中进行低级 IO(用于库绑定)并且遇到了段错误。我想使用 GHCi:break弄清楚发生了什么,但发生的事情是这样的:

> import SDL
> :break SDL.setPaletteColors
cannot set breakpoint on setPaletteColors: module SDL.Video.Renderer is not interpreted

由于有问题的代码不在我自己的模块内,而是在外部包的模块内,因此它作为编译代码加载,显然我无法使用:break在已编译的模块上。

GHCi 手册 https://www.haskell.org/platform/doc/2014.2.0.0/ghc/users_guide/ghci-debugger.html#idm39475824768证实了这一点并提供了提示:

有一个主要限制:断点和单步只能在解释模块中使用;编译后的代码对于调试器是不可见的[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?),但在这一点上,这似乎是一种非常尴尬的做事方式,我没有进一步追求它。

EDIT:

我实际上尝试过并得到了令人困惑的结果:

> :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

我(未经教育的)猜测:这是因为外部模块仍然以二进制形式链接到我的代码,并且在解释模式下动态加载它不会改变这一点。


所以,总结一下这个问题:在外部包中调试 IO 的好方法是什么?

补充笔记:

  1. 我确实有我需要调试的包的源代码;事实上,它已添加到项目中cabal 沙箱添加源

  2. 使用 GHCi 的另一种选择是将跟踪添加到包源中,但这是一个不幸的选择,因为它涉及每次修改时重新编译包(每当我需要有关执行和修改跟踪的更多信息时),并且需要很长时间。使用 GHCi 进行交互式调试似乎是完成这项工作的更好工具,只要我知道如何使用它就好了。


Stack对此有一些支持。跑步stack ghci --load-local-deps $TARGET将加载您的项目以及其中的任何依赖项packages现场stack.yaml,包括它们是否被标记为extra-deps。然后断点就可以工作了。您可以通过运行来调试 GHCi 中的依赖项stack unpack $PACKAGE并将其添加到packages in stack.yaml.

然而,这并不是万能药。如果包具有冲突的包全局语言扩展(或其他动态标志)或模块名称冲突,则它将无法工作。例如,如果您的顶级包有default-extensions: NoImplicitPrelude而您的依赖项则不会,它们不会导入前奏,并且几乎肯定不会加载。看这个 GHC 错误 https://ghc.haskell.org/trac/ghc/ticket/10827.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 GHCi 内的包模块中调试 IO 的相关文章

  • 在 Haskell 中使用 Maybe 类型

    我正在尝试利用 Haskell 中的 Maybe 类型 我有一个查找返回 Maybe 的键 值元组 如何访问 Maybe 包装的数据 例如 我想将 Maybe 包含的整数与另一个整数相加 或者 您可以进行模式匹配 case maybeVal
  • 在 Web.Scotty 中使用 StateT

    我正在尝试制作一个愚蠢的网络服务器 将数据存储为State 我在用着Web Scotty http hackage haskell org package scotty 我之前用过 ReaderT 和 scotty 来访问配置 https
  • 优化计算 200 万以下所有素数总和的 Haskell 代码

    欧拉计划中的问题 10 我在那里看到了一些讨论 但仅限于 C 我用下面的代码来计算 print sum sieve 2 2000000 where sieve sieve x xs x sieve filter 0 mod x xs 需要很
  • 使用 OpenGL 进行子弹调试抽屉

    我已经摆弄了子弹一段时间 现在我想绘制调试 我有一个 opengl 世界 具有有效的子弹物理和一切 我尝试过的是这样的 我创建了一个像这样的 GLDebugDrawer 类 include LinearMath btIDebugDraw h
  • Haskell - 让函数返回空字符

    我正在尝试创建一个函数来删除字符串中的每个第 n 个元素 dropEvery String gt Int gt String dropEvery str n map char indx gt if indx mod n 0 then cha
  • 数据记录的类约束

    我有一个data type data BuildException a KillBuild JobID a Stage FailBuild JobID a Stage CancelBuild JobID a Stage StopBuild
  • 是否可以调试当前正在运行的生产节点应用程序?

    在本地我通过运行进行调试node debug并使用node inspector工具 节点检查器必须在后台运行 然后我将浏览器指向 并非所有浏览器都可以工作 Chrome 可以 http 127 0 0 1 8080 debug port 5
  • 追踪 int[] 的分配情况

    当查看我的remote通过 JMX 在 JVisualVM 中的应用程序中 我看到空闲时内存使用呈锯齿状 进行堆转储并使用 JVisualVM 进行分析 我发现很大一部分内存位于几个大的内存中int 没有引用的数组 通过比较堆转储 我可以看
  • Visual Studio 如何在调试期间显示 System.Double?

    尝试调试以下简单程序 并将鼠标悬停在x在每个步骤中 或 添加监视 x管他呢 using System using System Globalization static class Program static double x stati
  • Haskell 乘加运算的数学性能

    我正在用 Haskell 编写一个游戏 我当前在 UI 上的传递涉及大量几何图形的程序生成 我目前专注于识别一项特定操作的性能 C ish 伪代码 Vec4f multiplier addend Vec4f vecList for int
  • 用于启用扩展序列化调试信息的 Java 标志

    我目前正在努力解决 tomcat 上复杂对象的 HTTP 会话复制问题 一些对象实现Serializable但持有不可序列化的成员 不幸的是 默认情况下 堆栈跟踪不会提供太多有用的信息 有一个标志 XX 启用详细类名当发生 NotSeria
  • 如何在 Haskell 中处理这个简单的 IO 异常

    全部处理 在下面的代码中 getDirectoryContents dir可能会失败 例如dir可能不存在 如何捕获这个并向用户抛出有意义的消息 我知道 IO 异常处理已经被问过很多次了 但我仍然找不到一个简单的方法来做到这一点 walk
  • 为什么 Visual Studio 项目的命令行设置要按用户存储?可以签入(并共享).user 设置文件吗?

    我们正在创建一个能够理解一些命令行参数的应用程序 我们希望在调试时在命令行上提供一些默认值 这些可以在项目设置中轻松设置正如这里所解释的 https stackoverflow com questions 298708 debugging
  • 我可以显示我在 PHP 中设置的所有 cookie 吗?

    我正在尝试诊断 cookie 中的错误 但 cookie 的名称不是应有的名称 PHP 有没有办法打印我的域设置的所有 cookie 你有没有尝试过 print r COOKIE
  • 如何在GDB中重新运行程序多次?

    我有一个程序偶尔会失败 但出现相同的错误 为了调试它 我想在 GDB 下运行它 直到它失败 设置断点并重新运行它 我该怎么办 gdb args path to program
  • Haskell 中的模式匹配正则表达式模式

    在 Scala 中 我有一个正则表达式模式匹配 如下所示 val Regex d 4 d 2 d 2 r val Regex year month day 2013 01 06 结果是 year String 2013 month Stri
  • 如何构图“也许”镜头?

    如果我有嵌套记录的镜头 其中每个镜头返回一个Maybe 我怎样才能让它们组合起来 这样如果 遍历 中有任何东西返回一个Nothing最终结果是Nothing data Client Client clientProperties Maybe
  • 为什么这个 HasField 实例没有被解析?

    我在用着GHC 8 2 1 我有以下模块 LANGUAGE FlexibleInstances LANGUAGE MultiParamTypeClasses LANGUAGE UndecidableInstances LANGUAGE Ty
  • VS2010中VSHost.exe不断启动

    我正在 VS2010 中使用一个包含大量项目的解决方案 但它不断变得无响应 我注意到的一件事可能是一条线索 尽管我尚未开始任何调试 但 MyApplicationName vshost exe 不断出现在进程列表中 也许每当构建发生时它就会
  • 如何在haskell快速傅里叶变换上应用数据并行?

    我有一个 haskell 代码来解决快速傅里叶变换 并且我想对其应用数据并行性 然而 我使用的每一个策略都会产生太多的火花 而且大多数都溢出了 有谁知道如何在以下算法上应用良好的数据并行策略 radix 2 Cooley Tukey FFT

随机推荐

  • jsTree如何更改ajax url并重新加载数据

    jstree demo div2 jstree core data url tree ashx id id dataType json needed only if you do not supply JSON headers checkb
  • iTunes Connect - 总安装量与已安装该应用程序的当前设备的比较

    我如何知道或计算 iOS 应用程序的总安装量与安装该应用程序的当前设备的比较 我有总计单位 据我所知 这是总安装数 而不是现在有多少设备拥有我的应用程序 您可以使用第三方框架获取有关应用程序统计信息的更多详细信息 例如Flurry http
  • “模板只能与字段访问、属性访问、一维数组索引或单参数自定义索引器表达式一起使用”错误

    为什么我收到错误 模板只能与字段访问 属性访问 一维数组索引或单参数自定义索引器表达式一起使用 在这段代码中 model IEnumerable
  • 如何在 R 中进行词形还原?

    这个问题可能是重复的R 或 python 中的词形还原器 am are is gt be https stackoverflow com questions 22993796 lemmatizer in r or python am are
  • 显示 xml 而不是站点

    我正在学习谷歌云 所以我尝试使用存储服务在那里部署我的反应应用程序 为此 我创建了一个名为 Travelfrontend 的存储桶 并从使用时生成的构建文件夹上传了文件和文件夹yarn build 我没有任何域名 所以我尝试从https s
  • 将 jwt 令牌发送到 wif wcf 服务

    我在向 wcf 服务发送 jwt 令牌时遇到问题 遵循了这个 它几乎有效 将 JWT SecurityToken 传递给 WCF 客户端 https stackoverflow com questions 16312907 deliveri
  • 在 VsCode 中将 () 替换为 {} 最有效的方法是什么?

    我正在使用 Visual Studio Code 经常发现自己必须替换括号 code 带大括号 code
  • Visual Studio 2013 发布失败超出最大连接数

    我正在使用 VS Express 2013 for Web 进行发布 在发布时其中一个 dll 上出现套接字错误 现在我根本无法发布 我收到一条 VS 错误 指出已超出此站点的最大连接数 了解更多信息 http go microsoft c
  • Mysql 返回子句等效

    我是 MySql 的新手 所以请温柔一点 是否有相当于RETURNINGOracle 中的子句或Inserted DeletedMySQL 中 SQL Server 中的表 我想做的是 从表 A 中删除一组行 将删除的行集插入表 B 中 请
  • SQL Server 视图中的模拟?

    是否可以通过模拟创建视图 类似于 execute as 在存储过程中 我想在单独的模式中创建一些视图 一些用户应该得到SELECT and UPDATE访问这些视图 以便它们能够更改基础表 但无需直接更新表 有观点可能吗 不 这是不可能的
  • 集成express.js应用程序和docpad

    我一直在使用 docpad 预先生成前端 html js 应用程序 使用docpad generate env static 经过几次挂断和 balupton 的错误修复后 它现在工作得很好 并节省了我很多时间 我只是将这些文件复制到现有的
  • 根据产品类型向产品价格添加自定义文本标签

    我有一个小问题还无法解决 我有这个WooCommerce 网站 http www wholesaleunderwear co product men s crew sport sock w logo 具有可变产品 目前价格显示方式如下 每打
  • 从一维数组创建二维数组

    如果我有多个相同数据类型的数组 将它们全部复制到二维数组中的最佳方法是什么 例如 int array1 1 2 3 4 5 6 7 8 9 10 int array2 9 8 7 6 5 4 3 2 1 0 int array2d pseu
  • 检查ip地址是否在私有范围内

    如何检查 IP 地址是否属于私有类别 if isPrivateIPAddress ipAddress do something 任何建议将不胜感激 更新的答案 private static boolean isPrivateIPAddres
  • 检测合成器是否正在运行

    我希望我的 UI 根据屏幕是否合成 从而支持某些效果 来更改设计 是否有可能 可靠地查询 X 服务器是否正在运行合成窗口管理器 打开 关闭合成时收到通知吗 解决方案 为了向不太熟悉 X11 API 的人详细说明 Andrey Sidorov
  • 如何在 MATLAB 中将字符串作为函数参数传递?

    基本上 我有 10 个数据文件 我编写了一个 MATLAB 函数来处理这些数据 代码是这样的 function Z fitdata file path A importdata file path end 由于我不想输入相同的命令 10 次
  • SO_LINGER 和关闭套接字(WINSOCK)

    我正在编写一个多线程winsock应用程序 并且在关闭套接字时遇到一些问题 首先 同时打开的套接字数量是否有限制 假设一次有 32 个插座 我在其中一个套接字上建立了连接 并传递信息 一切顺利 问题是当我断开套接字然后重新连接到同一目标时
  • 为什么 django 对表单字段调用 __init__() 两次

    我正在尝试使用django 简单 自动完成 https github com praekelt django simple autocomplete以一种形式 但是 当我将调试打印添加到simple autocomplete widgets
  • JSON 中的 HTML 标签(Python 中)

    我知道这不是一个理想的情况 但是如果我需要在 JSON 标签中包含某种 HTML 例如 node list ul li class lists Hello World li ul 这可以在Python中做到而不需要事先转义吗 它最初是一个字
  • 在 GHCi 内的包模块中调试 IO

    我正在 Haskell 中进行低级 IO 用于库绑定 并且遇到了段错误 我想使用 GHCi break弄清楚发生了什么 但发生的事情是这样的 gt import SDL gt break SDL setPaletteColors canno