From: Jules B. <ju...@je...> - 2008-03-13 19:39:32
|
Eric Kow wrote: > Hi Jules, > > Is this the same bug as this one from the Tracker? > http://sourceforge.net/tracker/index.php?func=detail&aid=1003006&group_id=73133&atid=536845 > > (was submitted by Paul Johnson, I think) > > Also, if you are so inclined, it would be extra-helpful if you could > submit your demonstrator as a test case in the bugs/ directory (darcs > send). It would be extra-extra-helpful if you could work out a way to > reproduce this bug very consistently (for example, by repeatedly > loading the image in or something) Hi Eric, It does look like it could well be the same bug. Although seems surprising for there to be a hole in the memory? Perhaps it is being moved by GC... but GC doesn't move memory which was allocated by a C(++) library does it? I can reproduce the bug simply by creating images over and over and over again. Here is a fairly minimal testcase, at the bottom of this mail. It always seems to segfault for me, normally after about 5 iterations, sometimes as many as 22. It's interesting that there is a very long pause before the segfault. That is, one iteration of creating an image is normally a tiny tiny fraction of a second, but if it's going to segfault, there is a long pause. I tried running with -Sstderr to see if I could see an obvious link between garbage collections and crashes, but if there is one it isn't obvious to me! Happy to try more stuff to pin this down, let me know what I can do. Jules import qualified Graphics.UI.WX as WX import Graphics.UI.WXCore.Image import Graphics.UI.WXCore.Draw import Graphics.UI.WXCore.WxcClassesAL import Graphics.UI.WXCore.WxcClassesMZ import Foreign import Data.Word import Control.Monad main = do forM_ [0..500] (\i -> putStrLn ("Iteration : " ++ show i) >> createAndGetPixels) createAndGetPixels = do bmp <- bitmapCreateEmpty (WX.Size 256 256) 24 pixelsFromBitmap bmp pixelsFromBitmap bmp = do image <- imageCreateFromBitmap bmp pixels <- imageGetData image putStrLn $ "pixels : " ++ show pixels bytes <- peekArray 8 (castPtr pixels) putStrLn $ "bytes : " ++ show (bytes :: [Word8]) WX.Size w h <- imageGetSize image putStrLn $ "Image size : " ++ show (w,h) pixs <- imageGetPixels image putStrLn $ "number of pixs = " ++ show (length pixs) putStrLn $ "first pixel " ++ show (head pixs) |