Segmentation fault Topic is solved

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
AntonyTony
Earned a small fee
Earned a small fee
Posts: 18
Joined: Tue Jan 28, 2020 10:03 am

Segmentation fault

Post by AntonyTony »

В моём проекте есть несколько библиотек, с UI и без. В тех, что без интерфейса программа падает с ошибкой Segmentation fault, а конкретно при создании

Code: Select all

wxDynamicLibrary lib(name);
и при создании сокета

Code: Select all

wxSocketBase *s = new wxDatagramSocket( _address, wxSOCKET_REUSEADDR );
Ошибка связана с m_parent, он всегда пуст (0x0) и возникает она в библиотеках wincmn, msgdlg
В библиотеках с интерфейсом все работает нормально.
Может кто подсказать в чём мой косяк?
User avatar
T-Rex
Moderator
Moderator
Posts: 1248
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Re: Segmentation fault

Post by T-Rex »

Без более объемного примера трудно понять, в чем проблема. Проверь calling convention, чтобы везде был STDCALL.
Проверь чтобы у всех библиотек был одинаковый С++ Runtime. Если библиотеки с wxWidgets, то чтобы везде была одинаковая версия wxWidgets.

Пример вон есть с UI и без. https://github.com/T-Rex/wxModularApp
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7458
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: Segmentation fault

Post by ONEEYEMAN »

Dobrogo vremeni sutok,
A mogno poluchit back-trace pri padenii?
I kakja versija biblioteki i kakaja operacionka?

Spasibo.
AntonyTony
Earned a small fee
Earned a small fee
Posts: 18
Joined: Tue Jan 28, 2020 10:03 am

Re: Segmentation fault

Post by AntonyTony »

libwx_gtk2u_core-3.0.so.0!wxWindow::RemoveChild(wxWindow * const this, wxWindowBase * child) Line 3561 C++
> libwx_gtk2u_core-3.0.so.0!wxWindowBase::~wxWindowBase(wxWindowBase * const this) Line 491 C++
libwx_gtk2u_core-3.0.so.0!wxWindow::~wxWindow(wxWindow * const this) Line 2477 C++
libwx_gtk2u_core-3.0.so.0!wxControlBase::~wxControlBase(wxControlBase * const this) Line 48 C++
libwx_gtk2u_core-3.0.so.0!wxControl::~wxControl(wxControl * const this) Line 20 C++
libwx_gtk2u_core-3.0.so.0!wxStaticTextBase::~wxStaticTextBase(wxStaticTextBase * const this) Line 31 C++
libwx_gtk2u_core-3.0.so.0!wxStaticText::~wxStaticText(wxStaticText * const this) Line 16 C++
libwx_gtk2u_core-3.0.so.0!wxStaticText::~wxStaticText(wxStaticText * const this) Line 16 C++
libwx_gtk2u_core-3.0.so.0!wxWindowBase::Destroy(wxWindowBase * const this) Line 576 C++
libwx_gtk2u_core-3.0.so.0!wxWindowBase::DestroyChildren(wxWindowBase * const this) Line 608 C++
libwx_gtk2u_core-3.0.so.0!wxWindow::~wxWindow(wxWindow * const this) Line 2510 C++
libwx_gtk2u_core-3.0.so.0!wxNonOwnedWindowBase::~wxNonOwnedWindowBase(wxNonOwnedWindowBase * const this) Line 25 C++
libwx_gtk2u_core-3.0.so.0!wxNonOwnedWindow::~wxNonOwnedWindow(wxNonOwnedWindow * const this) Line 229 C++
libwx_gtk2u_core-3.0.so.0!wxTopLevelWindowBase::~wxTopLevelWindowBase(wxTopLevelWindowBase * const this) Line 59 C++
libwx_gtk2u_core-3.0.so.0!wxTopLevelWindowGTK::~wxTopLevelWindowGTK(wxTopLevelWindowGTK * const this) Line 796 C++
libwx_gtk2u_core-3.0.so.0!wxTopLevelWindow::~wxTopLevelWindow(wxTopLevelWindow * const this) Line 395 C++
libwx_gtk2u_core-3.0.so.0!wxNavigationEnabled<wxTopLevelWindow>::~wxNavigationEnabled(wxNavigationEnabled<wxTopLevelWindow> * const this) Line 182 C++
libwx_gtk2u_core-3.0.so.0!wxDialogBase::~wxDialogBase(wxDialogBase * const this) Line 72 C++
libwx_gtk2u_core-3.0.so.0!wxDialog::~wxDialog(wxDialog * const this) Line 80 C++
libwx_gtk2u_core-3.0.so.0!wxGenericProgressDialog::~wxGenericProgressDialog(wxGenericProgressDialog * const this) Line 724 C++
wxProgressDialog::~wxProgressDialog(wxProgressDialog * const this) Line 36 C++




