2014-09-18 1 views
1

일부 변경 후에는 일부 경우 응용 프로그램의 출력이 더 이상 유효하지 않습니다. 일부 출력 값이 잘못되었습니다. 출력을 계산하는 데 사용 된 값은 정확하며 복잡한 처리의 어느 시점에서는 상황이 잘못됩니다.C++ 변수의 값의 원점 추적

C++ 변수의 값의 출처를 추적하는 도구가 있습니까? 전에 valgrind를 사용하여 NULL 값을 추적했지만, 내가 원하는 것은 좀 더 일반적인 것입니다. 변수가 특정 시점에 값을 갖게하는 할당의 체인 (또는 트리)을 보여주는보다 일반적인 도구가 있습니까?

PS :이 코드는, 거의 모든 레거시 코드, 따라하기 어려운는 어떤 단위 테스트가없는 등

편집 : 데이터는 나에게 체인의 엔드 포인트를 표시 할 변수에 중단 점. 그것보다 조금 더 좋은 것이 좋을 것입니다.

+0

Visual Studio를 사용하면 변수의 변화에 ​​브레이크 포인트를 조정 할 수 있습니다 : http://stackoverflow.com/questions/160045/break-when-a - 값 - 변경 - 비주얼 - 스튜디오 - 디버거 사용 – thang

+2

"레거시 코드"가 그렇게 어려운 이유는 무엇입니까? 언어 주석이 새로운 기능입니까? – Bathsheba

+1

글쎄, 어떤 의미에서는 변수의 가치는 잠재적으로 프로그램의 이전 전체 역사에 의존합니다. 그러한 트리를 계산할 수있는 것은 무엇이든 매우 큰 결과를 산출 할 수 있습니다 ... –

답변

2

당신이 할 수있는 일은 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 
+0

OP가 스택 추적을 알고 싶어하는지 모르겠다. 그 값 뒤에있는 의존성 그래프를 알고 싶다. –

+0

그럴 수도 있습니다. 저는 작게 시작해서 점차적으로 객체 그래프와 그 진화를 추적하는 헬퍼를 만드는 것이 도움이 될 것이라고 생각합니다. 어떤 종류의 참조를 목표 값에 기록 할 추가 래퍼를 상상해보십시오. 하지만 코드를 읽고 디버깅하는 것만으로 전체적인 문제를 해결할 수 있습니다. [ "레거시 코드로 효과적으로 작업하기"] (http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052)는 작업에 대한 좋은 지침을 제공해야합니다. –

+0

노력에 감사드립니다. 나는 그것을 미래에 사용할지도 모른다. 그러나 기존 코드 기반에서 값의 출처를 추적하는 도구를 사용할 준비가되었습니다. –