![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
The Tracing FacilityBoost , ,
Если вам когда-либо приходилось отлаживать макрорасширение, вы должны были обнаружить, что ваши инструменты обеспечивают лишь небольшую поддержку этой задачи. По этой причине библиотека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 При предварительной обработке'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: ] Сгенерированный вывод следа очень многословен, но позволяет следить за каждым шагом процесса фактического макрорасширения. Первая строка в этом примере трассировки содержит ссылку на положение, откуда было инициировано макрорасширение. Кроме того, для каждого отдельного макро расширения содержится следующая информация:
Каждый найденный макрос для расширения добавит дополнительный уровень углубления внутри вывода следа.
Copyright © 2003-2011 Hartmut Kaiser Last updated: Tuesday, March 21, 2006 9:25 Статья The Tracing Facility раздела может быть полезна для разработчиков на c++ и boost. Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: ::
|
|||||||||||||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |