Wednesday, March 13, 2019

Callback via C++ template

The following code would make a callback via template:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#include <iostream>


template <typename F>
void call(F func)
{
    func();
}


void print()
{
    std::cout << __FUNCTION__ << "()" << std::endl;
}

int main()
{
    call(print);
}

Sunday, March 10, 2019

Debugging Issues related to GLib

Got this problem when running my compiled wxformbuilder:


***MEMORY-ERROR***: wxformbuilder[19377]: GSlice: assertion failed: aligned_memory == (gpointer) addr
Aborted (core dumped)

The workaround is to embed G_SLICE=always-malloc when invoking the command-line, e.g:

G_SLICE=always-malloc ./wxformbuilder 

According to the GLib documentation:

always-malloc:This will cause all slices allocated through g_slice_alloc() and released by g_slice_free1() to be actually allocated via direct calls to g_malloc() and g_free(). This is most useful for memory checkers and similar programs that use Boehm GC alike algorithms to produce more accurate results. It can also be in conjunction with debugging features of the system's malloc() implementation such as glibc's MALLOC_CHECK_=2 to debug erroneous slice allocation code, although debug-blocks is usually a better suited debugging tool.

To debug the issue, valgrind is our friend in this case.

For example, when running it with valgrind it shows a lot of memory leaks (apparently some issues in wxWidgets):



valgrind ./wxformbuilder

==18887== Memcheck, a memory error detector

==18887== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.

==18887== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info

==18887== Command: ./wxformbuilder

==18887==

==18887== Invalid free() / delete / delete[] / realloc()
==18887== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)

==18887== by 0x6EAE3D0: wxLocale::GetSystemEncodingName() (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6EAEA2A: wxLocale::GetSystemEncoding() (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6F06C18: wxCSConv::SetEncoding(wxFontEncoding) (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6F0D2E3: wxCSConv::wxCSConv(wxFontEncoding) (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6F0D398: wxGet_wxConvLocalPtr() (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6DD07CE: _GLOBAL__sub_I_strconv.cpp (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x4010732: call_init (dl-init.c:72)

==18887== by 0x4010732: _dl_init (dl-init.c:119)

==18887== by 0x40010C9: ??? (in /lib/x86_64-linux-gnu/ld-2.27.so)

==18887== Address 0x4029fe0 is in a rwx anonymous segment

==18887==

==18887== Invalid read of size 16

==18887== at 0x7E8798D: __wcsnlen_sse4_1 (strlen.S:117)

==18887== by 0x7E74EC1: wcsrtombs (wcsrtombs.c:104)

==18887== by 0x6F8B13F: wxWC2MB(char*, wchar_t const*, unsigned long) (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6F07CD5: wxMBConv::FromWChar(char*, unsigned long, wchar_t const*, unsigned long) const (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6F14F78: wxString::AsChar(wxMBConv const&) const (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6F0C2F9: wxCSConv::DoCreate() const (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6F0D2EB: wxCSConv::wxCSConv(wxFontEncoding) (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6F0D398: wxGet_wxConvLocalPtr() (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6DD07CE: _GLOBAL__sub_I_strconv.cpp (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x4010732: call_init (dl-init.c:72)

==18887== by 0x4010732: _dl_init (dl-init.c:119)

==18887== by 0x40010C9: ??? (in /lib/x86_64-linux-gnu/ld-2.27.so)

==18887== Address 0x14d47b30 is 8 bytes after a block of size 24 alloc'd

==18887== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)

==18887== by 0x6F07DB7: wxMBConv::FromWChar(char*, unsigned long, wchar_t const*, unsigned long) const (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6F14F78: wxString::AsChar(wxMBConv const&) const (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6F0C2F9: wxCSConv::DoCreate() const (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6F0D2EB: wxCSConv::wxCSConv(wxFontEncoding) (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6F0D398: wxGet_wxConvLocalPtr() (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6DD07CE: _GLOBAL__sub_I_strconv.cpp (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x4010732: call_init (dl-init.c:72)

==18887== by 0x4010732: _dl_init (dl-init.c:119)

==18887== by 0x40010C9: ??? (in /lib/x86_64-linux-gnu/ld-2.27.so)

==18887==

==18887== Invalid read of size 16

==18887== at 0x7E87992: __wcsnlen_sse4_1 (strlen.S:117)

==18887== by 0x7E74EC1: wcsrtombs (wcsrtombs.c:104)

==18887== by 0x6F8B13F: wxWC2MB(char*, wchar_t const*, unsigned long) (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6F07CD5: wxMBConv::FromWChar(char*, unsigned long, wchar_t const*, unsigned long) const (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6F14F78: wxString::AsChar(wxMBConv const&) const (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6F0C2F9: wxCSConv::DoCreate() const (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6F0D2EB: wxCSConv::wxCSConv(wxFontEncoding) (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6F0D398: wxGet_wxConvLocalPtr() (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6DD07CE: _GLOBAL__sub_I_strconv.cpp (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x4010732: call_init (dl-init.c:72)

==18887== by 0x4010732: _dl_init (dl-init.c:119)

==18887== by 0x40010C9: ??? (in /lib/x86_64-linux-gnu/ld-2.27.so)

==18887== Address 0x14d47b40 is 16 bytes after a block of size 32 in arena "client"

==18887==

==18887== Conditional jump or move depends on uninitialised value(s)

==18887== at 0x7E87A61: __wcsnlen_sse4_1 (strlen.S:161)

==18887== by 0x7E74EC1: wcsrtombs (wcsrtombs.c:104)

==18887== by 0x6F8B13F: wxWC2MB(char*, wchar_t const*, unsigned long) (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6F07CD5: wxMBConv::FromWChar(char*, unsigned long, wchar_t const*, unsigned long) const (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6F14F78: wxString::AsChar(wxMBConv const&) const (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6F0C2F9: wxCSConv::DoCreate() const (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6F0D2EB: wxCSConv::wxCSConv(wxFontEncoding) (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6F0D398: wxGet_wxConvLocalPtr() (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6DD07CE: _GLOBAL__sub_I_strconv.cpp (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x4010732: call_init (dl-init.c:72)

==18887== by 0x4010732: _dl_init (dl-init.c:119)

==18887== by 0x40010C9: ??? (in /lib/x86_64-linux-gnu/ld-2.27.so)

==18887==

==18887== Invalid free() / delete / delete[] / realloc()

==18887== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)

==18887== by 0x6EAE3D0: wxLocale::GetSystemEncodingName() (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x629CE5E: wxApp::Initialize(int&, wchar_t**) (in /usr/local/lib/libwx_gtk3u_core-3.1.so.3.0.0)

==18887== by 0x6EABB9C: wxEntryStart(int&, wchar_t**) (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6EAC5A9: wxInitialize(int&, wchar_t**) (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6EAC5FA: wxEntry(int&, wchar_t**) (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x1E8D57: main (maingui.cpp:83)

==18887== Address 0x4029fc0 is in a rwx anonymous segment

==18887==

==18887== Invalid read of size 16

==18887== at 0x7E87AC2: __wcsnlen_sse4_1 (strlen.S:194)

==18887== by 0x7E74EC1: wcsrtombs (wcsrtombs.c:104)

==18887== by 0x6F8B13F: wxWC2MB(char*, wchar_t const*, unsigned long) (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6F07CD5: wxMBConv::FromWChar(char*, unsigned long, wchar_t const*, unsigned long) const (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6F14F78: wxString::AsChar(wxMBConv const&) const (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6E763C4: wxString::AsCharBuf(wxMBConv const&) const (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x7016906: wxSetEnv(wxString const&, wxString const&) (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x629D359: wxApp::Initialize(int&, wchar_t**) (in /usr/local/lib/libwx_gtk3u_core-3.1.so.3.0.0)

==18887== by 0x6EABB9C: wxEntryStart(int&, wchar_t**) (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6EAC5A9: wxInitialize(int&, wchar_t**) (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6EAC5FA: wxEntry(int&, wchar_t**) (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x1E8D57: main (maingui.cpp:83)

==18887== Address 0x14e00f20 is 0 bytes after a block of size 80 alloc'd

==18887== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)

==18887== by 0x6F07DB7: wxMBConv::FromWChar(char*, unsigned long, wchar_t const*, unsigned long) const (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6F14F78: wxString::AsChar(wxMBConv const&) const (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6E763C4: wxString::AsCharBuf(wxMBConv const&) const (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x7016906: wxSetEnv(wxString const&, wxString const&) (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x629D359: wxApp::Initialize(int&, wchar_t**) (in /usr/local/lib/libwx_gtk3u_core-3.1.so.3.0.0)

==18887== by 0x6EABB9C: wxEntryStart(int&, wchar_t**) (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6EAC5A9: wxInitialize(int&, wchar_t**) (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6EAC5FA: wxEntry(int&, wchar_t**) (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x1E8D57: main (maingui.cpp:83)

==18887==

==18887== Invalid read of size 16

==18887== at 0x7E87AC7: __wcsnlen_sse4_1 (strlen.S:194)

==18887== by 0x7E74EC1: wcsrtombs (wcsrtombs.c:104)

==18887== by 0x6F8B13F: wxWC2MB(char*, wchar_t const*, unsigned long) (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6F07CD5: wxMBConv::FromWChar(char*, unsigned long, wchar_t const*, unsigned long) const (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6F14F78: wxString::AsChar(wxMBConv const&) const (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6E763C4: wxString::AsCharBuf(wxMBConv const&) const (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x7016906: wxSetEnv(wxString const&, wxString const&) (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x629D359: wxApp::Initialize(int&, wchar_t**) (in /usr/local/lib/libwx_gtk3u_core-3.1.so.3.0.0)

==18887== by 0x6EABB9C: wxEntryStart(int&, wchar_t**) (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6EAC5A9: wxInitialize(int&, wchar_t**) (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6EAC5FA: wxEntry(int&, wchar_t**) (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x1E8D57: main (maingui.cpp:83)

==18887== Address 0x14e00f30 is 16 bytes after a block of size 80 alloc'd

==18887== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)

==18887== by 0x6F07DB7: wxMBConv::FromWChar(char*, unsigned long, wchar_t const*, unsigned long) const (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6F14F78: wxString::AsChar(wxMBConv const&) const (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6E763C4: wxString::AsCharBuf(wxMBConv const&) const (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x7016906: wxSetEnv(wxString const&, wxString const&) (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x629D359: wxApp::Initialize(int&, wchar_t**) (in /usr/local/lib/libwx_gtk3u_core-3.1.so.3.0.0)

==18887== by 0x6EABB9C: wxEntryStart(int&, wchar_t**) (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6EAC5A9: wxInitialize(int&, wchar_t**) (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x6EAC5FA: wxEntry(int&, wchar_t**) (in /usr/local/lib/libwx_baseu-3.1.so.3.0.0)

==18887== by 0x1E8D57: main (maingui.cpp:83)

==18887==

==18887== Invalid free() / delete / delete[] / realloc()

==18887== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)

==18887== by 0xA95DAFB: _XFreeDisplayStructure (in /usr/lib/x86_64-linux-gnu/libX11.so.6.3.0)

==18887== by 0xA94AE7E: XCloseDisplay (in /usr/lib/x86_64-linux-gnu/libX11.so.6.3.0)

==18887== by 0x12331FC8: atspi_get_a11y_bus (in /usr/lib/x86_64-linux-gnu/libatspi.so.0.0.1)

==18887== by 0xD2DEE89: atk_bridge_adaptor_init (in /usr/lib/x86_64-linux-gnu/libatk-bridge-2.0.so.0.0.0)

==18887== by 0x85D3B03: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.2200.30)

==18887== by 0x8774498: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.2200.30)

==18887== by 0x915410C: g_closure_invoke (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.3)

==18887== by 0x916705D: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.3)

==18887== by 0x916F714: g_signal_emit_valist (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.3)

==18887== by 0x917012E: g_signal_emit (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.3)

==18887== by 0x91585C3: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.3)

==18887== Address 0x4029f00 is in a rwx anonymous segment

==18887==

==18887== Invalid free() / delete / delete[] / realloc()

==18887== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)

==18887== by 0xA95DD09: _XFreeDisplayStructure (in /usr/lib/x86_64-linux-gnu/libX11.so.6.3.0)

==18887== by 0xA94AE7E: XCloseDisplay (in /usr/lib/x86_64-linux-gnu/libX11.so.6.3.0)

==18887== by 0x12331FC8: atspi_get_a11y_bus (in /usr/lib/x86_64-linux-gnu/libatspi.so.0.0.1)

==18887== by 0xD2DEE89: atk_bridge_adaptor_init (in /usr/lib/x86_64-linux-gnu/libatk-bridge-2.0.so.0.0.0)

==18887== by 0x85D3B03: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.2200.30)

==18887== by 0x8774498: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.2200.30)

==18887== by 0x915410C: g_closure_invoke (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.3)

==18887== by 0x916705D: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.3)

==18887== by 0x916F714: g_signal_emit_valist (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.3)

==18887== by 0x917012E: g_signal_emit (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.3)

==18887== by 0x91585C3: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.3)

==18887== Address 0x4029f10 is in a rwx anonymous segment
...
...

==20545== More than 1000 different errors detected.  I'm not reporting any more.
==20545== Final error counts will be inaccurate.  Go fix your program!
==20545== Rerun with --error-limit=no to disable this cutoff.  Note
==20545== that errors may occur in your program without prior warning from
==20545== Valgrind, because errors are no longer being displayed.
==20545== 

Debugging with GDB gives:

$ gdb /usr/local/bin/wxformbuilder
GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from /usr/local/bin/wxformbuilder...done.
(gdb) go
Command requires an argument.
(gdb) run
Starting program: /usr/local/bin/wxformbuilder
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
***MEMORY-ERROR***: wxformbuilder[22214]: GSlice: assertion failed: aligned_memory == (gpointer) addr
Program received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
51 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0  0x00007ffff4aa7e97 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1  0x00007ffff4aa9801 in __GI_abort () at abort.c:79
#2  0x00007ffff23496b4 in  () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#3  0x00007ffff234a0db in  () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#4  0x00007ffff234ad1e in g_slice_alloc () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#5  0x00007ffff234ad99 in g_slice_alloc0 () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#6  0x00007ffff38ad925 in g_type_create_instance () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#7  0x00007ffff388e748 in  () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#8  0x00007ffff388fee5 in g_object_new_with_properties () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#9  0x00007ffff3890961 in g_object_new () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#10 0x00007ffff3b3dbda in  () at /usr/lib/x86_64-linux-gnu/libgdk-3.so.0
#11 0x00007ffff3b2de3d in  () at /usr/lib/x86_64-linux-gnu/libgdk-3.so.0
#12 0x00007ffff3b02d5d in gdk_display_manager_open_display () at /usr/lib/x86_64-linux-gnu/libgdk-3.so.0
#13 0x00007ffff3ff267a in gtk_init_check () at /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
#14 0x00007ffff64324ae in wxApp::Initialize(int&, wchar_t**) () at /usr/local/lib/libwx_gtk3u_core-3.1.so.3
#15 0x00007ffff5a53b9d in wxEntryStart(int&, wchar_t**) () at /usr/local/lib/libwx_baseu-3.1.so.3
#16 0x00007ffff5a545aa in wxInitialize(int&, wchar_t**) () at /usr/local/lib/libwx_baseu-3.1.so.3
#17 0x00007ffff5a545fb in wxEntry(int&, wchar_t**) () at /usr/local/lib/libwx_baseu-3.1.so.3
#18 0x0000555555634d58 in main(int, char**) (argc=1, argv=0x7fffffffded8) at ../src/maingui.cpp:83