我在代码的不同位置运行了一堆Get
monad runGetState
。它们运行在由ByteString
返回的惰性readFile
上。有一个main
函数可以调用一堆非常短的函数,每个函数都会读取一些函数。
当我在GHCI中运行main
时,我得到以下内容:
<interactive>: too few bytes. Failed reading at byte position 1
这是它提供的所有信息。我有两个问题:
有没有办法从此错误中获取更多调试信息?我可以确定runGetState
的哪个特定调用失败了吗?行号非常有用。我能得到的任何其他调试信息?
有关为什么它可能在字节位置1失败的任何想法?这是零基础吗?即它是否成功读取了字节0但是在1上失败了,还是在第一个字节上失败了?对于它的价值,我可以print theLazyByteString
,它会打印33026
,这是我的预期。因此该文件不为空并且似乎已成功打开以供阅读。我的假设是“字节位置1”实际上并不是指文件本身早期的某个点,而是稍后调用runGetState
的开始。
答案 0 :(得分:4)
字节太少了。在字节位置读取失败
当使用大于剩余输入的参数调用binary < 0.6
时,您获得的错误(在getBytes
中),或者当剩余输入不包含任何输入时调用getLazyByteStringNul
0字节。或者当某些客户端代码调用fail "too few bytes"
时。
有没有办法从此错误中获取更多调试信息?
不,这就是你从错误中得到的全部,它不仅仅知道更多。
我可以确定
runGetState
的哪个特定调用失败了吗?行号非常有用。我可以获得任何其他调试信息吗?
这是可能的。您可以使用ghci调试器(在候选者上设置断点并逐步执行它们),或者您可以在源中的关键点插入一些trace
个调用(import Debug.Trace
)以查看您的位置。
有关为什么它可能在字节位置1失败的任何想法?这是零基础吗?即它是否成功读取了字节0但是在1上失败,或者在第一个字节上失败了吗?
它是从零开始的(数字是之前读取的字节数)。至于它失败的原因,我看不出来源和输入。
我的假设是“字节位置1”实际上并不是指文件本身的早期某个点,而是稍后调用
runGetState
的开始。
不太可能。这取决于您传递给runGetState
调用的偏移量参数。