2012-08-14 38 views
7

Tôi chủ yếu là lập trình C và C++ và tôi thường cần phải nhanh chóng hiểu cấu trúc của các cơ sở mã rất lớn (gcc, hạt nhân Linux). Tôi tự hỏi nếu có bất kỳ công cụ để giúp đỡ trong vấn đề này. Tôi đặc biệt quan tâm đến đồ thị cuộc gọi, tham chiếu cấu trúc dữ liệu trên dự án, bao gồm đồ thị phụ thuộc, vị trí biểu tượng nhanh, v.v. Tôi biết về ctags và cscope nhưng tôi đang tìm kiếm một cái gì đó với nhiều trực quan hơn như đồ thị cuộc gọi cho phép định vị nhanh chóng của một hàm, hãy căn chỉnh đồ thị tại một cuộc gọi cụ thể, đảo ngược nó (tức là định vị tất cả các cuộc gọi đến một hàm đã cho), v.v.Công cụ đọc, đọc và đọc mã nguồn

+0

RTCM - đọc hướng dẫn biên dịch. Hầu hết các trình biên dịch làm một số những gì bạn muốn và tôi hy vọng rằng trình biên dịch (s) bạn sử dụng không là ngoại lệ. –

Trả lời

0

Hãy thử sử dụng SourceInsight. Nó khá hữu ích với việc duyệt mã và hiểu nó. Nó cung cấp hầu hết các tính năng do bạn yêu cầu.

5

Nếu bạn muốn xây dựng biểu đồ cuộc gọi, bạn có thể cuộn biểu đồ của riêng mình bằng số -finstrument-functions của GCC.

Về cơ bản, khi bạn biên dịch một chương trình với tùy chọn đó được kích hoạt, GCC kêu gọi các chức năng sau khi chương trình mục tiêu vào hoặc ra khỏi một chức năng:

 void __cyg_profile_func_enter (void *this_fn, 
            void *call_site); 
     void __cyg_profile_func_exit (void *this_fn, 
            void *call_site); 

Những gì bạn cần làm là xác định các chức năng này, và viết trong logic của bạn để tạo biểu đồ cuộc gọi ở đó.

This extremely thorough tutorial giải thích cách bạn có thể tạo biểu đồ cuộc gọi bằng cách sử dụng -finstrument-functionsGraphViz. Tất cả các công cụ liên quan là FOSS và miễn phí.

Dĩ nhiên:

  1. Các đồ thị GraphViz sản xuất là độc lập, chứ không phải là một phần của một IDE.
  2. Tôi không thực sự chắc chắn nếu sản xuất một biểu đồ gọi của Linux (hạt nhân) là có thể theo cách này.
0

Bạn có thể thử luồng. Nó cung cấp cho bạn một graf các cuộc gọi của các chức năng bên trong. Nó không phải là rất linh hoạt mặc dù.