추적 작업(함수 그래프 작성)

 

몇 가지 코드(함수, 클래스 등)가 있다고 가정해 보겠습니다.

호출 스택을 만드는 작업이 있습니다. 그러나 선형이 아니라 나무의 형태입니다.

여기서 트리 노드는 함수에 대한 항목이 되고 분기는 노드의 현재 함수에서 다음 함수 호출이 됩니다.

예를 들어 다음과 같은 함수 구조가 있습니다.

 void Main() { A(); B(); }

void A() { /*вошли в А*/ a(); b(); c(); }
void B() { /*Вошли в B*/ a(); b(); c(); }

void a() { /*Вошли в а */ }
void b() { /*Вошли в b */ }
void c() { /*Вошли в c */ }

결과적으로 다음과 같이 보일 것입니다.


필수 조건:

기존 코드의 기능에서 "{" 바로 뒤에 하나 의 기능만 추가하여 추적을 구성할 수 있습니다.
동시에 원래 함수의 입력 매개변수나 그 결과 또는 내부 코드를 어떤 식으로든 변경하지 마십시오.

이 조건은 코드를 크게 수정하지 않기 위해 필요하지만 동일한 추적 기능(예: _TRACE_IN_이라고 함)을 사용 가능한 모든 코드 기능에 삽입하는 것으로만 제한됩니다. 소스 코드의 모든 패스를 가져오고 호출 트리를 빌드합니다.


어떤 아이디어나 옵션을 듣고 싶습니다.
아무리 비틀어도 그런 나무를 형성하려면 하나가 아니라 두 가지 기능을 호출해야 한다는 악순환에 걸려 넘어집니다. 그리고 어쨌든 하나만 필요합니다. :)

 

저것들. 소스 코드 알고리즘을 식별하는 프로그램을 만들고 싶습니다.

asma에서 다른 사람의 프로그램을 깨뜨렸을 때 나 자신을 위해 비슷한 일을했지만 당신의 접근 방식이 명확하지 않습니다 ...

왜 나무의 형태입니까?

아니면 내가 이해하지 못했을 수도 있습니다.

 
FLET :

저것들. 소스 코드 알고리즘을 식별하는 프로그램을 만들고 싶습니다.
asma에서 다른 사람의 프로그램을 깨뜨렸을 때 나 자신을 위해 비슷한 일을했지만 당신의 접근 방식이 명확하지 않습니다 ...
왜 나무의 형태입니까?
아니면 내가 이해하지 못했을 수도 있습니다.


'파괴'는 생각조차 하지 못했다. 하지만 맞았습니다. 이것은 코드의 논리적 구조를 구축하기 위한 것입니다.

즉, 작업 코드(내 자신 또는 다른 사람의 코드, 예를 들어 MT5의 표준 제공)를 포함하여 별도의 창 에서 호출된 함수의 전체 스택을 트리 형태로 가져옵니다. 한 주기 동안(틱) 즉, 루트에서 시작() 기능을 수행한 다음 점점 더 높아졌습니다....

오래전에 트리의 작업을 구현했습니다. 함수에 소요된 시간(코드 품질 분석), 함수 호출 횟수, 변수 값 추적 등을 분석합니다. 나는 또한 이 트리를 표시하기 위한 세 가지 옵션을 구현했습니다. 화면에 있는 것의 형태로, 원형 및 선형 다이어그램의 형태로. 그러나 그것은 모두 사소한 일입니다.

내가 직면한 가장 중요한 작업은 트리 구조 자체를 채우는 것이었습니다.

스크린샷에서와 같은 구조를 구축하기 위해 하나의 기능(또는 여러 할당이 가능하지만 가장 중요한 것은 연속으로 있음)의 도움으로 소스 코드 기능에 추가하는 방법에 대한 아이디어가 필요합니다 .

 
sergeev :

코드 함수의 시작 부분에 하나의 함수만 추가하여 스크린샷과 같은 구조를 구축하는 방법에 대한 아이디어가 필요합니다 .

