встроенный прокси JMETER может использоваться для записи всего Запроса HTTP / информация об ответе.
Firefox" Живые HTTP-заголовки " плагин могут использоваться для наблюдения то, что происходит на стороне браузера при отправке/получении запроса.
Firefox" данные Трамбовки " плагин могут быть полезными, когда необходимо прервать и изменить запрос.
В дополнение ко всем правильным ответам выше : обычно я показываю смешанный дисплей (сборка 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.
АОП - это то, что вам здесь нужно. АОП позволяет добавлять код в приложение, не изменяя исходный код. Spring AOP предпочитает делать это с помощью объектов Proxy . Прокси-объекты используют шаблон декоратора для обертывания исходного объекта Target и добавления кода. Прокси сконфигурирован для реализации одного или нескольких интерфейсов исходного объекта Target .
Здесь для определения времени приложения идея состоит в том, чтобы использовать PerformanceMonitorInterceptor
, один из классов мониторинга производительности, которые поставляются со Spring Framework.
Первый вариант - использовать класс Spring ProxyFactoryBean
для создания объектов Spring AOP Proxy . Для этого:
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
вы должны явно объявить интерфейсы, которые вы хотите использовать в качестве прокси; используя
Длинный ответ. Нет.
Вы можете создать полный список макросов, раскрытых в параметрах компилятора. Это может немного помочь, но не даст вам возможностей отладчика
Насколько мне известно, единственный отладчик, который мог вмешиваться в макросы, не работает (SoftICE). Отличный пример того, почему не стоит писать макросы из 50 строк. Итак, в целом ... удачи.
Возможно, мой ответ не поможет пользователям VC ++. В Unix я делаю что-то вроде этого:
gcc -E prog.c | indent > prog-formatted.c
т.е. вы предварительно обрабатываете программу и переформатируете ее.
Когда вы используете макрос, код, стоящий за ним, расширяется до той же строки исходного кода, насколько это касается отладчика. Отладчик видит 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 (), конечно, является стандартной библиотечной функцией, но я просто написал ее, чтобы сравнить ее с макросом, чтобы продемонстрировать, как ее можно отладить. Не говоря уже о том, что у макросов есть много других проблем. Практическое правило: по возможности избегайте макросов для написания кода!