Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> XGetIconName - ошибка сегментирования, полтергейст 
V
    Опции темы
Fynivx
Дата 20.1.2012, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 13.8.2011

Репутация: нет
Всего: 1



Здравствуйте. У меня тут совершенно сверхъестесвенная проблема - ошибка сегментирования при вызове XGetIconName.
Код

//Переменные объявляются в main.cpp, в связи с чем
extern Display*                dpy;
extern Window                win;
extern GLXContext            glxctx;
extern Persistent<Context>    v8ctx;
...

char** iconName;
XGetIconName( dpy, win, iconName );//ошибка сегментирования


В гдб я не силен, а в гугле ничего не нашел ( вы будете смеяться - 0 результатов на русских сайтах и 141 на англоязычных ).

При вызове из main.cpp - происходит то же самое, что заставляет сомневаться в том, что это из-за такого стремного объявления переменных окна и дисплея. Еще более в этом заставляет сомневаться то, что вот это:
Код

Handle<Value> show( const Arguments& args ) {
    XMapWindow( dpy, win );
    return Integer::New( 0 );
}
Handle<Value> hide( const Arguments& args ) {
    XUnmapWindow( dpy, win );
    return Integer::New( 0 );
}
Handle<Value> setTitle( const Arguments& args ) {
    String::AsciiValue title( args[0] );
    XStoreName( dpy, win, *title );
    return Integer::New(0);
}
Handle<Value> getTitle( const Arguments& args ) {
    char** title;
    XFetchName( dpy, win, title );
    return String::New( *title );
}
Handle<Value> resize( const Arguments& args ) {
    XResizeWindow( dpy, win, (**args[0]).Uint32Value(), (**args[1]).Uint32Value() );
    return Integer::New( 0 );
}
Handle<Value> move( const Arguments& args ) {
    XMoveWindow( dpy, win, (**args[0]).Uint32Value(), (**args[1]).Uint32Value() );
    return Integer::New( 0 );
}

вполне работоспособный код. А одна-единственная XGetIconName вызывает ошибку сегментирования.

Что я делаю не так?
PM MAIL   Вверх
tzirechnoy
Дата 20.1.2012, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Третий параметр -- это char *, который должэн передаваться по ссылке.

Код

char * icon_name;

XGetIconName( ..., &icon_name );

PM MAIL   Вверх
Fynivx
Дата 21.1.2012, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 13.8.2011

Репутация: нет
Всего: 1



Не вижу разницы. И компилятор тоже не видит - результат тот же - ошибка сегментирования.
(И в том и в другом случае передается указатель на указатель на чар, и работа идет со вторым указателем, а не с первым - ему выделяется память. И в документации, кстати, написано именно char**)
---

Функция XFetchName, вызываемая таким же образом, вполне успешно работает.

ЗЫ, я уже и сам пробовал память выделять под этот указатель, причем самыми изощренными способами - результат тот же.

Это сообщение отредактировал(а) Fynivx - 21.1.2012, 00:43
PM MAIL   Вверх
tzirechnoy
Дата 21.1.2012, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Цитата
Не вижу разницы.


Бывает. Что тут можно сказать -- учите C, он на самом деле не такой уж сложный.
PM MAIL   Вверх
Fynivx
Дата 21.1.2012, 01:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 13.8.2011

Репутация: нет
Всего: 1



Ладно. Скажем так - разница есть, но для этого случая - нет.

Или в этот раз ошибка сегментирования по другой причине?
-----

И, все-таки, объясните пожалуйста, какая разница, передать этой функции указатель инициализированный самолично, или указатель, определенный компилятором?

Так. Я осознал свою ошибку - в моем случае память выделится для первого указателя, который будет указывать на хз. И если это хз изменится, будет хз что. А в Вашем - под этот указатель место выделяется, и его можно изменить без последствий.

Но проблему это не решает.

Это сообщение отредактировал(а) Fynivx - 21.1.2012, 01:25
PM MAIL   Вверх
tzirechnoy
Дата 21.1.2012, 02:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Как минимум -- есть ещё ровно та жэ ошыбка в getTitle. Возможно, что что-то похожэе есть где-то ещё. Типичный паттэрн: первый раз разносит кучу (heap), затем мы валимся в (дажэ нормальном) malloc().

