Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

The Tracing Facility

Boost , ,

The Tracing Facility

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

Отслеживание макрорасширений генерирует, возможно, огромное количество информации, поэтому рекомендуется явно включить / отключить отслеживание только для рассматриваемого макроса. Это можно сделать с помощью специальной,Волныспецифической #прагмы:

    #pragma wave trace(enable)    // enable the tracing
    // the macro expansions here will be traced
    // ...
    #pragma wave trace(disable)   // disable the tracing

В режиме C99 или при указании-вариадикиОпция командной строки Вы можете дополнительно использовать оператор _Pragma()вариант для включения/отключения вывода трассировки:

    #define CONCAT(x, y) \
        _Pragma("wave trace(enable)") \
        x \
        _Pragma("wave trace(disable)") \
        ## y

Таким образом, у вас есть возможность включить отслеживание во время расширения только части макроса. В показанной выборке прослеживается только расширение макроаргумента'х'. Обратите внимание, что оператор_Pragma()директивы ни к чему не расширяются внутри результата макрорасширения.

Что посмотретьВолновойдрайвер генерирует при расширении простого макроса, давайте посмотрим на вывод трассировки для следующего примера:

    // test.cpp
    #define X(x)          x
#define Y() 2
#define CONCAT_(x, y) x ## y #define CONCAT(x, y) CONCAT_(x, y) #pragma wave trace(enable) // this macro expansion is to be traced CONCAT(X(1), Y()) // should expand to 12 #pragma wave trace(disable)

При предварительной обработке'wave -t test.trace test.cpp'Волновойдрайвер генерирует файлtest.trace, который содержит (без линейных номеров перед линиями):

  1: test.cpp:8:1: CONCAT(X(1), Y())
  2:   test.cpp:5:9: see macro definition: CONCAT(x, y)
  3:   invoked with
  4:   [
  5:     x = X(1)
  6:     y = Y()
  7:   ]
  8:   [
  9:     test.cpp:2:9: see macro definition: X(x)
 10:     invoked with
 11:     [
 12:       x = 1
 13:     ]
 14:     [
 15:       1
 16:       rescanning
 17:       [
 18:         1
 19:       ]
 20:     ]
 21:     test.cpp:3:9: see macro definition: Y()
 22:     [
 23:       2
 24:       rescanning
 25:       [
 26:         2
 27:       ]
 28:     ]
 29:     CONCAT_(1, 2)
 30:     rescanning
 31:     [
 32:       test.cpp:4:9: see macro definition: CONCAT_(x, y)
 33:       invoked with
 34:       [
 35:         x = 1
 36:         y = 2
 37:       ]
 38:       [
 39:         12
 40:         rescanning
 41:         [
 42:           12
 43:         ]
 44:       ]
 45:       12
 46:     ]
 47:   ]

Сгенерированный вывод следа очень многословен, но позволяет следить за каждым шагом процесса фактического макрорасширения. Первая строка в этом примере трассировки содержит ссылку на положение, откуда было инициировано макрорасширение. Кроме того, для каждого отдельного макро расширения содержится следующая информация:

  • Ссылка на положение (номер строки и столбца), где макрос для расширения был определен первым (см. строки 2, 9, 21 и 32).
  • Реальные параметры, поставляемые для этого макрорасширения (см. строки 3, 10 и 33), эта информация прослеживается внутри, вызванного блоком, где перечислены соответствующие формальные и фактические параметры.
  • Расширение приведенных аргументов (если таковые имеются и если они определены как макросы). Это повторяет полную информацию трассировки для аргумента макрорасширения, ограниченного только одним уровнем. Обратите внимание, однако, что макрорасширение фактических аргументов прослеживается, независимо от того, действительно ли этот аргумент должен быть вставлен в список замены после его расширения или как он был первоначально предоставлен (см. Стандарт C++ [16.3.1.1]: "Параметр в списке замены, если ему не предшествует#или#токен предварительной обработки или за которым следует#токен предварительной обработки, заменяется соответствующим аргументом после того, как все макросы, содержащиеся в нем, были расширены ";.
  • Результат замещения аргумента (см. строки 15, 23, 29 и 39), т.е. замещенный список замещения.
  • Процесс сканирования, который снова включает в себя полный последующий процесс макрорасширения всех найденных макросов (см. Стандарт C++ [16.3.4.1]: "После того, как все параметры в списке замены были заменены, результирующая последовательность токенов предварительной обработки пересканируется со всеми последующими токенами предварительной обработки исходного файла для замены большего количества макроимен.".
  • Результат фактического макрорасширения (это последняя строка внутри соответствующего блока сканирования - см. строки 18, 26, 42 и 45).

Каждый найденный макрос для расширения добавит дополнительный уровень углубления внутри вывода следа.


Статья The Tracing Facility раздела может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 03:38:08/0.0040040016174316/0