2009-10-06 3 views
2

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

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

Мои вопросы:

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

ответ

5

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

  1. Что касается заявления я обнаружил, что некоторые функции не перечислены в источнике, пытаясь найти их, чтобы поставить точки останова», просто проверьте файл Mapping/Map, который состоит из различных функций, которые были использованы в сборке, их расположения в памяти и т. д., и если вы не найдете там свою функцию, а просто посмотрите на оптимизацию [Только это может быть проблемой] .

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

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

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

Надежда это помогает.

-hjsblogger

1

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

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

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

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

1

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

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

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

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

Каковы имена «функций тайны»?

4

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^