在GHCI中调试“太少字节”错误

时间:2013-06-11 19:04:26

标签: haskell

我在代码的不同位置运行了一堆Get monad runGetState。它们运行在由ByteString返回的惰性readFile上。有一个main函数可以调用一堆非常短的函数,每个函数都会读取一些函数。

当我在GHCI中运行main时,我得到以下内容:

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

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

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

  2. 有关为什么它可能在字节位置1失败的任何想法?这是零基础吗?即它是否成功读取了字节0但是在1上失败了,还是在第一个字节上失败了?对于它的价值,我可以print theLazyByteString,它会打印33026,这是我的预期。因此该文件不为空并且似乎已成功打开以供阅读。我的假设是“字节​​位置1”实际上并不是指文件本身早期的某个点,而是稍后调用runGetState的开始。

1 个答案:

答案 0 :(得分:4)

  

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

当使用大于剩余输入的参数调用binary < 0.6时,您获得的错误(在getBytes中),或者当剩余输入不包含任何输入时调用getLazyByteStringNul 0字节。或者当某些客户端代码调用fail "too few bytes"时。

  

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

不,这就是你从错误中得到的全部,它不仅仅知道更多。

  

我可以确定runGetState的哪个特定调用失败了吗?行号非常有用。我可以获得任何其他调试信息吗?

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

  

有关为什么它可能在字节位置1失败的任何想法?这是零基础吗?即它是否成功读取了字节0但是在1上失败,或者在第一个字节上失败了吗?

它是从零开始的(数字是之前读取的字节数)。至于它失败的原因,我看不出来源和输入。

  

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

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