Jump to content
    

Неадекватное поведение отладчика в VITIS2019.2

По долгу службы пришлось делать работу штатного программиста и писать драйвер и программу под цинк 7к. До этого момента с витисом дел не имел. и на сях писал толкьо простенькие скетчи для ардуины.  И, собственно, в процессе отладки столкнулся с несколькими непонятными моментами.

 

1. Запускаю дебагер, пошагово выполняю программу. При входе в функцию XEmacPs_BdRingCreate (библиотека "xemacps_bdring.c" драйвера emacps) наблюдаю следующую картину - пошаговый отладчик в линейно написанном коде скачет по строкам как хочет. Условно последовательность выполнения строк может быть - 1-2-3-4-5-10-6-7-15-20-15-16-11-25, итд итп. При том что выполнятся они должны линейно - 1-2-3-4-...-20-21-23-... (ну, за исключением цикла). Код в строчках (если на нее прыгнули) выполняется, переменные переписываются. Вопрос в том что значения этих переменных из-за скачков - не верные. Собственно вопрос - это что за фигня?

2. В этой же функции присутствует цикл на 2 строчки - заполнение адресов цепочки дескрипторов. Ввиду первого пункта этот цикл не выполняется от слова совсем. Счетчик цикла не наращивается. Но было замечено следующее - при удалении объявления переменной счетчика цикла, компилятор не ругается на наличие необъявленной переменной. Компилятор ругается на то что не может найти подключаемую стандартную библиотеку "xil_types.h" в самописной библиотеке, в совершенно другом файле, написанном для работы с микрухой физики. Самописная библиотека до этого была проверена и отлажена. Проверки на двойные включения либ в ней есть. И, собственно, второй вопрос - это что за хрень??? Где связь между необъявленной переменной и включением библиотеки в другом конце кода?????

 

Ну и главный вопрос - куда бежать и что делать? Я сейчас что-то даже поисковый запрос для гугла не могу составить... Фиг знает что у него спрашивать, чтобы адекватный ответ получить

Share this post


Link to post
Share on other sites

15 минут назад, GAYVER сказал:

1. Запускаю дебагер, пошагово выполняю программу... Собственно вопрос - это что за фигня?

Вероятно, программа собрана под ненулевым уровнем оптимизации. В оптимизированной программе зависимости между Си и реальным дизасм-выхлопом ломаются от слова совсем.

По второму пункту - опять же - если смотрите под отладчиком на оптимизации - то занятие бесполезное. На выходе из функции если результат правильный - значит все ок.

Share this post


Link to post
Share on other sites

19 минут назад, Arlleex сказал:

Вероятно, программа собрана под ненулевым уровнем оптимизации. В оптимизированной программе зависимости между Си и реальным дизасм-выхлопом ломаются от слова совсем.

По второму пункту - опять же - если смотрите под отладчиком на оптимизации - то занятие бесполезное. На выходе из функции если результат правильный - значит все ок.

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

 

апд

в настройках си билдера оптимизейшен левел - 0. Т.е. выключен

Share this post


Link to post
Share on other sites

Только что, GAYVER сказал:

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

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

Share this post


Link to post
Share on other sites

5 минут назад, Arlleex сказал:

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

а не подскажете тогда - где смотреть эти настройки?

 

апд

функция возвращает не совсем то, что я ожидаю. собственно поэтому и полез во внутрянку - смотреть что там происходит

Share this post


Link to post
Share on other sites

Ну, тут я только задал направление поисков)) А с эклипса под рукой нет, чтобы точно что-то написать...

Share this post


Link to post
Share on other sites

Только что, Arlleex сказал:

Ну, тут я только задал направление поисков)) А с эклипса под рукой нет, чтобы точно что-то написать...

Не прокатило... Но таки спасибо - сходим в этом направлении 🙂

Share this post


Link to post
Share on other sites

Если код оптимитзирован, а пошагово пройти все-таки нужно, то нужно переключиться в другое View/отображение кода - в ассемблерное. И будете проходить его без всяких непонятных скачков по коду. Обычно нормальные IDE здесь же показывают куски исходного C кода, соответствующие показанным оттранслированным ассемблерным. Так что все хорошо видно и понятно.

Share this post


Link to post
Share on other sites

а как быть со 2 пунктом? где связь между счетчиком цикла и в невозможности включить станадарнтую библиотеку в другом конце кода?

Share this post


Link to post
Share on other sites

2 hours ago, GAYVER said:

а как быть со 2 пунктом? где связь между счетчиком цикла и в невозможности включить станадарнтую библиотеку в другом конце кода?

А вы посмотрели получившийся после оптимизации ассемлерный код этого цикла? Это не помогло прояснить ситуацию?

Share this post


Link to post
Share on other sites

14 часов назад, Raven сказал:

А вы посмотрели получившийся после оптимизации ассемлерный код этого цикла? Это не помогло прояснить ситуацию?

оптимизация отключена. это раз. как посмотреть разрешения на оптимизацию отдельно взятого файла я так и не нашел. два - компилятор при прогоне кода при любых раскладах должен ругаться на использование не объявленной переменной. этого не будет только в том случае, если цикл вырождается в 1 прогон. т.е. просто в однократное линейное выполнение операторов в теле цикла. но этого не может быть потому, что верхняя граница цикла - параметр, передаваемый в функцию. который является ненулевой константой. по крайней мере на этапе отладки. в дальнейшем будет переменной

Share this post


Link to post
Share on other sites

8 минут назад, GAYVER сказал:

как посмотреть разрешения на оптимизацию отдельно взятого файла я так и не нашел

Смотрите параметры компилятора при компиляции интересного вам файла. Или есть другой вариант - использовать pragma GCC optimize для выбора нужного вам уровня оптимизации в интересующем вас файле - https://codeforces.com/blog/entry/96344

Share this post


Link to post
Share on other sites

Иногда нечто подобное начинается если вы читаете или пишете в регистры плис не используя для этого волатильные указатели/переменные. 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...