wxWidgets 3.0.2
запускаю на Debian 10
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7458
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: Segmentation fault

Post by ONEEYEMAN »

Dobrogo vremeni sutok,
Ochen tjagelo skazat bez coda.

Kakaja operacija vypolnjalas pered padeniem?

Spasibo.
AntonyTony
Earned a small fee
Earned a small fee
Posts: 18
Joined: Tue Jan 28, 2020 10:03 am

Re: Segmentation fault

Post by AntonyTony »

Мой проект при сборке под винду выравнивает структуры в 1 байт, а под линукс я успешно заккоментил эту строку. Скорее всего в этом вся проблема.
При сборке библиотеки wx на линуксе можно указать выравнивание структур?
Собирал следующим образом:

Code: Select all

$ ../configure --enable-unicode --enable-debug --disable-shared --disable-monolithic
$make
$make install
Так же написал пример:
Main.h

Code: Select all


#pragma once
#include <iostream>
wxString GetFullPathToFile(wxString fileName);

Main.cpp

Code: Select all


#include <wx/file.h>
#include <wx/stdpaths.h>
#include <wx/filename.h>

#include "Main.h"

int main()
{
	wxString fullPathToSumLib = GetFullPathToFile("SumLib.so");
	return 0;
}
wxString GetFullPathToFile(wxString fileName)
{
	wxStandardPaths path = wxStandardPaths::Get();
	wxString sPathExe = path.GetExecutablePath();

	int res = sPathExe.size();

	wxFileName fName(sPathExe);

	wxString fullPathToLib;
	fullPathToLib = fName.GetPathWithSep();
	fullPathToLib += fileName;

	return fullPathToLib;
}
CMakeLists.txt

Code: Select all


project( Main )


find_package(wxWidgets COMPONENTS base core ) 
include(${wxWidgets_USE_FILE})

if ( UNIX )							
	set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-invalid-offsetof -std=c++0x -fpack-struct=1 ") 	
	set (CMAKE_POSITION_INDEPENDENT_CODE ON)
endif()

add_executable (Main "Main.cpp" "Main.h")

target_link_libraries(  ${PROJECT_NAME} ${wxWidgets_LIBRARIES} )

set_target_properties( ${PROJECT_NAME} PROPERTIES 
				RUNTIME_OUTPUT_DIRECTORY_DEBUG   	${EXE_DIR}
				RUNTIME_OUTPUT_DIRECTORY_RELEASE 	${EXE_DIR} )
В итоге, с выравниванием прога падает на первой строчке в функции 'GetFullPathToFile':

Вывод:

Code: Select all

Program received signal SIGSEGV, Segmentation fault.
__memmove_avx_unaligned_erms () at ../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:383
Segmentation fault

Стек:

Code: Select all

 	libc.so.6!__memmove_avx_unaligned_erms() Line 383	C++
 	libstdc++.so.6!void std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_M_construct<wchar_t*>(wchar_t*, wchar_t*, std::forward_iterator_tag)	
