2012-12-25 135 views
3

我想写一个模块,从api分析xml,去掉一些信息,并将结果打印为json,但是我在打印步骤中遇到了一个呃逆。如果我打印节目,我确实看到正确的数据在那里,但是,将记录转换成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位
  • 埃宋v0.6.1.0
  • GHC v7.2.1

这个问题越来越具体越来越多,所以我将它带到体育馆,但如果任何人有任何帮助,请让我知道!

+1

它适合我。您可能想要发布系统信息,软件包版本和错误消息(如果存在)。 – user1891025

+0

我认为你是对的。我已经尝试过使用'encode'的发布示例,但它也被隔离了。艾森(大概)似乎不喜欢我的机器。 :) –

+0

你使用什么标志来编译代码?可能是与例如芯片组上的LLVM后端。 –

回答

0

Aeson's encode函数调用encodeUtf8来自Data.Text包。该函数使用unsafeDupablePerformIO和其他不安全的函数在内存中查找。这可能是segfault发生的地方。

请参阅代码here

相关问题