>백엔드 개발 >C++ >실행 경로를 추적하기 위해 C 코드에 대한 호출 그래프를 생성하려면 어떻게 해야 합니까?

실행 경로를 추적하기 위해 C 코드에 대한 호출 그래프를 생성하려면 어떻게 해야 합니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-14 21:30:02296검색

How Can I Generate Call Graphs for C   Code to Trace Execution Paths?

실행 경로 추적을 위한 C 코드용 호출 그래프 생성

C 프로그래밍에서 특정 기능으로 이어지는 가능한 모든 실행 경로를 식별하는 것은 다음과 같습니다. 특히 복잡한 코드베이스를 다룰 때 시간이 많이 걸리는 수동 작업입니다. 여기서 함수 호출 관계를 그래픽으로 표현하는 호출 그래프가 필요합니다.

CodeViz 및 Doxygen 제한

CodeViz 및 Doxygen과 같은 도구를 사용하여 호출 그래프를 생성할 수 있지만, 그들은 종종 대상 함수의 표시 전용 피호출자에 중점을 둡니다. 전체 호출 계층을 추적해야 하는 상황에서는 이 방법이 충분하지 않을 수 있습니다.

LLVM 및 Graphviz를 사용하는 효과적인 방법

강력한 접근 방식에는 LLVM 컴파일러를 활용하는 것이 포함됩니다. 호출 그래프 생성을 위한 인프라 및 Graphviz:

  1. clang을 사용하여 코드를 LLVM 비트코드로 컴파일 -S -emit-llvm.
  2. opt -analyze를 사용하여 호출 관계를 식별하기 위해 비트코드를 분석합니다.
  3. -dot-callgraph를 사용하여 호출 그래프의 DOT 표현을 생성합니다.
  4. dot -Tpng를 사용하여 그래프를 시각화합니다.

여기 예:

$ clang++ -S -emit-llvm main1.cpp -o - | opt -analyze -dot-callgraph
$ dot -Tpng -ocallgraph.png callgraph.dot

이렇게 하면 대상 함수로 이어지는 실행 경로를 묘사하는 호출 그래프 PNG 이미지(callgraph.png)가 생성됩니다.

외부 링크 처리

main이 외부에서 호출되는 것으로 가정하므로 외부 연결로 인해 복잡성이 발생할 수 있습니다. 이 문제를 해결하려면:

  1. 분석기에서 -std-link-opts를 사용하여 외부 기능을 고려하세요.
  2. c filt를 사용하여 함수 이름과 클래스 이름을 정리하세요.
  3. DOT 표현에서 외부 노드를 필터링합니다.

이를 통합하여 단계를 수행하면 C 코드의 실행 경로를 효과적으로 추적하는 포괄적인 호출 그래프를 생성하여 코드 이해 및 디버깅을 단순화할 수 있습니다.

위 내용은 실행 경로를 추적하기 위해 C 코드에 대한 호출 그래프를 생성하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.