Date: Fri, 15 Apr 2016 00:32:42 +0200 From: Dimitry Andric <dim@FreeBSD.org> To: Shane Ambler <FreeBSD@ShaneWare.Biz> Cc: FreeBSD-ports <freebsd-ports@freebsd.org> Subject: Re: Need some help with c++/qt5 code Message-ID: <CC7B253B-DE3B-4049-96D8-A06DB52A0346@FreeBSD.org> In-Reply-To: <570F85E3.6060000@ShaneWare.Biz> References: <570F85E3.6060000@ShaneWare.Biz>
next in thread | previous in thread | raw e-mail | index | archive | help
--Apple-Mail=_D6BBE725-07EA-42AE-9F7C-E39DB9BC4EE2 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii On 14 Apr 2016, at 13:58, Shane Ambler <FreeBSD@ShaneWare.Biz> wrote: >=20 > Hi there, while I am comfortable with c and python, I only know a = little > c++ and could use some help. ... > class TPanelFactory > { > QString m_panelType; > static QMap<QString, TPanelFactory *> m_table; >=20 > public: > TPanelFactory(QString panelType); > ~TPanelFactory(); >=20 > QString getPanelType() const { return m_panelType; } >=20 > virtual void initialize(TPanel *panel) =3D 0; > virtual TPanel *createPanel(QWidget *parent); > static TPanel *createPanel(QWidget *parent, QString panelType); > }; >=20 > m_table is then in the source file as >=20 > QMap<QString, TPanelFactory *> TPanelFactory::m_table; >=20 > The segfault happens in the constructor - >=20 > TPanelFactory::TPanelFactory(QString panelType) > : m_panelType(panelType) > { > assert(m_table.count(panelType) =3D=3D 0); > m_table[m_panelType] =3D this; > } >=20 > 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. >=20 > How can I get this working? >=20 > Why would this fail on FreeBSD but not OSX or windows? Most likely the program depends on the initialization order of global constructors. This is bad practice, and should be avoided. > The backtrace I get from lldb and gdb - >=20 > % 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 =3D 101033, 0x00000000004f2026 = opentoonz`TPanelFactory::TPanelFactory(QString) + 70, stop reason =3D = 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 =3D 101033, 0x00000000004f2026 = opentoonz`TPanelFactory::TPanelFactory(QString) + 70, stop reason =3D = 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 So what's the value of m_table at this point? It looks a lot like it is still uninitialized. -Dimitry --Apple-Mail=_D6BBE725-07EA-42AE-9F7C-E39DB9BC4EE2 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=signature.asc Content-Type: application/pgp-signature; name=signature.asc Content-Description: Message signed with OpenPGP using GPGMail -----BEGIN PGP SIGNATURE----- Version: GnuPG/MacGPG2 v2.0.30 iEYEARECAAYFAlcQGooACgkQsF6jCi4glqP1DwCg2g/z8793VNL3MQ3eBHjOrgiR b9gAn1OArTqnSFdDDIIIu3V6pG4jFSgv =gqqu -----END PGP SIGNATURE----- --Apple-Mail=_D6BBE725-07EA-42AE-9F7C-E39DB9BC4EE2--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CC7B253B-DE3B-4049-96D8-A06DB52A0346>