[Решено. Нашёл ошибку в программе] Может ли кросс-компилятор некорректно транслировать?

Модератор: Модераторы разделов

MiK13
Сообщения: 1049
ОС: Linux Debian

[Решено. Нашёл ошибку в программе] Может ли кросс-компилятор некорректно транслировать?

Сообщение MiK13 »

Вожусь с программой для процессора с архитектурой ARM. Использую компилятор arm-linux-gnueabihf-gcc.
Программа имитирует перемещение неких объектов в реальном времени (писал другой человек, я только дописывал интерфейс и выдачу данных в сеть).
Программа работает около 1000 секунд. Затем начинает выдавать "странные" данные и в конце концов вылетает. До этого момента все данные выдаёт корректно.
Стал проверять дома на своём компьютере через qemu-user-binfmt. Картина аналогичная. В течение 970 секунд всё работало нормально, а потом стало твориться непонятно что.
Странслировал программу "родным" gcc. Запустил. Работала больше часа и всё было нормально.

В программе никаких потоков нет. Всё выполняется последовательно.

Как искать причину?
Может быть можно версию для ARM запустить на AMDшном компьютере под отладчиком?
Последний раз редактировалось MiK13 17.01.2022 16:09, всего редактировалось 1 раз.
Спасибо сказали:

IMB
Сообщения: 2535
ОС: Debian

Re: Может ли кросс-компилятор некорректно транслировать?

Сообщение IMB »

Можете использовать gdb-server и через него подключиться к выполняемой прграмме или попробовать другой toolchain, как пример, на linaro их есть выбор.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 19305
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Может ли кросс-компилятор некорректно транслировать?

Сообщение Bizdelnick »

Может. Но я бы искал прежде всего ошибку в коде. Для начала соберите с ubsan, asan и другими санитайзерами, погоняйте эти сборки.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
ormorph
Сообщения: 1957
ОС: Gentoo

Re: Может ли кросс-компилятор некорректно транслировать?

Сообщение ormorph »

Не думаю что тут дело в компиляторе. Тут скорее всего просто происходит переполнение вот и вылетает. Тут скорее дело в архитектуре процессора arm под который транслируете. Тем более что тут я так понял происходит перемещение объектов, а тут уже дело в алгоритме, скорее всего выполняется какая то сортировка. Особенно проблемно если выполняется рекурсия или её имитация с сохранением состояний в стеке. На новых 64 битных процессорах amd, intel, эта проблема может и не проявиться при использовании оптимизации, а вот с arm оптимизацию если она поддерживается процессором, нужно задавать явно.
Спасибо сказали:

MiK13
Сообщения: 1049
ОС: Linux Debian

Re: Может ли кросс-компилятор некорректно транслировать?

Сообщение MiK13 »

Bizdelnick писал:
12.01.2022 12:41
Может. Но я бы искал прежде всего ошибку в коде.
Я тоже подозреваю, что какая-то ошибка в коде.
Но сотрудник, который писал этот код, писал и отладил его много лет назад. Правда, для другого процессора (какого-то DSP)
Сейчас он просто повторил его с небольшими изменениями под новый компьютер.
Но я в коде заметил подозрительные моменты:
while (indPlots[m]==0) m++;
и
while (indPlots[m]) m++;
Без контроля на выход за границы массива.
Я добавил такой контроль, но это не помогло.
Хотя не могу исключить, что и я где-то что-то недосмотрел
Bizdelnick писал:
12.01.2022 12:41
Для начала соберите с ubsan, asan и другими санитайзерами, погоняйте эти сборки.
А как именно собрать?
Добавить опцию -fsanitize=address?
Слова "ubsan" и "asan" я в man gcc нашёл только в опциях вида -static-lib*san
И в каком месте их ставить?
У меня были проблемы, если опция -lm стояла не после имени транслируемого файла.
А с опцией -static была обратная проблема.
Спасибо сказали:

MiK13
Сообщения: 1049
ОС: Linux Debian

Re: Может ли кросс-компилятор некорректно транслировать?

Сообщение MiK13 »

