2011-08-22 4 views
1

다소 복잡한 알고리즘 내에서 불필요한 중복 호출을 추적하는 데 어려움을 겪고 있습니다.DTrace를 사용하여 호출 스택 트리에서 중복 함수 호출 감지

내 알고리즘은 캐시되지 않고 비교적 비싼 함수의 중복 호출 (여러 서브 루틴에서)으로 인해 속도가 크게 느려지는 것처럼 보입니다. 이것을 확인하기 위해 Dtrace를 사용하여 호출 스택 트리의 주어진 분기 내에서 단일 함수의 여러 호출을 감지하려고합니다.

I가 DTrace를 요청할 수 있도록하고 싶습니다 : ("c();"을 예를) 중복 된 함수 호출에 대한 (첨부 이미지 참조, 여기 "foo();") 주어진 함수 내에서 호출 스택 트리를 검색

또한 가능한 경우 :

  • 는 (배 "c();" 여기) 각각의 호출 횟수로 로그

    • 로그 각 경우 ("foo()/a()/c()", "foo()/a()/b()/c()", "foo()/a()/b()/d()/c()")의 호출 스택.

    이 가능합니까? 그리고 그렇다면 어떻게 생각하십니까?

    미리 감사드립니다.

    enter image description here

    참고 : 그것은해야하지, 내 코드는 오브젝티브 C에 실제로 비록 내 샘플 코드에서 C를 사용하지만, 이런 종류의 언어에 얽매이지의 종류해야 하는가? 일반적인 접근 방식/아이디어.

  • 답변

    1

    제가 사용하는 방법은 this example에서와 같이 random-pausing입니다. 아이디어는 스택 추적이 그들이 책임지고있는 벽시계로 가중치를 적용한 것을보고 싶습니다. 중요한 시간을 담당하는 함수 호출 사이트가 우선적으로 표시됩니다.

    그런 다음 살펴 보겠습니다. 스택 추적은 실행중인 이유를 알려줍니다. 그것 없이는 할 수있는 방법이 있는지 알 수 있습니다. 이렇게하면 저장 시간이 스택에 있었던 시간과 동일합니다.

    참고 : 이렇게하면 해당 사이트에서 함수가 호출 된 횟수 또는 실행 시간을 고려하지 않아도됩니다. 호출 사이트가 적어도 두 개의 샘플에서 스택에 있고 제거 될 수 있다는 점에주의해야합니다.