2012-03-09 23 views
15

có một thứ như một công cụ (miễn phí) sẽ hiển thị biểu đồ của tất cả các hàm gọi trong một hàm nhất định không? Ví dụ, nếu tôi sử dụng nó trên một chức năng phức tạp vui vẻ() Tôi đang cố gắng để hiểu, nó sẽ cho tôi thấy tất cả các chức năng được gọi là vui() theo thứ tự, sau đó tôi sẽ có khả năng để xem cùng một điều cho hàm được gọi là fun(), v.v. Tôi đang tìm kiếm điều này cho mã C++. Điều đó có tồn tại không?C++ phụ thuộc mã/gọi đồ thị "người xem"?

chỉnh sửa: Tôi đang sử dụng VS 2008 nếu điều đó giúp, nhưng tôi đã suy nghĩ rằng một phần mềm như vậy sẽ làm việc trên các tập tin nguồn nào

+0

Đối với bất kỳ chương trình nontrivial nào, đầu ra sẽ phải vô cùng cồng kềnh ... mặc dù, với chẩn đoán thông minh - có thể hoạt động. – leftaroundabout

+0

Vâng, bạn không cần chẩn đoán rất thông minh. Việc cắt giảm ở hai hoặc ba cấp độ sâu sẽ là đủ. Bạn rõ ràng không thể hiển thị mọi thứ từ 'main' xuống. Vấn đề chính tôi thấy là các hàm 'ảo', trong đó thực thi thực tế được gọi là được xác định khi chạy. – MSalters

+0

bản sao có thể có của [Công cụ để lấy biểu đồ gọi hàm chức năng hình ảnh] (http://stackoverflow.com/questions/517589/tools-to-get-a-pictorial-function-call-graph-of-code) – finnw

Trả lời

18

Doxygen có thể thực hiện việc này. Thấy tùy chọn CALL_GRAPH cấu hình:

Nếu CALL_GRAPHHAVE_DOT thẻ được thiết lập để YES sau đó doxygen sẽ tạo ra một biểu đồ phụ thuộc cuộc gọi cho mỗi chức năng toàn cầu hoặc phương pháp lớp. Lưu ý rằng việc bật tùy chọn này sẽ làm tăng đáng kể thời gian chạy. Vì vậy, trong hầu hết các trường hợp, sẽ tốt hơn khi bật biểu đồ cuộc gọi cho các chức năng được chọn chỉ bằng lệnh \ callgraph.

3

Có những việc như vậy tồn tại. Google dưới tiêu đề phân tích mã tĩnh. Có, ví dụ, các công cụ như Understand, và nó là rất có khả năng trình biên dịch của bạn có thể làm điều này quá mà tôi giới thiệu bạn đến tài liệu của nó.

+1

(Trình biên dịch nào * bạn * đang sử dụng?: - /) –

+1

Tôi chủ yếu sử dụng trình biên dịch Intel Fortran nhưng các trình biên dịch C/C++ của Intel cũng có thể tạo ra các biểu đồ gọi. Nhưng Doxygen, theo gợi ý của Greg, có lẽ là một câu trả lời tốt hơn. –

+0

Làm thế nào Doxygen có thể là một câu trả lời tốt hơn, nếu a) có quá tải hoặc thừa kế nhiều (cái gì, Doxygen thực hiện tìm kiếm Koenig đầy đủ?) Hoặc có một cuộc gọi hàm gián tiếp? –

2

g ++ và hầu hết trình biên dịch đều có thể làm những gì bạn muốn. Nó được gọi là profiling. Ngoài ra còn có oprofile. Trình lược tả cung cấp cho bạn biểu đồ cuộc gọi của một ứng dụng after thực thi của nó. Điều này rất hữu ích để nghiên cứu mã, bạn cũng có thể đi qua đầu ra [debug] khi bạn nhìn vào biểu đồ. Ngược lại, một trình phân tích mã sẽ cung cấp cho bạn tất cả các đường dẫn cuộc gọi có thể, bạn sẽ không thể nhìn thấy con đường đáng kể một cách dễ dàng.

+1

Hồ sơ! = Phân tích tĩnh –

+0

Phân tích tĩnh? – perreal

+2

Nhưng hồ sơ sẽ chỉ hiển thị các biểu đồ cuộc gọi đó, thực tế được thực thi, không phải "tất cả có thể". –

6

Có, chế độ xem Eclipse CDT Call Hierarchy cung cấp chính xác điều này. Hơn nữa, quan điểm này có 2 lựa chọn:

  • Hiện Người gọi
  • Hiện Callees

Bạn đang hỏi về thứ hai, nhưng tôi thích cái đầu tiên trong phân tích mã.

2

Tôi không biết bất kỳ công cụ nào được đặc biệt dành cho việc này. Tuy nhiên, có một số cách để làm việc đó:

  • Sử dụng một IDE (QtCreator là miễn phí, Visual Studio Express cũng có thể hữu ích, Eclipse CDT)
  • Sử dụng (ctags) [http: // ctags. sourceforge.net/] và một trình soạn thảo văn bản có thể.
  • Sử dụng callgrind và một số chế độ xem mà nó mang lại. Ưu điểm: bạn có thể thấy các chức năng thực sự được gọi. Nhược điểm: chỉ chạy trong unixes, và bạn phải cấu hình.
  • Sử dụng Doxygen ... cái này thực sự là ưa thích, vì nó tạo ra một "dạng xem" html của mã của bạn, miễn là bạn cung cấp các tùy chọn chính xác.
3

Bạn có thể sử dụng callgrind và đó là công cụ GUI kcachegrind.

1

Trình tạo hồ sơ VC++ 2008/2010 tạo ra trong số những tệp khác tệp * CallerCalleeSummary.csv, chứa thông tin này. Và đây là liên kết đến bài viết giải thích cách sử dụng nó với chương trình mẫu: Profiling of C++ Applications in Visual Studio

4

Intel(R) Single Event API là dự án mã nguồn mở miễn phí sử dụng GraphVis để hiển thị biểu đồ cuộc gọi. Phải mất một chút lao động để thực hiện các thiết bị tự động hóa bằng tay hoặc trình biên dịch, nhưng bên cạnh số liệu thống kê và biểu đồ cuộc gọi, bạn cũng sẽ nhận được lượt xem làm thêm giờ. Example of the image you can get

Các vấn đề liên quan