Впечатление, что программа сильно портится.
grep indPlots *.c показал только три оператора присваивания: один indPlots[ i] = 1; и два indPlots[m] = 0;
Написал функцию, которая формирует строку s[j]=indPlots[j]+'0'; и если в ней только '0' или '1', заменяет эту строку на "== ОК =="
s объявлено static char s[MAX_PLOTS+1];
Программу запускал командой ./Prog ... | tee /dev/shm/L2
При печати этой строки в другом модуле сначала в этой строке стали появляться другие цифры -- 2, 3, 4, 5
А потом вообще я увидел большие последовательности нулевых байтов.
Как printf при выводе по формату %s может выводить нулевые байты, сообразить пока не могу.

На работе буду проверять на ARMовскм процессоре.

P.S. Собрал программу командой

Код: Выделить всё

WOPT = -Wall -Wextra -Wno-zero-length-bounds -std=c99 -fsanitize=address
	$(CC) $(WOPT) $(TFALL) -static-libasan -o Prog-s *.o -lm -static-libubsan
При работе выскочило

Shell

=================================================================
==3397==ERROR: AddressSanitizer: global-buffer-overflow on address 0x40659ee0 at pc 0x40098fff bp 0x3fffebe0 sp 0x3fffebe4
WRITE of size 4 at 0x40659ee0 thread T0
==3397==AddressSanitizer CHECK failed: ../../../../src/libsanitizer/sanitizer_common/sanitizer_procmaps_linux.cpp:52 "((IsOneOf(*data_.current, 's', 'p'))) != (0)" (0x0, 0x0)
Программа при этом работать перестала, но и не завершилась. Пришлось снять по Ctrl+C
Что это могло значить?
Спасибо сказали:

Аватара пользователя
ormorph
Сообщения: 1957
ОС: Gentoo

Re: Может ли кросс-компилятор некорректно транслировать?

Сообщение ormorph »

Вы запускаете программу на процессоре x86_64, но на нём уже показывает глобальное переполнение буфера.
Спасибо сказали:

MiK13
Сообщения: 1049
ОС: Linux Debian

Re: Может ли кросс-компилятор некорректно транслировать?

Сообщение MiK13 »

ormorph писал(а):
17.01.2022 05:04
Вы запускаете программу на процессоре x86_64, но на нём уже показывает глобальное переполнение буфера.
Да. Но что это за буфер и как он переполняется?
Сейчас буду пробовать на ARMовском процессоре. И попробую при компиляции добавить -g. Может быть поможет.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 19305
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Может ли кросс-компилятор некорректно транслировать?

Сообщение Bizdelnick »

MiK13 писал:
17.01.2022 02:35
А как именно собрать?
Добавить опцию -fsanitize=address?
-fsanitize=address,undefined
MiK13 писал:
17.01.2022 02:35
Слова "ubsan" и "asan" я в man gcc нашёл только в опциях вида -static-lib*san
И в каком месте их ставить?
А их ставить никуда не надо.
MiK13 писал:
17.01.2022 11:46
И попробую при компиляции добавить -g. Может быть поможет.
Да, её тоже добавьте.
Добавлено (15:11):
ormorph писал(а):
17.01.2022 05:04
глобальное переполнение буфера
Не «глобальное переполнение буфера», а переполнение глобального буфера.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

MiK13
Сообщения: 1049
ОС: Linux Debian

[Решено. Нашёл ошибку] Может ли кросс-компилятор некорректно транслировать?

Сообщение MiK13 »

Bizdelnick писал:
17.01.2022 14:44
MiK13 писал:
17.01.2022 02:35
А как именно собрать?
Добавить опцию -fsanitize=address?
-fsanitize=address,undefined
Так и сделал. Явно опция не показала, где ошибка, но помогла найти. Оказалась довольно дурацкая :)
Программа вылетела гораздо раньше и это навело на мысль ещё раз проверить все отладочные действия.
И в одном месте не было контроля.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 19305
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: [Решено. Нашёл ошибку в программе] Может ли кросс-компилятор некорректно транслировать?

Сообщение Bizdelnick »

MiK13 писал:
17.01.2022 16:07
Программа вылетела гораздо раньше
Так в том и смысл.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
ormorph
Сообщения: 1957
ОС: Gentoo

Re: [Решено. Нашёл ошибку в программе] Может ли кросс-компилятор некорректно транслировать?

Сообщение ormorph »

Ну так судя по выводу ошибка вылетала в момент записи 4 байт в стек. А это момент инициализации переменных и массивов. Где то память не выделили?
Спасибо сказали:

MiK13
Сообщения: 1049
ОС: Linux Debian

Re: [Решено. Нашёл ошибку в программе] Может ли кросс-компилятор некорректно транслировать?

Сообщение MiK13 »

ormorph писал(а):
17.01.2022 17:40
Ну так судя по выводу ошибка вылетала в момент записи 4 байт в стек. А это момент инициализации переменных и массивов. Где то память не выделили?
Нет. Всё было гораздо проще. И, в общем, глупее. Точнее, обычная невнимательность.
В программе есть большой цикл. Так как время обработки важно, я вставил в него занесение в массивы текущего времени, получаемого через gettimeofday. Чтобы после окончания цикла посмотреть, сколько микросекунд уходит на каждый фрагмент.
Значение max_loop можно задать через параметр.
И ввёл режим "бесконечного цикла", когда max_loop==0. Соответственно добавил условие if (max_loop) { ... }
Причём, в нескольких местах. А в одном месте забыл. Видимо потому, что анализировал время работы и добавил в ещё одно место, забыв про условие max_loop==0.
Не мог понять почему программа вылетает после 300К+ циклов (массивы было по 100000).
Когда после добавки -fsanitize=address она вылетела гораздо раньше, возникла мысль проверить, везде ли я проверяю на 0.
И нашёл ещё одно место.
Спасибо сказали:

Аватара пользователя
ormorph
Сообщения: 1957
ОС: Gentoo

Re: [Решено. Нашёл ошибку в программе] Может ли кросс-компилятор некорректно транслировать?

Сообщение ormorph »

А ну это вполне нормальная ситуация, когда сам себе злобный Буратино. :D
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 19305
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: [Решено. Нашёл ошибку в программе] Может ли кросс-компилятор некорректно транслировать?

Сообщение Bizdelnick »

ormorph писал(а):
17.01.2022 17:40
Ну так судя по выводу ошибка вылетала в момент записи 4 байт в стек.
Не в стек, а в .bss или .data.
ormorph писал(а):
17.01.2022 17:40
А это момент инициализации переменных и массивов.
Нет, это не инициализация. Инициализация глобальных переменных происходит ещё при загрузке бинарника в память, и выхода за границы там не может быть в принципе.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
ormorph
Сообщения: 1957
ОС: Gentoo

Re: [Решено. Нашёл ошибку в программе] Может ли кросс-компилятор некорректно транслировать?

Сообщение ormorph »

Bizdelnick писал:
17.01.2022 18:33
Не в стек, а в .bss или .data.
Как раз в стек, так как для указания адреса записи используется регистр bp.
Bizdelnick писал:
17.01.2022 18:33
Нет, это не инициализация. Инициализация глобальных переменных происходит ещё при загрузке бинарника в память, и выхода за границы там не может быть в принципе.
Фиг с ним, не инициализация, а присваивание.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 19305
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: [Решено. Нашёл ошибку в программе] Может ли кросс-компилятор некорректно транслировать?

Сообщение Bizdelnick »

ormorph писал(а):
17.01.2022 19:07
Как раз в стек, так как для указания адреса записи используется регистр bp.
Нет. С чего Вы взяли?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
ormorph
Сообщения: 1957
ОС: Gentoo

Re: [Решено. Нашёл ошибку в программе] Может ли кросс-компилятор некорректно транслировать?

Сообщение ormorph »

Bizdelnick писал:
17.01.2022 19:14
Нет. С чего Вы взяли?
А пардон, что то мне было показалось ранее, что там был указан адрес стека, но не перепроверил.
Спасибо сказали:

MiK13
Сообщения: 1049
ОС: Linux Debian

Re: [Решено. Нашёл ошибку в программе] Может ли кросс-компилятор некорректно транслировать?

Сообщение MiK13 »

Вторая, а может быть и главная моя ошибка была в том, что при отладке после добавления -fsanitize=address -g я не попробовал запустить вариант, сделанный обычным gcc.
Сейчас запустил -- программа вылетела с указанием номера строки.
А в этой строке было
t1[packNumb]=cur_delay;
Я бы сразу сообразил, что тут нет проверки на нулевое значение числа циклов.
А при запуске в режиме эмуляции он выдавал только адрес.
Может быть, если бы я запустил на Кортексе, скопировав туда исходники, он бы выдал номер строки.
Но я раньше догадался о причине :)
Спасибо сказали: