2012-12-25 3 views
3

Я пытаюсь написать модуль, который анализирует xml из api, удаляет некоторую информацию и печатает результат как json, но я ударил икоту на этапе печати. Если я печатаю шоу, я действительно вижу, что есть правильные данные, однако вызов, который должен преобразовать записи в json, encode shows, создает segfault.Зачем этот код создает segfault?

{-# 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)) 

Edit: Как user1891025 указал, это может быть проблема с моей машины или пакет версий.

  • система: Ubuntu 11.04 32bit
  • эсон v0.6.1.0
  • GHC v7.2.1

Этот вопрос становится повышение конкретных, так что я возьму его в ИРЦ, но если кто-нибудь имеет помощь, пожалуйста, дайте мне знать!

+1

Это работает для меня. Вы можете опубликовать информацию о своей системе, версии пакета и сообщения об ошибках, если они существуют. – user1891025

+0

Я думаю, что вы правы. Я пробовал опубликованный пример, который также использовал 'encode', но он также был прерван. Кажется, что Aeson (по-видимому) мне не нравится. :) –

+0

Какие флаги вы используете для компиляции кода? Могут быть проблемы с, например, LLVM на вашем чипсете. –

ответ

0

Aeson's encode вызов функции encodeUtf8 от Data.Text упаковка. Эта функция использует unsafeDupablePerformIO и другие небезопасные функции, чтобы сориентироваться в памяти. Это возможно, когда происходит segfault.

См. Код here.

 Смежные вопросы

  • Нет связанных вопросов^_^