>	wxString::wxString(wxString * const this, const wxString & stringSrc) Line 1220	C++
 	wxStandardPaths::wxStandardPaths(wxStandardPaths * const this) Line 18	C++
 	GetFullPathToFile(wxString fileName) Line 52	C++
 	main() Line 13	C++

Могу я пересобрать библиотеку wx с выравниванием?
Заранее спасибо)
User avatar
T-Rex
Moderator
Moderator
Posts: 1248
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Re: Segmentation fault

Post by T-Rex »

Можно попробовать configure скрипту от wxWidgets скормить кастомные CXXFLAGS и CFLAGS и добавить туда -fpack-struct=1
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7458
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: Segmentation fault

Post by ONEEYEMAN »

Dobrogo vremeni sutok,
Kakaja versija g++?

Spasibo.
AntonyTony
Earned a small fee
Earned a small fee
Posts: 18
Joined: Tue Jan 28, 2020 10:03 am

Re: Segmentation fault

Post by AntonyTony »

версия g++ 4:8.3.0-1
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7458
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: Segmentation fault

Post by ONEEYEMAN »

Doborogo vremeni sutok,
2 veschi:

1. Klientskoe prilogenie i biblioteka wxWidgets dolgny sobiratsja s odnimi i temi ge parametrami. Inache budet kak v Vashem sluchae.
2. Ne sovsem ponimaju dlja chego nugno zakazyvatr eto vyravnivanie i tolko dlja *nix.

Prosto peresoberite biblioteku s sootvetstvujuschimi parametrami ili uberite kondishn v "CMakeList".

Izmemenie parametrov kompiljacii - eto garantija togo chto programma budet valitsja ili budet pokazyvat "Undefined behavior".
Poetomu vsja dokumentacija po wxWidgets govorit chto prilogenie klient i biblioteka DOLGNY kompilirovatsja S ODINAKOVYMI PARAMETRAMI.

Spasibo.
AntonyTony
Earned a small fee
Earned a small fee
Posts: 18
Joined: Tue Jan 28, 2020 10:03 am

Re: Segmentation fault

Post by AntonyTony »

Я перестроил библиотеку и пример заработал

Code: Select all

$ ../configure CFLAGS=”-fPIC” CXXFLAGS=”-std=c++11 -fpack-struct=1 -fPIC” --enable-unicode --enable-debug --disable-shared --disable-monolithic
но мой проект теперь падает на "Arithmetic exception"

Code: Select all

(gdb) run
Starting programm: /media/....
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Programm received signal SIGFPE, Arithmetic exception.
0x0000555555ac570 in wxEncodingNameCache_wxImplementation_HashTable::GetNode (
	this=0x555555e4a620 <gs_nameCache>,
	key=@0x7fffffffdd1c: wxFONTENCODING_UTF8) at ... /src/common/strconv.cpp:3087
	3087		WX_DECLARE_HASH_MAP( wxFontEncoding, wxString, wxIntegerHash, wxIntegerEqual,
(gdb)
Ответ на вопрос о выравнивании: весь проект был написан не мной, мне поручили перевести его под кроссплафторму, попутно доделывать некоторые функции и исправлять старые баги. Зачем и почему они сделали так я уже не узнаю. С дефолтным выравниванием проект не собирается. Работаю с тем, что имею. Как то так.
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7458
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: Segmentation fault

Post by ONEEYEMAN »

Доброго времени суток,
А какую ошибку выдаёт без выравнивания?
И можно получить backtrace при exception?

Спасибо.
AntonyTony
Earned a small fee
Earned a small fee
Posts: 18
Joined: Tue Jan 28, 2020 10:03 am

Re: Segmentation fault

Post by AntonyTony »

В итоге, в одной из вызываемых библиотек, во время загрузки создавалась глобальная переменная wxAppConsole. Удалив её всё заработало. Всем спасибо)
Post Reply