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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужно проверить бинарник, Linux 
:(
    Опции темы
En_t_end
Дата 8.7.2006, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Бинарник - приложение, запускающее ряд простецких потоков. Ничего системно-опасного, да вообще ничего системного они не делают. Смысл в том, что приложение основано на кросс-платформенных либах и в windows'е работает прекрасно. В Linux'е собирается,но работать не хочет. Выдает Segmentation Fault. Причем методом проб, выяснил, что происходит это во время создания потока. 
Хочу узнать, только ли у меня этот Segmentation Fault. 

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  test.zip 10,49 Kb
PM MAIL ICQ Skype GTalk Jabber   Вверх
bilbobagginz
Дата 8.7.2006, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 4
Всего: 317



En_t_end, вообще-то, как ты понимаешь, запускать чей-то бинарник просто-так не будет человек, поэтому нужно бы с сырцами.
я открыл у себя файл, и проверил что он за файл:
Код

file test
test: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped

т.е. твой файл скомпилен под довольно старую систему.
далее я проверил к каким либам он должен подключаться, и обнаружил:

ldd test
ldd: warning: you do not have execution permission for `./test'
        linux-gate.so.1 =>  (0xffffe000)
        libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7fb8000)
        libstdc++-libc6.2-2.so.3 => not found
        libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7f96000)
        libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7e67000)


Т.е. версия libstdc++-libc6 - мне не подходит.
Если это кросс-компиляция, возможно нет соответствия с либами stdc++, что не есть хорошо.
и то же у тебя на машине.
Если нет, есть средства, точно узнать на каком вызове всё происходит, напр: strace
man strace тебе в руки.

короче если у тебя ldd выдаёт все либы подключены, и есть ошибка, стоит заняться дибаггингом.

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


пока.
 


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
En_t_end
Дата 9.7.2006, 06:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



bilbobagginz, благодарю.
Цитата(bilbobagginz @  9.7.2006,  00:10 Найти цитируемый пост)
ообще-то, как ты понимаешь, запускать чей-то бинарник просто-так не будет человек, поэтому нужно бы с сырцами.

Я прекрасно понимаю, но сырцы 17 килобайт весят(17*1024/80 - строчек кода). Неужели кто-то ради меня будет копаться в них ? Да к тому, же в windows всё работает прекрасно, не думаю, что это ошибка проектирования, либо ошибка программирования.
Цитата(bilbobagginz @  9.7.2006,  00:10 Найти цитируемый пост)
Т.е. версия libstdc++-libc6 - мне не подходит.
Если это кросс-компиляция, возможно нет соответствия с либами stdc++, что не есть хорошо.
и то же у тебя на машине.

О вот это уже интересно. Я давно замечал на своей системе, что Стандартная библиотека не соответсвует стандарту. Как мне обновить её ? (PS я просто чайник в LINUX, отнеситесь снисходительно)
Цитата(bilbobagginz @  9.7.2006,  00:10 Найти цитируемый пост)
а вообще это оффтоп здеся, надо это в отдел разработки. если начнешь сорсами кидаться перенесу сразу же в раздел си-си++, и там тебе быстрее помогут.

Это зависет от ответа на первый коммент. 
PM MAIL ICQ Skype GTalk Jabber   Вверх
bilbobagginz
Дата 9.7.2006, 07:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 4
Всего: 317



En_t_end,  нужны данные про:
виндовс версия
версия линукса на котором собиралась программа + версии ядра, libc, stdc++ и gcc.

Цитата

Да к тому, же в windows всё работает прекрасно, не думаю, что это ошибка проектирования, либо ошибка программирования.


не факт. Если бы всё было правильно, то программа не вылетала бы с SIGSEGV. У меня был обратный случай  - под линуксом всё работало, а под виндой - нет. smile 
это была ошибка в программировании, и нашлась с помощью gdb, под виндой. 

С.У.В.
пока.

З.Ы. переношу в другой раздел. 


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
En_t_end
Дата 9.7.2006, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



bilbobagginz,
Странным образом баг исчез smile
Применил свой "любимый" танец с бубном, он же отладка методом руки хаоса smile
Сразу скажу, что код библиотек не трогал, рефакторил только код, использующий либы, он же код с точкой входа в программу(int main).
Тут очень странная вещь выявилась.
В коде мне нужна была переменная unsigned i; - для сигнализации обработки потоков. Когда я её закоментил, удалив её использование, пришлось пожертвовать 4-мя потоками, то SegFault - пропал smile
Я потом долго смеялся, и то раскоментивал обьявление i, то опять коментил, итог - с variable i - SegFault, который вылазил НЕ на обьявлении!!!  smile , без variable i - всё нормально.
Повторю, я только раскоментивал и коментил обьявление i, ничего другого не менял.
Далее я начал раскоментивать точку загрузки потока, собирающего статистику с обработки потоков. И опять напоролся на SegFault и опять во время загрузки потока. Удалил handle(чисто переменная), испоьзуемый для создания потока, применил handle потока, который успешно запускался. И удача smile - SegFault'ы исчезли, код функционирует так, как того требуют технические требования. Уже 30 минут smile
Отправил bilbobagginz'у всю папку с проектом, там есть место, если его раскоментить, то у меня Linux RedHat 7.3 gcc version 2.96 20000731 вылазиет SegFault. Сюда выкладывать не хочу, не хочу, чтобы код становился достоянием общественности.

Добавлено @ 08:34 
bilbobagginz, 
у меня есть подозрение, что всё это происходит из-за параметров стека для моего приложения. Видимо не хватает памяти для выделения в стеке. Вопрос, как узнать, сколько памяти в стеке доступно для программы и сколько уже занято, на определенном этапе загрузки. 
PM MAIL ICQ Skype GTalk Jabber   Вверх
En_t_end
Дата 9.7.2006, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Win 2000 с последним Service Pack'ом

Добавлено @ 08:48 
Цитата(bilbobagginz @  9.7.2006,  11:15 Найти цитируемый пост)
 У меня был обратный случай  - под линуксом всё работало, а под виндой - нет.

Я кстати тоже очень удивился, почему работать не стало именно под Linux'ом. Я хоть и не давно на нем, но уже убедился, что надежность - это его главный козырь. 
PM MAIL ICQ Skype GTalk Jabber   Вверх
bsa
Дата 9.7.2006, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Я думаю, что это действительно проблема со стеком. Только не совсем та, о которой ты говоришь. У тебя есть ошибка в программе. Например, запись в ячейку памяти следующую, за адресом 5-й переменной (повторяю, например). Когда ты убираешь объявление переменной i, то запись производится уже в немного другое место, что не вызывает segfault.
Короче. Ищи ошибку.

На работе у меня платформа x86_64 (amd64), а проект должен работать на x86. У меня программа работает, а на x86 нет. После долгого поиска ошибки была найдена таковая. И это был не глюк компилятора, а типичная ошибка программирования. 
PM   Вверх
En_t_end
Дата 9.7.2006, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



bsa, 
Я могу тебе выслать проект на мыло. Код хорошо спроектирован, думаю разбираться в нем будет можно с удовольствием. Мне, просто, точно нужно узнать проблема эта вызвана опциями стека или моей ошибкой. Может там где-то глупая описка, но я не могу её увидеть. 
PM MAIL ICQ Skype GTalk Jabber   Вверх
bsa
Дата 9.7.2006, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



En_t_end
99% - твоя ошибка.
Для ее нахождения, ты должен определить в каком месте происходит сегфолт. Если в отладчике это сделать невозможно, то воткни побольше отладочных выводов (я использую cout << N << endl;, где N - число). Таким образом ты сможешь локализовать место ошибки. А там уже можно более подробный вывод сделать.
Высылать мне проект не надо. Искать чужие ошибки не люблю. Но если ты локализуешь место ошибки, и разместишь здесь проблемную функцию, то можно будет и поискать. 
PM   Вверх
En_t_end
Дата 9.7.2006, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



bsa, 
ICQ-аккаунт имеется ?

Добавлено @ 11:43 
bsa, 
Её нет smile
Я всё cout'ами обвесил, segfault выбрасывается когда я создаю поток. Если я закрываю обьявление i, то поток удачно создается, если нет, то sefault.Больше до этого места(до создания потока) в коде ничего нет:
Зацени:
Код

int main()
{
    kern = new Kernel(5);
    storage = new Storage_controlled(5);
    MEMBER_KERNEL temp;

    char *tmp_buf = new char[50];
//    unsigned i = 0; //try to change you mind :) system don't like variable i :) don't use this :)
    _hndle_ h_tmp;
    CreateThrd(h_tmp,Kernel_statistic,NULL);CloseHndle(h_tmp);
    int thread_rest;
    thread_rest = 0;
    do
    {
        if(thread_rest <= 0)
        {
            CreateThrd(h_tmp,Test1_thread,NULL);CloseHndle(h_tmp);
            CreateThrd(h_tmp,Test2_thread,NULL);CloseHndle(h_tmp);
            CreateThrd(h_tmp,Test3_thread,NULL);CloseHndle(h_tmp);
            CreateThrd(h_tmp,Test4_thread,NULL);CloseHndle(h_tmp);
            CreateThrd(h_tmp,Test5_thread,NULL);CloseHndle(h_tmp);
        }
        kern->Get_atom(&temp);
    if(strcmp((char*)temp.data, "HELLO1") == 0)
        strcpy(tmp_buf, "How are you thread1 ?");
    if(strcmp((char*)temp.data, "HELLO2") == 0)
        strcpy(tmp_buf, "How are you thread2 ?");
    if(strcmp((char*)temp.data, "HELLO3") == 0)
        strcpy(tmp_buf, "How are you thread3 ?");
    if(strcmp((char*)temp.data, "HELLO4") == 0)
        strcpy(tmp_buf, "How are you thread4 ?");
    if(strcmp((char*)temp.data, "HELLO5") == 0)
        strcpy(tmp_buf, "How are you thread5 ?");
    temp.data = tmp_buf;
    temp.size = 50;
    storage->Put_atom(&temp);
    kern->Continue();
    thread_rest++;if(thread_rest==5) thread_rest = 0;
    USLEEP(TIME_SYNC);
    }while(true);
    return 0;
}


Добавлено @ 11:46 
bsa, 
Цитата(bsa @  9.7.2006,  15:39 Найти цитируемый пост)
99% - твоя ошибка.

да... в винде программа работала 3 суток. Ни мемори ликов, ни подвисаний.
в Linux-е до сих пор крутиться, тоже мемори ликов не замеченно. 
PM MAIL ICQ Skype GTalk Jabber   Вверх
bsa
Дата 9.7.2006, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Что за функция CreateThrd? 
PM   Вверх
En_t_end
Дата 9.7.2006, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



bsa, 
Я же говорю приложение построено на кроссплатформенных либах.
Вот:
Код

//...
        #ifdef PLFRM_CMPL_NIX_G
        typedef pthread_t* _hndle_;
        #endif //PLFRM_CMPL_NIX_G

//...

bool usync::threads::CreateThrd(
    usync::threads::_hndle_ &hndle,
    usync::threads::LPTHRD_PROC_ADDR proc,
    void* param)
{
    #ifdef PLFRM_CMPL_NIX_G
    return (pthread_create(hndle,NULL,proc,param)==0);
    #endif //PLFRM_CMPL_NIX_G
    #ifdef PLFRM_CMPL_WINNT_VS6_7
    hndle = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)proc,param,0,NULL);
    return(hndle!=NULL);
    #endif //PLFRM_CMPL_WINNT_VS6_7
}
 
PM MAIL ICQ Skype GTalk Jabber   Вверх
En_t_end
Дата 9.7.2006, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Уже 5 часов в Linux'е работает. Всё в порядке. Специально для того, чтобы посмотреть, есть ли проблемы с памятью, перемещал её по блокам кучи, запуская несколько других обьемных приложений.

Добавлено @ 15:06 
Но запускаться при включении local variable integer i - не хочет smile  
PM MAIL ICQ Skype GTalk Jabber   Вверх
bsa
Дата 9.7.2006, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Ты в начало Test1_thread (и др.) вставлял отладочный вывод?
Попробуй вместо unsigned i воткнуть туда char i[4] и/или long i. Что будет? 
PM   Вверх
En_t_end
Дата 10.7.2006, 06:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



bsa, 
Цитата(bsa @  9.7.2006,  20:51 Найти цитируемый пост)
вставлял отладочный вывод

Я же не тюлень... говорю, был момент, когда у меня перед каждой строчкой кода стоял std::cout << "procedure" << std::endl;
Поток вообще на запускался...
Цитата(bsa @  9.7.2006,  20:51 Найти цитируемый пост)
Попробуй вместо unsigned i воткнуть туда char i[4] и/или long i. Что будет? 

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

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

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


 




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


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

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