LINUX.ORG.RU

Как отладить seg. fault, при статических переменных?


0

0

Програма на С++. Есть некий класс, в нем все методы и переменный статические. При организации переменных (это экземпляры других классов) как указателей, с их инициализацей, все работает нормально, все инициализируется правильно. Если же делаю переменные не указателями, то сег. фолт сразу. Где поставить точку останова в gdb? "break main" не помогает, происходит до выполнения main.

★★

Часть кода, для ясности

Это вариант для переменных не указателей
Для варианта с указателями, все тоже самое, только инициализация
всех указателей в конструкторе OBSettings

class OBSettings
{
    public:
	OBSettings();
	~OBSettings();
        ...
    private:
        ...
	static const int maxBehav = 14;
	static const int maxMouse = 16;
	static FileXml filerc;
	static GroupParam desktops;
	static GroupParam menus;
	static Bind keyboard;
	static SingleParam behavior[maxBehav];
	static Bind mouse[maxMouse];
};

FileXml OBSettings::filerc("rc.xml");

GroupParam OBSettings::desktops(&filerc, "desktops/names",
    "desktops names", "name");

GroupParam OBSettings::menus(&filerc, "menu", "menus files",
    "file");

Bind OBSettings::keyboard(&filerc, "keyboard",
    "keyboard shortcuts", "keybind", "key");

SingleParam OBSettings::behavior[] = {
    SingleParam(&filerc, "resistance/strength",
        "resistance to window (pixels)", 10, 0, 100),
    SingleParam(&filerc, "resistance/screen_edge_strength",
        "resistance to edge (pixels)", 20, 0, 100),
    SingleParam(&filerc, "focus/focusNew", "focus new window",
        true, "yes", "no"),
    ...
};

Bind OBSettings::mouse[] = {
    Bind(&filerc, "mouse/context,name=Frame",
        "mouse shortcuts", "mousebind", "button", true),
    Bind(&filerc, "mouse/context,name=Titlebar",
        "mouse shortcats", "mousebind", "button", true),
    ...
};

OBSettings::OBSettings() {}

hapchu ★★
() автор топика
Ответ на: комментарий от avv

если хоть один из этих

static FileXml filerc;
static GroupParam desktops;
static GroupParam menus;
static Bind keyboard;
static SingleParam behavior[maxBehav];
static Bind mouse[maxMouse];

классов, использует (некоторые) фичи KDE или Qt, они не будут работать, так как QApplication или KApplication еще не создан.

Sveta_F
()
Ответ на: комментарий от Sveta_F

Ни один класс ничего не исползует, кроме стандартной библиотеки С++

hapchu ★★
() автор топика
Ответ на: комментарий от avv

Кстати, как поставить gdb break на конструктор статической переменной, если конструктор описан в другом файле с исходником, нежели main()? main() в main.o (main.cpp), FileXml::FileXml в FileXml.o (FileXml.cpp) То есть, для FileXml::FileXml() пробую так: gdb --exec ob Потом break FileXml::FileXml - не находит такой функции вообще. Пробую так: gdb --exec ob --symbols FileXml.o Потом break FileXml::FileXml, так находит функцию, но при запуске все равно сегфолт до попадания в точку останова.

hapchu ★★
() автор топика

А зачем ставить точку останова? Т.е., да, совет поставить точку останова на конструкторе очевиден и правилен, но у тебя же есть core - попроси отладчик его использовать.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.