Впрочем, я практически не знаю v8 -- возможно, что какое-то из его применений неверно. И здесь, кстати, не весь код. Если исправление видимого не поможэт, попробуйте взять какой-нибудь malloc debugger, например electric-fence. 

А, и собирайте с g++ -Wall, кстати. И чтобы варнингов не было.
PM MAIL   Вверх
Fynivx
Дата 21.1.2012, 05:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 13.8.2011

Репутация: нет
Всего: 1



Похоже, всё так(
Я в расстройстве чувств подключил GLUT для работы с окнами и.... Ошибка сегментирования в
Код

void OnSTDINData(int fd, short event, void *arg) {
    char buf[255];
    buf[read(fd, buf, sizeof(buf) - 1)] = '\0';

    HandleScope handle_scope;

    Handle<String> source = String::New( buf );
    Handle<script> script = Script::Compile( source ); //вот здесь
    Handle<Value> result = script->Run(  );
}

Это кэллбэк для обработки стандартного ввода. Но он работал, пока я не подключил GLUT  smile

Буду рассматривать дамп в поисках кривых указателей =/

Это сообщение отредактировал(а) Fynivx - 21.1.2012, 05:52
PM MAIL   Вверх
Fynivx
Дата 21.1.2012, 06:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 13.8.2011

Репутация: нет
Всего: 1



Так. Я убрал всё. Вообще всё. Осталась только инициализация и вот этот вот кэллбак. g++ -Wall не выдает ни одного предупреждения. Но она осталась(
В отчаянии, привожу весь оставшийся код полностью.

main.h:
Код

#include <stdlib.h>
#include <unistd.h>
#include <v8.h>

#include <event.h>


#include <GL/gl.h>
#include <GL/glut.h>


using namespace v8;

void v8_init(  );
void libevent_init(  );
void glut_init( int, char** );
void main_loop( int );

LibEventCallbacks.h:
Код

#include "main.h"

namespace LibEventCallbacks {
    void OnSTDINData    ( int, short, void* );
}

main.cpp:
Код

#include "main.h"
#include "LibEventCallbacks.h"

int main( int argc, char** argv ) {
    v8_init(  );
    libevent_init(  );
    glut_init( argc, argv );
    glutMainLoop(  );
    return 0;
}

void v8_init(  ) {
// Инициализация v8
    HandleScope handle_scope;
    
    Handle<ObjectTemplate> v8global = ObjectTemplate::New(  );
    
    Persistent<Context> v8ctx = Context::New( NULL, v8global );
    Context::Scope context_scope( v8ctx );
    
}

void libevent_init(  ) {
// Инициализация libevent
    struct event_base* evbase = event_init();
    
    struct event* stdinevt = event_new( evbase , fileno( stdin ), EV_READ|EV_PERSIST, LibEventCallbacks::OnSTDINData, NULL);
    event_add( stdinevt, NULL );
}

void glut_init( int argc, char** argv ) {
    glutInit( &argc, argv );
    glutCreateWindow( "window" );
    glutTimerFunc( 33, main_loop, 1 );// выглядит, как рекурсия, но тут ее нет. По крайней мере,
// согласно логике - это таймер, и не должен вызываться до завершения этой функции.
}

void main_loop( int param ) {
    event_loop( EVLOOP_NONBLOCK );
    
    glutTimerFunc( 33, main_loop, 1 );
}

LibEventCallbacks.cpp:
Код

#include "LibEventCallbacks.h"

namespace LibEventCallbacks {

    void OnSTDINData(int fd, short event, void *arg) {
        char buf[255];
        buf[read(fd, buf, sizeof(buf) - 1)] = '\0';

        HandleScope handle_scope;

        Handle<String> source = String::New( buf );
        Handle<script> script = Script::Compile( source ); // вот тут ошибка сегментации
    }

}

Я понятия не имею, где ТУТ вообще может быть ошибка(
PM MAIL   Вверх
tzirechnoy
Дата 21.1.2012, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



1) Ошыбки могут быть везде.
2) Меня несколько напрягает, что почти все переменные в иницыализацыи библиотек -- локальные, на стэке. Это можэт быть нормально, можэт нет -- в зависимости от библиотеки (я таки не знаю ни v8, ни libevent).
3) Я сейчас попробую посмотреть, реально ли валится, но, возможно, что до вечера не успею.
PM MAIL   Вверх
tzirechnoy
Дата 21.1.2012, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Странное дело, у меня в той строке ошыбка была отнюдь не SEGFAULT, а компиляцыи: Script в Handle<script> должэн быть с большой буквы. 
PM MAIL   Вверх
tzirechnoy
Дата 21.1.2012, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Ну и да, перенос текста v8_init() в main() решыл вопрос.
PM MAIL   Вверх
xvr
Дата 21.1.2012, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(tzirechnoy @ 21.1.2012,  10:16)
Ну и да, перенос текста v8_init() в main() решыл вопрос.

