2009-02-05 27 views
80

Tôi có một không gian làm việc lớn có nhiều tệp nguồn mã C. Mặc dù tôi có thể thấy các chức năng được gọi từ một hàm trong MS VS2005 bằng cách sử dụng trình duyệt Object, và trong MSVC 6.0 cũng chỉ hiển thị các hàm được gọi từ một hàm cụ thể trong một loại màn hình không đồ họa. Ngoài ra, nó không hiển thị chức năng được gọi là bắt đầu từ nói main(), và sau đó các chức năng được gọi từ nó, và như vậy, sâu hơn bên trong chức năng cấp lá.Công cụ để lấy biểu đồ gọi hàm chức năng của mã

Tôi cần một công cụ sẽ cung cấp cho tôi biểu đồ cuộc gọi hàm với các hàm calleecaller được kết nối bằng mũi tên hoặc thứ gì đó tương tự, bắt đầu từ main() đến mức chức năng cuối cùng hoặc ít nhất là hiển thị biểu đồ cuộc gọi của tất cả các chức năng trong một tệp nguồn C theo hình ảnh. Sẽ rất tuyệt nếu tôi có thể in biểu đồ này.

Bất kỳ công cụ tốt nào để làm điều đó (không cần phải là công cụ miễn phí)?

+3

Liên quan: http://stackoverflow.com/a/17844310/1959808 –

Trả lời

46
+0

qusetion về CodeViz, Nếu bạn chuyển mã của bạn để nó sẽ tạo ra mã hay không? Hoặc bạn nên tự mình làm cho đồ thị bằng codevis? – alex

+0

Tôi vừa thử Ai Cập. Nó đồ họa là khủng khiếp. Tôi không chắc chắn về những người khác. – ar2015

15

Understand thực hiện công việc tạo biểu đồ cuộc gọi rất tốt.

3

Astrée là công cụ mạnh mẽ và tinh vi nhất hiện có, IMHO.

4

DMS Software Reengineering Toolkit chúng tôi có static control/dataflow/points-to/call graph analysis đã được áp dụng cho các hệ thống lớn (đường triệu ~~ 25) của mã C, và sản xuất các đồ thị cuộc gọi như vậy, bao gồm cả chức năng gọi qua con trỏ hàm.

+1

Ah, đẹp, năm 2016 và giờ đây, một kẻ hủy diệt xuất hiện. Tôi chắc chắn rằng downvote của ông được dựa trên một đánh giá chính xác rằng công cụ này không thể làm điều này. Vâng, có thể không. Nó chắc chắn làm những gì OP yêu cầu. –

+1

Hãy dành thời gian để chống lại điều đó. Tôi không quan tâm nó là phần mềm hoặc độc quyền của bạn miễn là nó được thực hiện công việc :-) –

19

KcacheGrind

https://kcachegrind.github.io/html/Home.html

Cách sử dụng:

hình ảnh đồ thị
sudo apt-get install -y kcachegrind valgrind 
gcc main.c 
valgrind --tool=callgrind ./a.out 
# Generates a callgrind.out.<PID> file. 
kcachegrind callgrind.out.1234 
# Opens a GUI to visualize callgrind data. 

mẫu xuất khẩu trên một chương trình hello world:

Phương pháp này có lợi thế là bạn không cần mã nguồn để xem đồ thị cuộc gọi, chỉ có thể thực thi được.

Nó thực thi chương trình và ghi chú bất cứ khi nào hàm được gọi từ một chương trình khác, được gọi là phân tích động, tương phản với phân tích tĩnh phân tích mã nguồn mà không chạy.

Phiên bản không có hình ảnh của câu hỏi này: Tool to trace local function calls in Linuxcflow là một tùy chọn đơn giản tốt đẹp tại đó.

gcc -finstrument-functions + etrace

https://github.com/elcritch/etrace

-finstrument-functionsadds callbacks, etrace parces file ELF và thực hiện tất cả các callbacks.

tôi không thể có được nó làm việc tuy nhiên không may: Why doesn't `-finstrument-functions` work for me?

đầu ra tuyên bố chủ quyền là định dạng sau:

\-- 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 

có khả năng phương pháp hiệu quả nhất bên cạnh phần cứng cụ truy tìm sự ủng hộ, nhưng có nhược điểm là bạn có để biên dịch lại mã.

4

Bạn có thể xem trình tạo cây gọi điện C dựa trên bash của mình here. Nó cho phép bạn chỉ định một hoặc nhiều hàm C mà bạn muốn gọi và/hoặc gọi là thông tin, hoặc bạn có thể chỉ định một tập hợp các hàm và xác định biểu đồ khả năng kết nối của các cuộc gọi hàm kết nối chúng ... I.e. cho tôi biết tất cả các cách main(), foo() và bar() được kết nối. Nó sử dụng graphviz/dot cho một công cụ vẽ đồ thị.

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