Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 14 Apr 2016 21:28:27 +0930
From:      Shane Ambler <FreeBSD@ShaneWare.Biz>
To:        FreeBSD-ports <freebsd-ports@freebsd.org>
Subject:   Need some help with c++/qt5 code
Message-ID:  <570F85E3.6060000@ShaneWare.Biz>

next in thread | raw e-mail | index | archive | help
Hi there, while I am comfortable with c and python, I only know a little
c++ and could use some help.

I am in the process of getting a QT5 based app running on FreeBSD and
have an issue that I'm not sure how to resolve. The project is opentoonz
which is a commercial project that was recently open sourced. The code
base has been previously built only on OSX and windows

By using work others have done to build on linux I have got to the point
of compiling and linking on FreeBSD but get a segfault on startup. The
failing code is part of the variable initialising run before the first
line of main()

I am using clang 3.4.1 on 10-STABLE-amd64, (gcc build needs more work)
the binary is linked to gcc48/libgcc_s.so which is needed for the
superlu/blas libraries that are used.

The class definition is -

class TPanelFactory
{
     QString m_panelType;
     static QMap<QString, TPanelFactory *> m_table;

public:
     TPanelFactory(QString panelType);
     ~TPanelFactory();

     QString getPanelType() const { return m_panelType; }

     virtual void initialize(TPanel *panel) = 0;
     virtual TPanel *createPanel(QWidget *parent);
     static TPanel *createPanel(QWidget *parent, QString panelType);
};

m_table is then in the source file as

QMap<QString, TPanelFactory *> TPanelFactory::m_table;

The segfault happens in the constructor -

TPanelFactory::TPanelFactory(QString panelType)
     : m_panelType(panelType)
{
     assert(m_table.count(panelType) == 0);
     m_table[m_panelType] = this;
}

the last line causes the segfault, if I comment it out then main() is
entered, but I expect removing that line will bite back soon enough.

How can I get this working?

Why would this fail on FreeBSD but not OSX or windows?

The backtrace I get from lldb and gdb -

% lldb opentoonz
Current executable set to 'opentoonz' (x86_64).
(lldb) run
Process 80086 launching
Process 80086 stopped
(lldb) Process 80086 launched: 
'/home/shane/Projects/opentoonz/test_install/bin/opentoonz' (x86_64)
Process 80086 stopped
* (lldb) thread #1: tid = 101033, 0x00000000004f2026 
opentoonz`TPanelFactory::TPanelFactory(QString) + 70, stop reason = 
invalid address (fault address: 0x0)
     frame #0: 0x00000000004f2026 
opentoonz`TPanelFactory::TPanelFactory(QString) + 70
opentoonz`TPanelFactory::TPanelFactory(QString) + 70:
-> 0x4f2026:  cmpl   $0x2, (%rax)
    0x4f2029:  jb     0x4f203d                  ; 
TPanelFactory::TPanelFactory(QString) + 93
    0x4f202b:  movq   0x73eb5e(%rip), %r15      ; opentoonz..got + 6728
    0x4f2032:  movq   %r15, %rdi
(lldb) bt
* thread #1: tid = 101033, 0x00000000004f2026 
opentoonz`TPanelFactory::TPanelFactory(QString) + 70, stop reason = 
invalid address (fault address: 0x0)
   * frame #0: 0x00000000004f2026 
opentoonz`TPanelFactory::TPanelFactory(QString) + 70
     frame #1: 0x0000000000570cfd 
opentoonz`XsheetViewerFactory::XsheetViewerFactory() + 45
     frame #2: 0x000000000056fd47 opentoonz`_GLOBAL__I_a + 1687
     frame #3: 0x0000000000809d22 opentoonz`__do_global_ctors_aux + 34
     frame #4: 0x00000000004854ae opentoonz`_init + 14
     frame #5: 0x0000000800c02c9f
     frame #6: 0x0000000800c0228e
(lldb) quit


% gdb opentoonz
...
(gdb) run
Starting program: /home/shane/Projects/opentoonz/test_install/bin/opentoonz

Program received signal SIGSEGV, Segmentation fault.
0x00000000004f2026 in TPanelFactory::TPanelFactory(QString) ()
(gdb) bt
#0  0x00000000004f2026 in TPanelFactory::TPanelFactory(QString) ()
#1  0x0000000000570cfd in XsheetViewerFactory::XsheetViewerFactory() ()
#2  0x000000000056fd47 in global constructors keyed to a ()
#3  0x0000000000809d22 in __do_global_ctors_aux ()
#4  0x00000000004854ae in _init ()
#5  0x00007fffffffda20 in ?? ()
#6  0x0000000800c02c9f in objlist_call_init () from /libexec/ld-elf.so.1
#7  0x0000000800c0228e in _rtld () from /libexec/ld-elf.so.1
#8  0x0000000800c00449 in .rtld_start () from /libexec/ld-elf.so.1
#9  0x0000000000000000 in ?? ()
(gdb) quit


-- 
FreeBSD - the place to B...Software Developing

Shane Ambler




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?570F85E3.6060000>