Отладка с использованием Lauterbach (Trace32) - PullRequest
2 голосов
/ 06 октября 2009

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

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

Мои вопросы:

  1. Как эта оптимизация происходит через Лаутербах?
  2. Это выгодно ??

Ответы [ 4 ]

5 голосов
/ 08 октября 2009

Есть несколько вещей:

  1. Относительно оператора Я обнаружил, что немногие функции не перечислены в источнике при попытке найти их для установки точек останова ", просто проверьте файл сопоставления / Файл карты, который состоит из различных функций, которые использовались в сборке, их расположения в памяти и т. Д., И если вы там не найдете свою функцию, просто посмотрите на оптимизацию [Только это может быть проблемой].

  2. Как правильно указано, оптимизация не выполняется Лаутербахом, а выполняется компилятором. Обычно существуют разные уровни оптимизации [в ARM у нас есть O0-O2], где O0 - максимально возможная оптимизация, но ее следует использовать только при выпуске для клиента, иначе для оптимизации следует использовать уровень оптимизации O2.

  3. Если вы считаете, что функция может быть оптимизирована компилятором, попробуйте сделать ее volatile .

  4. Другой момент, который не может быть [напрямую] связан с этим, но может помочь, это знать, «в какой области памяти находится ваш файл» много раз, когда вы хотите что-то отладить, и эта страница все еще не в ОЗУ, вы не сможете устанавливать точки останова до тех пор, пока страница не будет занята в ОЗУ [в основном, что-то вроде пейджинга по требованию, если оно присутствует в вашей системе]

Надеюсь, это поможет.

-hjsblogger

4 голосов
/ 07 октября 2009

Оптимизация выполняется компилятором, а не Lauterbach. Компилятор пытается оптимизировать вывод на ассемблере, и настройки по умолчанию обычно включают встроенные функции, которые вызываются только один раз.

Чтобы переопределить эти оптимизации в тестовых целях, вы можете использовать флаг компилятора - no_inline .

1 голос
/ 06 октября 2009

Если вызывается функция, которую вы не можете найти в исходном коде, это вряд ли из-за встроенных функций по двум причинам:

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

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

Но компиляторы иногда вставляют вызовы таинственных функций во внутренние вспомогательные функции в сгенерированный код для реализации таких вещей, как арифметические операции, которые ЦП не поддерживает напрямую (например, целочисленное деление или операции с плавающей запятой).

Как называются «тайные функции»?

1 голос
/ 06 октября 2009

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

Преимущество состоит в том, что он экономит накладные расходы при вызове функции (время выполнения, пространство кода и пространство стека), и вы все равно можете написать код в хорошем модульном виде в виде нескольких функций.

Недостаток в том, что отладка усложняется, потому что во время отладки функция перепутана с вызывающим.

W.r.t. поведение вашего инструмента трассировки ваш вопрос довольно неясен.

...