продвижение в МАКРОС в VC ++

встроенный прокси JMETER может использоваться для записи всего Запроса HTTP / информация об ответе.

Firefox" Живые HTTP-заголовки " плагин могут использоваться для наблюдения то, что происходит на стороне браузера при отправке/получении запроса.

Firefox" данные Трамбовки " плагин могут быть полезными, когда необходимо прервать и изменить запрос.

7
задан Alphaneo 30 September 2009 в 05:46
поделиться

6 ответов

В дополнение ко всем правильным ответам выше : обычно я показываю смешанный дисплей (сборка C +). Это показывает, что происходит на самом деле. Даже если вы не являетесь экспертом в базовой сборке, это дает представление о том, что происходит (то есть тривиальная замена или сложный цикл). Также это предоставит дополнительные возможности для входа в функции. Например, если ваш макрос

#define foo(a) i++;foo_func(a,i)

, ваш отладчик покажет что-то вроде looping and what kind of variables are used). You can use the macro definition as a reference to understand it.

00411454  mov         dword ptr [j],eax 
00411457  cmp         dword ptr [j],0Ah 
0041145B  jge         wmain+58h (411478h) 
    {
        foo(j);
0041145D  mov         eax,dword ptr [i] 
00411460  add         eax,1 
00411463  mov         dword ptr [i],eax 
00411466  mov         eax,dword ptr [i] 
00411469  push        eax  
0041146A  mov         ecx,dword ptr [j] 
0041146D  push        ecx  
0041146E  call        foo_func (411028h) 
00411473  add         esp,8 
    }

This gives a clue that variables i and j are used to call function foo_func.

If you use Visual C++, it will allow you to step into functions called from a macro (F11); not individual statements though.

3
ответ дан 6 December 2019 в 23:10
поделиться

АОП - это то, что вам здесь нужно. АОП позволяет добавлять код в приложение, не изменяя исходный код. Spring AOP предпочитает делать это с помощью объектов Proxy . Прокси-объекты используют шаблон декоратора для обертывания исходного объекта Target и добавления кода. Прокси сконфигурирован для реализации одного или нескольких интерфейсов исходного объекта Target .

Здесь для определения времени приложения идея состоит в том, чтобы использовать PerformanceMonitorInterceptor , один из классов мониторинга производительности, которые поставляются со Spring Framework.

Первый вариант - использовать класс Spring ProxyFactoryBean для создания объектов Spring AOP Proxy . Для этого:

  • Определите свой исходный bean-компонент :
  • Определите PerformanceMonitorInterceptor :
  • Определите RegexpMethodPointcutAdvisor :
  • Определите ProxyFactoryBean для прокси-сервера вашего исходного [bean-компонента] 11145 и примените его
  • Установите уровень журнала для PerformanceMonitorInterceptor на TRACE

Ниже конфигурации Spring, которая иллюстрирует эти шаги:

<beans>
  <bean id="MyServiceTarget" class="org.myapp.services.MyService">
    <property ... />
  </bean>

  <bean id="timingLogger" class="org.springframework.aop.interceptor.PerformanceMonitorInterceptor"/>

  <bean id="timingAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
    <property name="advice" ref="timingLogger"/>
    <property name="patterns">
      <list>
        <value>.*</value>
      </list>
    </property>
  </bean>

  <bean id="MyService" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="proxyInterfaces">
      <value>org.myapp.services.MyService</value>
    </property>
    <property name="target"><ref local="MyServiceTarget"/></property>
    <property name="interceptorNames">
      <list>
        <value>timingAdvisor</value>
      </list>
    </property>
  </bean>
</beans>

И конфигурация уровня журнала для PerformanceMonitorInterceptor :

log4j.logger.org.springframework.aop.interceptor.PerformanceMonitorInterceptor=TRACE

Начиная с Spring 2.0, есть еще один вариант: использование Spring 2.0 XML-схемы конфигурации и выражений pointcut в стиле Spring AspectJ . С помощью ProxyFactoryBean вы должны явно объявить интерфейсы, которые вы хотите использовать в качестве прокси; используя

2
ответ дан 6 December 2019 в 23:10
поделиться

Длинный ответ. Нет.

Вы можете создать полный список макросов, раскрытых в параметрах компилятора. Это может немного помочь, но не даст вам возможностей отладчика

2
ответ дан 6 December 2019 в 23:10
поделиться

Насколько мне известно, единственный отладчик, который мог вмешиваться в макросы, не работает (SoftICE). Отличный пример того, почему не стоит писать макросы из 50 строк. Итак, в целом ... удачи.

1
ответ дан 6 December 2019 в 23:10
поделиться

Возможно, мой ответ не поможет пользователям VC ++. В Unix я делаю что-то вроде этого:

gcc -E prog.c | indent > prog-formatted.c

т.е. вы предварительно обрабатываете программу и переформатируете ее.

2
ответ дан 6 December 2019 в 23:10
поделиться

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

В C ++ шаблоны могут делать большинство вещей, которые могут делать макросы, но они работают намного, намного более элегантно. Поскольку они являются реальной частью языка, вы также можете подключиться к ним с помощью отладчика! Например:

// Macro FIND() - ugly, buggy, and can't ever be stepped in to by debugger!
#define FIND(begin, end, value) \
{ \
    for ( ; begin != end; ++begin) { \
        if (*begin == value) \
            break; \
    } \
}

// Templated find() - works beautifully and can be debugged like a real function!
template<typename Iter, typename T>
Iter find(Iter begin, Iter end, const T& value)
{
    for ( ; begin != end; ++begin) {
        if (*begin == value)
            return begin;
    }
}

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

1
ответ дан 6 December 2019 в 23:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: