这段代码为什么会产生段错误?

3

我正在尝试编写一个模块,从API解析XML,剥离一些信息,并将结果打印为JSON,但是在打印步骤中遇到了问题。如果我打印出shows,我确实看到数据是正确的,然而用来将记录转换为json的调用encode shows会导致段错误。

{-# LANGUAGE Arrows, NoMonomorphismRestriction, OverloadedStrings #-}
import Network.HTTP
import Text.XML.HXT.Core
import Data.Aeson
import qualified Data.ByteString.Lazy.Char8 as LazyByteString

openUrl :: String -> IO String
openUrl url = getResponseBody =<< simpleHTTP (getRequest url)

composeSearch :: String -> String
composeSearch query = "http://services.tvrage.com/feeds/search.php?show=" ++ urlEncode query

searchShow :: String -> IO String
searchShow query = openUrl $ composeSearch query

data TvShow = TvShow { showName, showId :: String } deriving (Show)

getShow = deep (isElem >>> hasName "show") >>>
    proc x -> do
        name <- getText <<< getChildren <<< deep (hasName "name")  -< x
        id <- getText <<< getChildren <<< deep (hasName "showid") -< x 
        returnA -< TvShow { showName = name, showId = id }

instance ToJSON TvShow where
    toJSON (TvShow name id) = object ["name" .= name, "id" .= id]

main :: IO ()
main = do
    results <- searchShow "Always Sunny" 
    shows <- runX (readString [ withValidate  no ] results >>> getShow)
    putStrLn (LazyByteString.unpack (encode shows))

编辑:正如user1891025所指出的,这可能是我的机器或软件包版本的问题。

  • 系统:Ubuntu 11.04 32位
  • Aeson v0.6.1.0
  • GHC v7.2.1

这个问题越来越具体了,所以我会去IRC寻求帮助,但如果有人能提供任何帮助,请告诉我!


1
它对我来说有效。如果有的话,您可能需要发布您的系统信息、软件包版本和错误信息。 - user1891025
我认为你是正确的。我尝试了一个使用encode的示例,但它也出现了段错误。Aeson(大概)似乎不喜欢我的机器。 :) - Javon Harper
你编译代码时使用了哪些标志?可能存在与您芯片组上的LLVM后端相关的问题。 - Don Stewart
我使用了 ghc --make TvGenius.hs 进行编译,然后只需使用 ./TvGenius 运行可执行文件。 - Javon Harper
在Debian 64位上,使用相同的GHC版本(Ubuntu使用Debian的软件包),但是aeson 0.6.0.2没有崩溃。 - Joachim Breitner
1个回答

0
Aeson的encode函数调用了Data.Text包中的encodeUtf8函数。该函数使用unsafeDupablePerformIO和其他不安全的函数来操作内存。这可能是段错误发生的地方。
请查看此处的代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接