![]() |
|
Модераторы: xvr |
![]()
|
|
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
Бинарник - приложение, запускающее ряд простецких потоков. Ничего системно-опасного, да вообще ничего системного они не делают. Смысл в том, что приложение основано на кросс-платформенных либах и в windows'е работает прекрасно. В Linux'е собирается,но работать не хочет. Выдает Segmentation Fault. Причем методом проб, выяснил, что происходит это во время создания потока.
Хочу узнать, только ли у меня этот Segmentation Fault. Присоединённый файл ( Кол-во скачиваний: 4 )
test.zip 10,49 Kb |
|||
|
||||
| bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 4 Всего: 317 |
En_t_end, вообще-то, как ты понимаешь, запускать чей-то бинарник просто-так не будет человек, поэтому нужно бы с сырцами.
я открыл у себя файл, и проверил что он за файл:
т.е. твой файл скомпилен под довольно старую систему. далее я проверил к каким либам он должен подключаться, и обнаружил: 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 выдаёт все либы подключены, и есть ошибка, стоит заняться дибаггингом. а вообще это оффтоп здеся, надо это в отдел разработки. если начнешь сорсами кидаться перенесу сразу же в раздел си-си++, и там тебе быстрее помогут. пока. -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
| En_t_end |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
bilbobagginz, благодарю.
Я прекрасно понимаю, но сырцы 17 килобайт весят(17*1024/80 - строчек кода). Неужели кто-то ради меня будет копаться в них ? Да к тому, же в windows всё работает прекрасно, не думаю, что это ошибка проектирования, либо ошибка программирования.
О вот это уже интересно. Я давно замечал на своей системе, что Стандартная библиотека не соответсвует стандарту. Как мне обновить её ? (PS я просто чайник в LINUX, отнеситесь снисходительно)
Это зависет от ответа на первый коммент. |
||||||
|
|||||||
| bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 4 Всего: 317 |
En_t_end, нужны данные про:
виндовс версия версия линукса на котором собиралась программа + версии ядра, libc, stdc++ и gcc.
не факт. Если бы всё было правильно, то программа не вылетала бы с SIGSEGV. У меня был обратный случай - под линуксом всё работало, а под виндой - нет. это была ошибка в программировании, и нашлась с помощью gdb, под виндой. С.У.В. пока. З.Ы. переношу в другой раздел. -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
bilbobagginz,
Странным образом баг исчез Применил свой "любимый" танец с бубном, он же отладка методом руки хаоса Сразу скажу, что код библиотек не трогал, рефакторил только код, использующий либы, он же код с точкой входа в программу(int main). Тут очень странная вещь выявилась. В коде мне нужна была переменная unsigned i; - для сигнализации обработки потоков. Когда я её закоментил, удалив её использование, пришлось пожертвовать 4-мя потоками, то SegFault - пропал Я потом долго смеялся, и то раскоментивал обьявление i, то опять коментил, итог - с variable i - SegFault, который вылазил НЕ на обьявлении!!! Повторю, я только раскоментивал и коментил обьявление i, ничего другого не менял. Далее я начал раскоментивать точку загрузки потока, собирающего статистику с обработки потоков. И опять напоролся на SegFault и опять во время загрузки потока. Удалил handle(чисто переменная), испоьзуемый для создания потока, применил handle потока, который успешно запускался. И удача Отправил bilbobagginz'у всю папку с проектом, там есть место, если его раскоментить, то у меня Linux RedHat 7.3 gcc version 2.96 20000731 вылазиет SegFault. Сюда выкладывать не хочу, не хочу, чтобы код становился достоянием общественности. Добавлено @ 08:34 bilbobagginz, у меня есть подозрение, что всё это происходит из-за параметров стека для моего приложения. Видимо не хватает памяти для выделения в стеке. Вопрос, как узнать, сколько памяти в стеке доступно для программы и сколько уже занято, на определенном этапе загрузки. |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
Win 2000 с последним Service Pack'ом
Добавлено @ 08:48
Я кстати тоже очень удивился, почему работать не стало именно под Linux'ом. Я хоть и не давно на нем, но уже убедился, что надежность - это его главный козырь. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
Я думаю, что это действительно проблема со стеком. Только не совсем та, о которой ты говоришь. У тебя есть ошибка в программе. Например, запись в ячейку памяти следующую, за адресом 5-й переменной (повторяю, например). Когда ты убираешь объявление переменной i, то запись производится уже в немного другое место, что не вызывает segfault.
Короче. Ищи ошибку. На работе у меня платформа x86_64 (amd64), а проект должен работать на x86. У меня программа работает, а на x86 нет. После долгого поиска ошибки была найдена таковая. И это был не глюк компилятора, а типичная ошибка программирования. |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
bsa,
Я могу тебе выслать проект на мыло. Код хорошо спроектирован, думаю разбираться в нем будет можно с удовольствием. Мне, просто, точно нужно узнать проблема эта вызвана опциями стека или моей ошибкой. Может там где-то глупая описка, но я не могу её увидеть. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
En_t_end
99% - твоя ошибка. Для ее нахождения, ты должен определить в каком месте происходит сегфолт. Если в отладчике это сделать невозможно, то воткни побольше отладочных выводов (я использую cout << N << endl;, где N - число). Таким образом ты сможешь локализовать место ошибки. А там уже можно более подробный вывод сделать. Высылать мне проект не надо. Искать чужие ошибки не люблю. Но если ты локализуешь место ошибки, и разместишь здесь проблемную функцию, то можно будет и поискать. |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
bsa,
ICQ-аккаунт имеется ? Добавлено @ 11:43 bsa, Её нет Я всё cout'ами обвесил, segfault выбрасывается когда я создаю поток. Если я закрываю обьявление i, то поток удачно создается, если нет, то sefault.Больше до этого места(до создания потока) в коде ничего нет: Зацени:
Добавлено @ 11:46 bsa, да... в винде программа работала 3 суток. Ни мемори ликов, ни подвисаний. в Linux-е до сих пор крутиться, тоже мемори ликов не замеченно. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
Что за функция CreateThrd?
|
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
bsa,
Я же говорю приложение построено на кроссплатформенных либах. Вот:
|
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
Уже 5 часов в Linux'е работает. Всё в порядке. Специально для того, чтобы посмотреть, есть ли проблемы с памятью, перемещал её по блокам кучи, запуская несколько других обьемных приложений.
Добавлено @ 15:06 Но запускаться при включении local variable integer i - не хочет |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
Ты в начало Test1_thread (и др.) вставлял отладочный вывод?
Попробуй вместо unsigned i воткнуть туда char i[4] и/или long i. Что будет? |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
||||
|
||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |