Skip site navigation (1)Skip section navigation (2)
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>