Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Qshow Segmentation Fault

Tags:

haskell

qt

  setText mb $ "Hello World"
  qshow mb () -- Segmentation Failt 
  --print ("Hello world") -- it works

I'm using qtHaskell but the only trouble I found tracking examples here is qshow segmentation fault.

Can maybe someone have any ideas how can I try to fix it ?

thank you.

added : complete program code :

module Main where

import Qtc.Classes.Qccs
import Qtc.Classes.Gui
import Qtc.ClassTypes.Gui
import Qtc.Core.Base
import Qtc.Gui.Base
import Qtc.Gui.QApplication
import Qtc.Gui.QWidget
import Qtc.Gui.QPushButton
import Qtc.Gui.QAbstractButton
import Qtc.Gui.QMessageBox

type MyQPushButton = QPushButtonSc (CMyQPushButton)
data CMyQPushButton = CMyQPushButton

myQPushButton :: String -> IO (MyQPushButton)
myQPushButton b = qSubClass $ qPushButton b

main :: IO Int
main = do
  qApplication ()
  hello <- myQPushButton "Hello qtHaskell World"
  resize hello (200::Int, 60::Int)
  mb <- qMessageBox hello 
  connectSlot hello "clicked()" hello "click()" $ on_hello_clicked mb
  qshow hello ()
  qApplicationExec ()

on_hello_clicked :: QMessageBox () -> MyQPushButton -> IO ()
on_hello_clicked mb this
  = do
  tt <- text this ()
  setText mb $ "You have clicked " ++ tt
  qshow mb ()

added valgrind log

> > ncdy@Cndy ~/Haskell $ valgrind ./a
> ==13467== Memcheck, a memory error detector
> ==13467== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
> ==13467== Using Valgrind-3.6.0 and LibVEX; rerun with -h for copyright
> info
> ==13467== Command: ./a
> ==13467== 
> 
> ==13467== Syscall param writev(vector[...]) points to
> uninitialised byte(s)
> ==13467==    at 0x40008D2: ??? (in /lib/ld-2.11.2.so)
> ==13467==  Address 0x6e85d97 is 2,703 bytes inside a block of size 16,384
> alloc'd
> ==13467==    at 0x4027834: calloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
> ==13467==    by 0x69C4BD4: XOpenDisplay (in
> /usr/lib/libX11.so.6.3.0)
> ==13467==    by 0x4C505F53: ???
> ==13467== 
> ==13467== 
> ==13467== Process terminating with default action of signal 11 (SIGSEGV)
> ==13467==  General Protection Fault
> ==13467==    at 0x5957480: ??? (in /usr/lib/qt4/libQtGui.so.4.7.1)
> ==13467==    by 0x5B5FD81: ??? (in /usr/lib/qt4/libQtGui.so.4.7.1)
> ==13467==    by 0x5B6BC19: ??? (in /usr/lib/qt4/libQtGui.so.4.7.1)
> ==13467==    by 0x5B71B3C: ??? (in /usr/lib/qt4/libQtGui.so.4.7.1)
> ==13467==    by 0x5AE757D: QPainter::drawPixmap(QRectF const&,
> QPixmap const&, QRectF const&) (in
> /usr/lib/qt4/libQtGui.so.4.7.1)
> ==13467==    by 0xA71AA68: Oxygen::Helper::renderWindowBackground(QPainter*,
> QRect const&, QWidget const*, QWidget
> const*, QColor const&, int, int) (in
> /usr/lib/liboxygenstyle.so.4.5.0)
> ==13467== Invalid free() / delete / delete[]
> ==13467==    at 0x402868B: free (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
> ==13467==    by 0x52F78DB: ??? (in /lib/libc-2.11.2.so)
> ==13467==    by 0x105FFFF: ???
> ==13467==  Address 0x5133a98 is not stack'd, malloc'd or (recently) free'd
> ==13467== 
> ==13467== 
> ==13467== HEAP SUMMARY:
> ==13467==     in use at exit: 1,968,209 bytes in 27,864 blocks
> ==13467==   total heap usage: 65,595 allocs, 37,732 frees, 6,175,162 bytes
> allocated
> ==13467== 
> ==13467== LEAK SUMMARY:
> ==13467==    definitely lost: 18,054 bytes in 259 blocks
> ==13467==    indirectly lost: 94,591 bytes in 628 blocks
> ==13467==      possibly lost: 489,039 bytes in 5,656 blocks
> ==13467==    still reachable: 1,366,525 bytes in 21,321 blocks
> ==13467==         suppressed: 0 bytes in 0 blocks
> ==13467== Rerun with --leak-check=full to see details of leaked memory
> ==13467== 
> ==13467== For counts of detected and suppressed errors, rerun with: -v
> ==13467== Use --track-origins=yes to see where uninitialised values come
> from
> ==13467== ERROR SUMMARY: 3 errors from 2 contexts (suppressed: 15 from 8)
> Segmentation fault

added : build command

ghc --make -package qt -fglasgow-exts -O2 -o a HCK.hs -i

@Foo Bah the question was asked on 18 December, I can't be sure with my answers but OS was Windows7 , tell me what exactly can I tell about the system ?

@Vlad Lazarenko I know but it was windows for sure )

@Foo Bah Using cygwin, huh ? Where I need to use it ? I am on this machine and I can make another try for qtHaskell and check the current situation but I guess there will be another versions.

like image 408
cnd Avatar asked Dec 18 '10 21:12

cnd


1 Answers

There are a couple spots that may cause trouble in your example. I emphasize may here as dealing with memory issues can be very dependent on which library you have doing your memory management.

First, you will want to notify qtHaskell when garbage collection should run. I would place this at the end of your on_hello_clicked routine. The appropriate call is returnGC. It is also a good idea to place another returnGC call at the end of your main function.

Second, your main function is specifying an integer parameter that doesn't exist. You should specify main as main :: IO ()

So, the full code would be:

module Main where

import Qtc.Classes.Qccs
import Qtc.Classes.Gui
import Qtc.ClassTypes.Gui
import Qtc.Core.Base
import Qtc.Gui.Base
import Qtc.Gui.QApplication
import Qtc.Gui.QWidget
import Qtc.Gui.QPushButton
import Qtc.Gui.QAbstractButton
import Qtc.Gui.QMessageBox

type MyQPushButton = QPushButtonSc (CMyQPushButton)
data CMyQPushButton = CMyQPushButton

myQPushButton :: String -> IO (MyQPushButton)
myQPushButton b = qSubClass $ qPushButton b

main :: IO ()
main = do
  qApplication ()
  hello <- myQPushButton "Hello qtHaskell World"
  resize hello (200::Int, 60::Int)
  mb <- qMessageBox hello 
  connectSlot hello "clicked()" hello "click()" $ on_hello_clicked mb
  qshow hello ()
  qApplicationExec ()
  returnGC

on_hello_clicked :: QMessageBox () -> MyQPushButton -> IO ()
on_hello_clicked mb this
  = do
  tt <- text this ()
  setText mb $ "You have clicked " ++ tt
  qshow mb ()
  returnGC

This compiles and runs nicely on WindowsXP + Cygwin as well as MacOS 10.6

like image 118
Seth Avatar answered Sep 23 '22 03:09

Seth