당신이 할 수있는 일은 stacktrace과 각 호출의 값을 기록하는 제네릭 래퍼 제품군으로 관심있는 변수를 래핑하는 것입니다. (일부 세부 사항을 생략)와 같은 뭔가 :
template <typename T>
class TracingValue
{
private:
T m_Val;
...
void LogStackTrace() {...}
public:
// write
TracingValue& operator= (const T& val) {
LogStackTrace();
m_Val=val;
return *this;
}
// read
operator T() const { return m_Val; }
// "connect" to other values
TracingValue& operator=(const TracingValue &other) {
LogStackTrace();
m_Val = other.m_Val;
std::cout << "id: " << this->Id() << " new value: " << m_Val
<< " from id: " << other.Id() << std::endl;
return *this;
}
};
이 스택 트레이스가 느려집니다 로그인 및 너무 많은 데이터를 생성 할 수 있습니다,하지만 당신은 아껴서 사용하는 경우, 당신은 당신의 소프트웨어에서 무슨 일이 일어나고 있는지 더 나은 사진을 얻을 수 있습니다. 그런 다음 래퍼에 중단 점을 넣을 수 있습니다.
사소한 경우에는 효과가 있습니다. 직렬화 및 기타 작업이 관련된 경우에는 더 자세히 구체화해야 할 수도 있습니다.
다른 래핑 된 값의 추적 값 변경 및 구성이 가능합니다. 예제 → Ideone를 참조하십시오
TracingValue<double> d;
d = 3.;
d = 42.;
double x = d - 2.;
std::cout << x << std::endl;
TracingValue<double> other_d(d);
TracingValue<double> another_d;
another_d = other_d;
가 출력
id: 1 constructed with value: 0
id: 1 new value: 3
id: 1 new value: 42
40
id: 2 constructed with value: 42
id: 2 constructed from id: 1
id: 3 constructed with value: 0
id: 3 new value: 42 from id: 2
Visual Studio를 사용하면 변수의 변화에 브레이크 포인트를 조정 할 수 있습니다 : http://stackoverflow.com/questions/160045/break-when-a - 값 - 변경 - 비주얼 - 스튜디오 - 디버거 사용 – thang
"레거시 코드"가 그렇게 어려운 이유는 무엇입니까? 언어 주석이 새로운 기능입니까? – Bathsheba
글쎄, 어떤 의미에서는 변수의 가치는 잠재적으로 프로그램의 이전 전체 역사에 의존합니다. 그러한 트리를 계산할 수있는 것은 무엇이든 매우 큰 결과를 산출 할 수 있습니다 ... –