불가능의 증명은 아이디어 에 실패합니까?
 
MetaDriver :
아이디어 가 불가능하다는 증거는 실패합니까?

그것은 실패할 것입니다 .... 그러나 옵션에 대한 3페이지의 토론 후에만 :))

복잡한 구현, 추가 변수, 전역 사용 등. 나는 모든 것을 받아들입니다 :)

 
sergeev :

그것은 실패할 것입니다 .... 그러나 옵션에 대한 3페이지의 토론 후에만 :))
란. 4페이지도 기대해주세요 ;-)
 
sergeev :

그것은 실패할 것입니다 .... 그러나 옵션에 대한 3페이지의 토론 후에만 :))


작업이 3페이지의 텍스트로 주제를 채우는 것으로 축소되었음을 의미합니까? :), 좋아, 시작하자;)

1. 문자열 작업: 함수 입력, 함수 이름 추가, 함수 종료 삭제, 로그/추적의 전체 라인을 선형 목록으로 지속적으로 표시:

시작(입력)-func1(입력)-func2(입력)

시작(입력)-기능1(입력)-기능2(종료)

...

IMHO 이 접근 방식은 불명예

2. 우리는 코드의 기능 수를 "손"으로 간주하며 이 숫자는 숫자 체계가 됩니다. 코드 10에서 함수 = 밑수 10, 코드 3에서 함수 = 밑수 3, 부울 대수를 사용하거나 행렬을 사용하여 더 쉽게, 우리는 함수의 입력/출력 집합에서 제외 또는 포함 작업을 수행합니다.

이와 비슷하지만 다시 IMHO - 게임이 촛불 가치가 있습니까? 할 일이 너무 많다

 

IgorM :

작업이 3페이지의 텍스트로 주제를 채우는 것으로 축소되었음을 의미합니까? :), 좋아, 시작하자;)

이지. 너무 덥지 않아!!! 모든 페이지는 여기에서 계산됩니다 :)

1. 문자열 작업: 함수에 진입, 함수 이름 추가, 함수에서 종료 삭제,

요구 사항에 맞지 않습니다. 입구에서 한 번만 호출하면 됩니다. 나오면 비현실적이다. 함수에는 여러 종료점이 있을 수 있습니다. 그리고 입구는 하나뿐입니다. 따라서 "첨가제"는 입구에만 있어야합니다.
 
sergeev :

이지. 너무 덥지 않아!!! 모든 페이지는 여기에서 계산됩니다 :)

늦게, 당신의 소원은 당신에 의해 소리;)

주제에 따르면 - IMHO는 여전히 행렬/다차원 배열로 작업해야 합니다. 그러면 추적의 수학적 모델이 나타나고 함수의 입력/출력 이벤트를 처리하는 방법은 또 다른 질문입니다.

 
IgorM :

늦게, 당신의 소원은 당신의 목소리에 의해;)

당신은 항상 가지를 묻을 수 있습니다. 그녀는 때가 되면 익사할 것이다. 그리고 이것은 소원이 아닙니다.

주제에 따르면 - IMHO는 여전히 행렬/다차원 배열로 작업해야 합니다. 그러면 추적의 수학적 모델이 나타나고 함수의 입력/출력 이벤트를 처리하는 방법은 또 다른 질문입니다.

조금 이해가 안됩니다. 여기에 행렬이 어떻게 맞는지 손가락으로 설명할 수 있습니까?

아이디어는 함수가 그래프(일반적인 방식으로 트리)에 속한다는 것입니다. 그러나 명확하게 시간순으로 전화를 걸고 무엇을 어디에서 불렀는지 식별합니다. 결국 동일한 함수를 startinit 에서 모두 호출할 수 있습니다. 이것은 수정해야 할 사항입니다.

(MQL5의 경우 /에서 수행하므로 그래프에 클래스를 사용합니다.)

 
sergeev :

카운트(민속적인 방식으로 나무).

트리는 그래프의 특수한 경우입니다.
사유: