exebook / deodar

Классическая двухпанельная рабочая среда (коммандер) для О.С. Линукс
The Unlicense
72 stars 8 forks source link

Segmentation fault во-время запуска #15

Open coderaiser opened 10 years ago

coderaiser commented 10 years ago

После успешной компиляции glxwin, во-время запуска, Deodar вывел такую информацию.

coderaiser@cloudcmd:~/deodar$ node deodar
Segmentation fault (core dumped)

Посмотрев под отладчиком, обратил внимание, что node падает на вызове x11clip.start. Видимо, проблема в модуле x11clip.

exebook commented 10 years ago

Да, там (в x11clip.start) нигде нет проверок на возвращение кода ошибки и если скажем OpenDisplay вернуло NULL то дальнейшие вызовы запросто могут вызвать SegFault. Отчего это может произойти в вашем случае не знаю, надо смотреть в gdb какой именно вызов вернул NULL.

Кстати, как крайний вариант можно не использовать системный клипборд, для этого в файле deodar.js после require(x11clip) переопределяются clioboardGet/Set чтобы просто в переменой хранить текст.

exebook commented 10 years ago

А может дело в том, что у вас другой компилятор (не зря же он ругался на то, на что мой не ругается) и это на что то влияет, что то не инициализируется например... Кстати, у меня же 64 битная система, только на ней могу тестировать.

coderaiser commented 10 years ago

У меня тоже x64, может быть можно сделать работу с x11clip опциональной? Насколько это важный модуль? В принципе, можно было бы, действительно, попробовать использовать этот модуль (например в try...catch), а, если не получается, перейти к полифилу, который проемулирует работу модуля, или к заглушке, которая урежет функционал, но оставит рабочим файловый менеджер.

exebook commented 10 years ago

логично. к сожалению оно написано на С++, эта часть связаная с клипбордом, поэтому try/catch JavaScript на него не действуют. поэтому не ясно как отловить из скрипта глюк сишного кода. разве что наставить там сишных try/catch и if(NULL). но я то надеялся, что там просто нечему ломаться. вот тут вопрос, x11clip падает, а glxwin устроен похожим образом, создаётся окно, запускается цикл XNextEvent, он у вас работает? Вы не попробовали в deodar.js отключить вызовы x11clip? это буквально 5 строчек.

Мож там какая то фундаментальная проблема, например у вас не XWindow а Wayland )

coderaiser commented 10 years ago

Пробовал переписать функцию start в x11clip таким образом:

Handle<Value> start(const Arguments& a) {
    try {
        XClipStart();
    } catch (int error) {
    }
     HandleScope scope;
     return scope.Close(String::New("started"));
}

Deodar упал всё-равно с той же ошибкой. После того, как закоментировал строчки в файле deodar.js:

x11clip.start()
x11clip.mainLoop()

Приложение упало с новой ошибкой:

/home/coderaiser/deodar/intervision/display.js:53
        dnaof(this, undefined, fonts[f].name, fontSize, fonts[f].extra_x, fonts[f].tu
                                       ^
TypeError: Cannot read property 'name' of undefined
    at X.TGLXVision.can.init (/home/coderaiser/deodar/intervision/display.js:53:33)
    at dnaof (/home/coderaiser/deodar/dnaof/dnaof.js:43:29)
    at X.TDeodar.can.init (/home/coderaiser/deodar/deodar.js:192:2)
    at Function.X.create (/home/coderaiser/deodar/dnaof/dnaof.js:24:35)
    at Object.<anonymous> (/home/coderaiser/deodar/deodar.js:196:17)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.runMain [as _onTimeout] (module.js:497:10)
exebook commented 10 years ago

за последние дни я много изменений внёс, попробуйте обновить все модули через git pull (я пока не знаю как сделать чтобы одной командой все обновлялись)

и в файле deodar.js в строке 107 замените

var useX11clipboard = true

на

var useX11clipboard = false

x11clip совсем не будет загружаться тогда.

со шрифтами тоже должна проблема уйти вроде. (в вашем случае, кажется, это из за того что вы обновили deodar и не обновили intervision или наоборот)

exebook commented 10 years ago

кстати, у меня есть репозиторий называется x11clipboard (не x11clip) там маленькая програмка на чистом С. на её основе потом написан x11clip node module. можно её попробовать скомпилить и запустить из под GDB и станет ясно где крэш является.

coderaiser commented 10 years ago

Обновил модули:

Поменял useX11clipboard, сейчас ошибка выглядит таким образом:

/home/coderaiser/deodar/intervision/display.js:34
                if (fontPath.indexOf('/'+fontHints[i].name) >= 0)
                             ^
TypeError: Cannot call method 'indexOf' of undefined
    at X.TGLXVision.can.init (/home/coderaiser/deodar/intervision/display.js:34:16)
    at dnaof (/home/coderaiser/deodar/dnaof/dnaof.js:43:29)
    at X.TDeodar.can.init (/home/coderaiser/deodar/deodar.js:214:2)
    at Function.X.create (/home/coderaiser/deodar/dnaof/dnaof.js:24:35)
    at Object.taskDeodarCreate (/home/coderaiser/deodar/deodar.js:219:18)
    at X.TChain.can.next (/home/coderaiser/deodar/file/chain.js:48:5)
    at processImmediate [as _immediateCallback] (timers.js:330:15)

gdb показывает следующую информацию при запуске скомпилированного с флагом -g файла x11clipboard/x11copy:

(gdb) r
Starting program: /home/coderaiser/deodar/x11clipboard/x11copy

Program received signal SIGSEGV, Segmentation fault.
0x080486f4 in main (argc=1, argv=0xbffff774) at x11copy.c:37
37              int N = DefaultScreen(display);
(gdb)
exebook commented 10 years ago

Со шрифтом боле менее ясно, как то надо вам повнимательнее глянуть как програма получает имя шрифта (а это полный путь к файлу шрифта). Не понятно, почему она их не видит, может пермиссии или пути, как вариант скопировать файл шрифта в папку деодара (скажем DejaVuMono или Andale_Mono.ttf) проверитьправа и указать в display.js прям полный путь скажем за одну строчку до той которая ошибку выдаёт.

exebook commented 10 years ago

Как я и думал функция подключения к X-Server не срабатывает, скорее всего не DefaultScreen(), а та что перед ней. Может опять права доступа, или ещё что. К сожалению удалёно не пресдавляю как помочь. В-принципе операция подключения к X-Window Server самая простая. Если вам не лень, может попробуете разобраться по функции, глянуть простейшие hello-world-ы для оконного приложения, считать текстовый код ошибки. У меня сейчас к сожалению мало времени, чтобы переписать с полной обработкой ошибок.

coderaiser commented 10 years ago

Добавил обработку ошибки в display.js. Возможно ли использовать стандартный шрифт, или не назначать его вовсе?

Насколько Deodar завязан на X window? Возможна ли его частичная (хотя бы) функциональность без Иксов?