3

我在代码中的不同点运行了一堆Getmonad 。runGetState他们运行在一个懒惰的ByteString返回readFile。有一个main函数调用了一堆非常短的函数,每个函数都做了一点阅读。

当我main在 GHCI 中运行时,我得到以下信息:

<interactive>: too few bytes. Failed reading at byte position 1

这就是它提供的所有信息。我有两个问题:

  1. 有没有办法从这个错误中获取更多的调试信息?我可以确定哪个特定的调用runGetState失败了吗?行号会很有帮助。我能得到任何其他调试信息吗?

  2. 关于为什么它可能在字节位置 1 失败的任何想法?那是从零开始的吗?即它是否成功读取字节 0 但在 1 上失败,或者它是否在第一个字节上失败?对于它的价值,我可以做print theLazyByteString,它确实打印33026,这是我所期望的。所以文件不是空的,似乎已经成功打开读取。我的假设是“字节​​位置 1”实际上并不是指文件本身的早期点,而是runGetState稍后调用的开始。

4

1 回答 1

4

字节太少。在字节位置读取失败

当使用大于剩余输入的参数调用时,您得到的错误是 (in binary < 0.6) ,还是在剩余输入不包含 0 字节时调用。或者当一些客户端代码调用.getBytesgetLazyByteStringNulfail "too few bytes"

有没有办法从这个错误中获取更多的调试信息?

不,这就是你能从那个错误中得到的一切,它不知道更多。

我可以确定哪个特定的调用runGetState失败了吗?行号会很有帮助。我能得到任何其他调试信息吗?

这是可能的。您可以使用 ghci 调试器(在候选对象上设置断点并逐步执行它们),或者您可以在源代码的关键点插入一些trace调用 ( import Debug.Trace) 以查看您所在的位置。

关于为什么它可能在字节位置 1 失败的任何想法?那是从零开始的吗?即它是否成功读取字节 0 但在 1 上失败,或者它是否在第一个字节上失败?

它是从零开始的(数字是之前读取的字节数)。至于失败的原因,如果没有看到来源和输入,我无法判断。

我的假设是“字节​​位置 1”实际上并不是指文件本身的早期点,而是runGetState稍后调用的开始。

不太可能。这取决于您传递给runGetState调用的偏移量参数。

于 2013-06-11T19:41:18.433 回答