Подозреваю, что Handle<> и Persistent<> разновидности smart pointer'ов. Если это так, то валилось правильно - вы их внутри v8_init создали, а они при выходе из v8_init свое содержимое разрушили. На чам потом работала ваша программа - одному богу известно  smile 

PM MAIL   Вверх
Fynivx
Дата 21.1.2012, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 13.8.2011

Репутация: нет
Всего: 1



Хех) Да, именно так и есть) Всем спасибо, проблема решена)
Ну, а первая проблема была по похожей причине. Контекст объявлялся глобально, в связи с чем v8 не мог его инициализировать, но использовал - вот вам и ### =/ Иногда, чтобы понять ошибки, нужно просто поспать)
----------

Я спокоен. Я совершенно спокоен. Ошибка никуда не исчезла.
Да - скорее всего дело в этих указателях. Всё, что я добавил:
Код

    void OnSTDINData(int fd, short event, void *arg) {
        char buf[255];
        buf[read(fd, buf, sizeof(buf) - 1)] = '\0';

        HandleScope handle_scope;
        Persistent<Context> ctx = Context::New(  );
        Context::Scope context_scope( ctx );
        
        Handle<String> source = String::New( buf );
        Handle<script> script = Script::Compile( source );
        TryCatch trycatch;
        Handle<Value> result = script->Run(  );
        if ( result.IsEmpty() ) { // Обработка ошибок. Если не обрабатывать, то при любой ошибке v8 - ошибка сегментирования.
//Если обрабатывать - при unexpected token ILLEGAL и unexpected number.
//"is not defined" проходит нормально, без ошибки.
            Handle<Value> exception = trycatch.Exception(  );
            if ( exception.IsEmpty(  ) ) return;
            String::AsciiValue error ( exception );
            console::error( *error );
        } else {
            String::AsciiValue output ( result );
            console::log( *output );
        }
    }

Но я в их определении никакой ошибки не вижу. Я даже здесь отдельный контекст сделал, чтобы глюков не было.
Придется учиться юзать мтрэис, судя по всему(

Это сообщение отредактировал(а) Fynivx - 21.1.2012, 17:20
PM MAIL   Вверх
tzirechnoy
Дата 21.1.2012, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Вы опять создали некий контекст на стэке (и кучу других каких-то объектов), отдали всё это v8, после чего ушли с этого стэк-фрэйма. Ошыбка можэт быть и не здесь, но кидаться в такие действия в настоящее время несколько опрометчиво.
PM MAIL   Вверх
Fynivx
Дата 21.1.2012, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 13.8.2011

Репутация: нет
Всего: 1



Все объекты созданные здесь, должны быть недоступными вне функции. Правильно?
По-этому я создал контекст именно здесь, чтобы он мог обработать полученные данные.

Но проблема в том, что и с ним, и без него - результат такой же. Это и естественно - ведь контекст, работающий в области видимости main() объявлен как Persistent, а значит - должен быть доступен отовсюду ( что, кстати, и происходит - раньше это дело вполне себе работало, и из консоли были доступны все функции, которые я подключал к контексту в main() ).
А то, что даже при перекрытии его новым контекстом ошибка остается, по-моему, говорит о том, что глюк с указателем у меня до вызова Run и в области, которую обрабатывает Compile.  Хм... Если быть точным, сама ошибка происходит тогда, когда v8 сам обрабатывает ошибку компиляции. Есть над чем подумать.

И вот, кстати, код функций, которые я забыл скинуть в прошлом посте.
Код

void log( char* str ) {
    printf("%s\n", str);
}
void error( char* str ) {
    printf("\t\x1b[31mError: %s\x1b[0m\n", str);
}



PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.1061 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.