코드의 그림 함수 호출 그래프를 가져오는 도구
저는 C코드의 소스 파일이 많은 넓은 작업 공간을 가지고 있습니다.오브젝트 브라우저를 사용하여 MS VS2005의 함수에서 호출된 함수를 볼 수 있지만 MSVC 6.0에서는 특정 함수에서 호출된 함수만 그래픽이 아닌 디스플레이로 표시할 수 있습니다.하다'라고 하는 있지 않습니다.main()
그 후 호출된 함수가 리프 레벨 함수에 더 깊이 들어가 있습니다.
할 수 합니다.callee
★★★★★★★★★★★★★★★★★」caller
main()
또는 적어도 하나의 C 소스 파일에 있는 모든 함수의 콜그래프를 그림으로 표시합니다.이 그래프를 인쇄할 수 있으면 좋겠습니다.
그러기 위한 좋은 툴이 있습니까(무료 툴은 필요 없음)?
동적 분석 방법
여기에서는 몇 가지 동적 분석 방법을 설명합니다.
동적 메서드는 실제로 프로그램을 실행하여 콜 그래프를 결정합니다.
동적 메서드의 반대는 정적 메서드로, 프로그램을 실행하지 않고 소스만으로 판단하려고 합니다.
동적 방법의 이점:
- 는 함수 포인터와 가상 C++ 콜을 캡처합니다.이것들은 간단한 소프트웨어가 아닌 소프트웨어에는 다수 존재합니다.
동적 방식의 단점:
- 프로그램을 실행해야 하는데, 이는 느릴 수도 있고, 교차 컴파일과 같은 설정이 필요할 수도 있습니다.
- 실제로 호출된 함수만 표시됩니다.예를 들어 일부 함수는 명령줄 인수에 따라 호출되거나 호출되지 않을 수 있습니다.
Kcache Grind
https://kcachegrind.github.io/html/Home.html
테스트 프로그램:
int f2(int i) { return i + 2; }
int f1(int i) { return f2(2) + i + 1; }
int f0(int i) { return f1(1) + f2(2); }
int pointed(int i) { return i; }
int not_called(int i) { return 0; }
int main(int argc, char **argv) {
int (*f)(int);
f0(1);
f1(1);
f = pointed;
if (argc == 1)
f(1);
if (argc == 2)
not_called(1);
return 0;
}
사용방법:
sudo apt-get install -y kcachegrind valgrind
# Compile the program as usual, no special flags.
gcc -ggdb3 -O0 -o main -std=c99 main.c
# Generate a callgrind.out.<PID> file.
valgrind --tool=callgrind ./main
# Open a GUI tool to visualize callgrind data.
kcachegrind callgrind.out.1234
흥미로운 퍼포먼스 데이터가 많이 포함된 멋진 GUI 프로그램 안에 남게 되었습니다.
오른쪽 아래에서 "Call Graph" 탭을 선택합니다.이 그래프는 함수를 클릭할 때 다른 창의 성능 메트릭과 관련된 인터랙티브콜 그래프를 보여줍니다.
그래프를 내보내려면 그래프를 마우스 오른쪽 버튼으로 클릭하고 "그래프 내보내기"를 선택합니다.내보낸 PNG는 다음과 같습니다.
여기서 알 수 있습니다.
- 는 " " " 입니다.
_start
가 포함되어 있습니다. f0
,f1
★★★★★★★★★★★★★★★★★」f2
대로pointed
함수 포인터로 호출했는데도 표시됩니다.명령줄 인수를 전달했다면 호출되지 않았을 수 있습니다.not_called
실행 중 호출되지 않았기 때문에 추가 명령줄 인수를 전달하지 않았기 때문에 표시되지 않습니다.
★★★★★의 멋진 점valgrind
특별한 컴파일 옵션이 필요하지 않다는 것입니다.
따라서 소스 코드가 없어도 실행 파일만 사용할 수 있습니다.
valgrind
에서는, 경량 「가상 머신」을 개입시켜 코드를 실행해, 그 처리를 실시합니다.이로 인해 네이티브 실행에 비해 실행 속도가 매우 느려집니다.
그래프에서 알 수 있듯이 각 함수 호출에 대한 타이밍 정보도 취득할 수 있습니다.이 정보를 사용하면 콜그래프뿐만 아니라 이 설정의 원래 사용 사례일 가능성이 있습니다.Linux에서 실행 중인 C++ 코드를 프로파일하려면 어떻게 해야 합니까?
Ubuntu 18.04로 테스트.
gcc -finstrument-functions
+ etrace
https://github.com/elcritch/etrace
-finstrument-functions
는 콜백을 추가하고 etrace는 ELF 파일을 해석하여 모든 콜백을 구현합니다.
그러나 유감스럽게도 작동하지 않았습니다.왜 '-종료-함수'는 나에게 효과가 없을까?
청구된 출력 형식은 다음과 같습니다.
\-- main
| \-- Crumble_make_apple_crumble
| | \-- Crumble_buy_stuff
| | | \-- Crumble_buy
| | | \-- Crumble_buy
| | | \-- Crumble_buy
| | | \-- Crumble_buy
| | | \-- Crumble_buy
| | \-- Crumble_prepare_apples
| | | \-- Crumble_skin_and_dice
| | \-- Crumble_mix
| | \-- Crumble_finalize
| | | \-- Crumble_put
| | | \-- Crumble_put
| | \-- Crumble_cook
| | | \-- Crumble_put
| | | \-- Crumble_bake
특정 하드웨어 트레이스 지원 외에 가장 효율적인 방법이지만 코드를 다시 컴파일해야 하는 단점이 있습니다.
CScope + tceetree + Graphviz 를 사용해 주세요.
당사의 DMS Software Reengineering Toolkit은 정적 제어/데이터 플로우/포인트 투/콜 그래프 분석을 C 코드의 거대한 시스템(~2500만 라인)에 적용하여 함수 포인터를 통해 호출되는 함수를 포함한 콜 그래프를 생성하였습니다.
는 콜 그래프를 매우 잘 만듭니다.
Arstée는 가장 견고하고 정교한 도구 IMHO입니다.
여기서 bash 기반의 C 콜트리 생성기를 확인하실 수 있습니다.발신자 또는 착신자 정보를 필요로 하는1 개 또는 복수의 C 함수를 지정할 수 있습니다.또, 일련의 함수를 지정해, 그것들을 접속하는 함수 콜의 도달 가능성 그래프를 결정할 수도 있습니다.즉, main(), foo() 및 bar()가 연결되어 있는 모든 방법을 알려 주십시오.그래프 작성 엔진으로 graphviz/dot을 사용합니다.
언급URL : https://stackoverflow.com/questions/517589/tools-to-get-a-pictorial-function-call-graph-of-code
'programing' 카테고리의 다른 글
Python C API를 사용하여 생성기/반복기를 만드는 방법은 무엇입니까? (0) | 2022.08.17 |
---|---|
에러노 스레드는 안전합니까? (0) | 2022.08.17 |
Cython 대신 Python/C 인터페이스를 사용하는 장점이 있습니까? (0) | 2022.08.17 |
'얼라인먼트 포인터'란 정확히 무엇입니까? (0) | 2022.08.17 |
어레이의 랜덤 전환 (0) | 2022.08.17 |