[Решено. Нашёл ошибку в программе] Может ли кросс-компилятор некорректно транслировать?
Модератор: Модераторы разделов
-
- Сообщения: 1207
- ОС: Linux Debian
[Решено. Нашёл ошибку в программе] Может ли кросс-компилятор некорректно транслировать?
Вожусь с программой для процессора с архитектурой ARM. Использую компилятор arm-linux-gnueabihf-gcc.
Программа имитирует перемещение неких объектов в реальном времени (писал другой человек, я только дописывал интерфейс и выдачу данных в сеть).
Программа работает около 1000 секунд. Затем начинает выдавать "странные" данные и в конце концов вылетает. До этого момента все данные выдаёт корректно.
Стал проверять дома на своём компьютере через qemu-user-binfmt. Картина аналогичная. В течение 970 секунд всё работало нормально, а потом стало твориться непонятно что.
Странслировал программу "родным" gcc. Запустил. Работала больше часа и всё было нормально.
В программе никаких потоков нет. Всё выполняется последовательно.
Как искать причину?
Может быть можно версию для ARM запустить на AMDшном компьютере под отладчиком?
Программа имитирует перемещение неких объектов в реальном времени (писал другой человек, я только дописывал интерфейс и выдачу данных в сеть).
Программа работает около 1000 секунд. Затем начинает выдавать "странные" данные и в конце концов вылетает. До этого момента все данные выдаёт корректно.
Стал проверять дома на своём компьютере через qemu-user-binfmt. Картина аналогичная. В течение 970 секунд всё работало нормально, а потом стало твориться непонятно что.
Странслировал программу "родным" gcc. Запустил. Работала больше часа и всё было нормально.
В программе никаких потоков нет. Всё выполняется последовательно.
Как искать причину?
Может быть можно версию для ARM запустить на AMDшном компьютере под отладчиком?
Последний раз редактировалось MiK13 17.01.2022 16:09, всего редактировалось 1 раз.
-
- Сообщения: 2562
- ОС: Debian
Re: Может ли кросс-компилятор некорректно транслировать?
Можете использовать gdb-server и через него подключиться к выполняемой прграмме или попробовать другой toolchain, как пример, на linaro их есть выбор.
-
- Модератор
- Сообщения: 20909
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Может ли кросс-компилятор некорректно транслировать?
Может. Но я бы искал прежде всего ошибку в коде. Для начала соберите с ubsan, asan и другими санитайзерами, погоняйте эти сборки.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Сообщения: 2802
- ОС: Gentoo
Re: Может ли кросс-компилятор некорректно транслировать?
Не думаю что тут дело в компиляторе. Тут скорее всего просто происходит переполнение вот и вылетает. Тут скорее дело в архитектуре процессора arm под который транслируете. Тем более что тут я так понял происходит перемещение объектов, а тут уже дело в алгоритме, скорее всего выполняется какая то сортировка. Особенно проблемно если выполняется рекурсия или её имитация с сохранением состояний в стеке. На новых 64 битных процессорах amd, intel, эта проблема может и не проявиться при использовании оптимизации, а вот с arm оптимизацию если она поддерживается процессором, нужно задавать явно.
-
- Сообщения: 1207
- ОС: Linux Debian
Re: Может ли кросс-компилятор некорректно транслировать?
Я тоже подозреваю, что какая-то ошибка в коде.
Но сотрудник, который писал этот код, писал и отладил его много лет назад. Правда, для другого процессора (какого-то 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 была обратная проблема.
-
- Сообщения: 1207
- ОС: Linux Debian
Re: Может ли кросс-компилятор некорректно транслировать?
Впечатление, что программа сильно портится.
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. Собрал программу командой
При работе выскочило
Программа при этом работать перестала, но и не завершилась. Пришлось снять по Ctrl+C
Что это могло значить?
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)
Что это могло значить?
-
- Сообщения: 2802
- ОС: Gentoo
Re: Может ли кросс-компилятор некорректно транслировать?
Вы запускаете программу на процессоре x86_64, но на нём уже показывает глобальное переполнение буфера.
-
- Сообщения: 1207
- ОС: Linux Debian
-
- Модератор
- Сообщения: 20909
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Может ли кросс-компилятор некорректно транслировать?
-fsanitize=address,undefined
А их ставить никуда не надо.
Да, её тоже добавьте.
Добавлено (15:11):
Не «глобальное переполнение буфера», а переполнение глобального буфера.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Сообщения: 1207
- ОС: Linux Debian
[Решено. Нашёл ошибку] Может ли кросс-компилятор некорректно транслировать?
Так и сделал. Явно опция не показала, где ошибка, но помогла найти. Оказалась довольно дурацкая
![:)](./images/smilies/smile.gif)
Программа вылетела гораздо раньше и это навело на мысль ещё раз проверить все отладочные действия.
И в одном месте не было контроля.
-
- Модератор
- Сообщения: 20909
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: [Решено. Нашёл ошибку в программе] Может ли кросс-компилятор некорректно транслировать?
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Сообщения: 2802
- ОС: Gentoo
Re: [Решено. Нашёл ошибку в программе] Может ли кросс-компилятор некорректно транслировать?
Ну так судя по выводу ошибка вылетала в момент записи 4 байт в стек. А это момент инициализации переменных и массивов. Где то память не выделили?
-
- Сообщения: 1207
- ОС: Linux Debian
Re: [Решено. Нашёл ошибку в программе] Может ли кросс-компилятор некорректно транслировать?
Нет. Всё было гораздо проще. И, в общем, глупее. Точнее, обычная невнимательность.
В программе есть большой цикл. Так как время обработки важно, я вставил в него занесение в массивы текущего времени, получаемого через gettimeofday. Чтобы после окончания цикла посмотреть, сколько микросекунд уходит на каждый фрагмент.
Значение max_loop можно задать через параметр.
И ввёл режим "бесконечного цикла", когда max_loop==0. Соответственно добавил условие if (max_loop) { ... }
Причём, в нескольких местах. А в одном месте забыл. Видимо потому, что анализировал время работы и добавил в ещё одно место, забыв про условие max_loop==0.
Не мог понять почему программа вылетает после 300К+ циклов (массивы было по 100000).
Когда после добавки -fsanitize=address она вылетела гораздо раньше, возникла мысль проверить, везде ли я проверяю на 0.
И нашёл ещё одно место.
-
- Сообщения: 2802
- ОС: Gentoo
Re: [Решено. Нашёл ошибку в программе] Может ли кросс-компилятор некорректно транслировать?
А ну это вполне нормальная ситуация, когда сам себе злобный Буратино. ![:D](./images/smilies/biggrin.gif)
![:D](./images/smilies/biggrin.gif)
-
- Модератор
- Сообщения: 20909
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: [Решено. Нашёл ошибку в программе] Может ли кросс-компилятор некорректно транслировать?
Не в стек, а в .bss или .data.
Нет, это не инициализация. Инициализация глобальных переменных происходит ещё при загрузке бинарника в память, и выхода за границы там не может быть в принципе.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Сообщения: 2802
- ОС: Gentoo
Re: [Решено. Нашёл ошибку в программе] Может ли кросс-компилятор некорректно транслировать?
Как раз в стек, так как для указания адреса записи используется регистр bp.
Фиг с ним, не инициализация, а присваивание.Bizdelnick писал: ↑17.01.2022 18:33Нет, это не инициализация. Инициализация глобальных переменных происходит ещё при загрузке бинарника в память, и выхода за границы там не может быть в принципе.
-
- Модератор
- Сообщения: 20909
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: [Решено. Нашёл ошибку в программе] Может ли кросс-компилятор некорректно транслировать?
Нет. С чего Вы взяли?
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Сообщения: 2802
- ОС: Gentoo
Re: [Решено. Нашёл ошибку в программе] Может ли кросс-компилятор некорректно транслировать?
А пардон, что то мне было показалось ранее, что там был указан адрес стека, но не перепроверил.
-
- Сообщения: 1207
- ОС: Linux Debian
Re: [Решено. Нашёл ошибку в программе] Может ли кросс-компилятор некорректно транслировать?
Вторая, а может быть и главная моя ошибка была в том, что при отладке после добавления -fsanitize=address -g я не попробовал запустить вариант, сделанный обычным gcc.
Сейчас запустил -- программа вылетела с указанием номера строки.
А в этой строке было
t1[packNumb]=cur_delay;
Я бы сразу сообразил, что тут нет проверки на нулевое значение числа циклов.
А при запуске в режиме эмуляции он выдавал только адрес.
Может быть, если бы я запустил на Кортексе, скопировав туда исходники, он бы выдал номер строки.
Но я раньше догадался о причине![:)](./images/smilies/smile.gif)
Сейчас запустил -- программа вылетела с указанием номера строки.
А в этой строке было
t1[packNumb]=cur_delay;
Я бы сразу сообразил, что тут нет проверки на нулевое значение числа циклов.
А при запуске в режиме эмуляции он выдавал только адрес.
Может быть, если бы я запустил на Кортексе, скопировав туда исходники, он бы выдал номер строки.
Но я раньше догадался о причине
![:)](./images/smilies/smile.gif)