Почему этот код вызывает ошибку segfault?

Я пытаюсь написать модуль, который анализирует xml из api, удаляет некоторую информацию и печатает результат как json, но на этапе печати у меня возникла икота. Если я печатаю, то я действительно вижу, что там есть правильные данные, однако вызов, который должен преобразовать записи в json, encode shows, вызывает 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))

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

  • Система: Ubuntu 11.04 32 бит
  • Aeson v0.6.1.0
  • GHC v7.2.1

Этот вопрос становится все более конкретным, поэтому я отвечу на него в irc, но если у кого-нибудь есть помощь, дайте мне знать!


person Javon Harper    schedule 25.12.2012    source источник
comment
Меня устраивает. Вы можете разместить информацию о своей системе, версиях пакетов и сообщения об ошибках, если они существуют.   -  person user1891025    schedule 25.12.2012
comment
Думаю, вы правы. Я пробовал опубликованный пример, в котором также использовался encode, но он также вышел из строя. Эсон (предположительно), похоже, не любит мою машину. :)   -  person Javon Harper    schedule 25.12.2012
comment
Какие флаги вы используете для компиляции кода? Могут быть проблемы, например, с бэкэнд LLVM на вашем чипсете.   -  person Don Stewart    schedule 25.12.2012
comment
Я использовал ghc --make TvGenius.hs для компиляции, а затем просто запустил исполняемый файл с ./TvGenius   -  person Javon Harper    schedule 25.12.2012
comment
Нет сбоев на Debian 64bit с той же версией GHC (Ubuntu использует пакеты Debian), но с aeson 0.6.0.2.   -  person Joachim Breitner    schedule 26.12.2012


Ответы (1)


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

См. Код здесь < / а>.

person Tobias Brandt    schedule 08.05.2013