2014-04-17 11 views
6

Tôi đang cố gắng để tạo ra một công cụ tương tự để TraceGL, nhưng đối với ngôn ngữ C-type:Processing gcov tập tin dữ liệu cho truy tìm mục đích

enter image description here

Như bạn có thể thấy, công cụ ở trên điểm nổi bật đang chảy mà không được thực hiện bằng màu đỏ.

Về mặt xây dựng công cụ này cho Mục tiêu-C, ví dụ, tôi biết rằng các tệp dữ liệu đầu ra gcov (và libprofile_rt in clang) có thể giúp xác định số lần một dòng mã đã được thực thi. Tuy nhiên, các tệp dữ liệu gcov có thể cho tôi biết khi một dòng mã nhất định xảy ra trong quá trình thực hiện chương trình không? Ví dụ, nếu dòng X được gọi trong đường dẫn mã A và B, tôi có thể xác định được từ gcov rằng đường dẫn mã A và B được gọi là dòng X cho riêng dòng X không? Không.

Trả lời

0

Theo như tôi biết, dữ liệu đo đạc GCOV chỉ cho biết một số điểm trong mã được thực thi (và có thể bao nhiêu lần). Nhưng không có mối quan hệ giữa các điểm mã được thiết lập.

Có vẻ như những gì bạn muốn là xác định đường dẫn thông qua mã. Để làm điều đó, bạn cần phân tích tĩnh mã (yêu cầu trình phân tích cú pháp C đầy đủ, trình phân giải tên, trình phân tích luồng), hoặc bạn cần ghép nối các điểm thiết bị động theo thứ tự thực hiện.

Việc đầu tiên yêu cầu bạn tìm thấy máy móc có khả năng xử lý C trong tất cả các vinh quang của nó; bạn không muốn lặp lại điều đó. GCC, Clang, Bộ công cụ DMS của chúng tôi là sự lựa chọn. Tôi biết GCC và Clang thực hiện phân tích khá nghiêm túc; Tôi khá chắc chắn bạn có thể tìm thấy ít nhất phân tích dòng chảy kiểm soát intraprocedural; Tôi biết rằng DMS có thể làm điều này. Bạn sẽ phải tùy chỉnh GCC và Clang để trích xuất dữ liệu này. Bạn sẽ phải cấu hình DMS để trích xuất dữ liệu này; cấu hình dễ dàng hơn tùy biến vì nó là thuộc tính thiết kế chứ không phải là hành động "tùy chỉnh". YMMV.

Sau đó, sử dụng dữ liệu GCOV, bạn có thể xác định luồng giữa các điểm dữ liệu GCOV. Nó không phải là rõ ràng với tôi rằng điều này mua cho bạn bất cứ điều gì vượt ra ngoài những gì bạn đã nhận được chỉ là phân tích dòng điều khiển tĩnh, trừ khi mục tiêu của bạn là để triển lãm dấu vết thực hiện.

Để làm điều này một cách năng động, những gì bạn có thể làm là bắt buộc mỗi điểm thu thập dữ liệu trong mã được công cụ để lưu ý rằng đó là điểm gần đây nhất gặp phải; trước khi làm điều đó, nó sẽ ghi lại điểm gần đây nhất gặp phải trước đó. Điều này sẽ tạo ra một chuỗi các tham chiếu giữa các điểm phù hợp với luồng điều khiển. Điều này có hai vấn đề từ quan điểm của bạn, tôi nghĩ: a) bạn phải sửa đổi GCOV hoặc một số công cụ khác để chèn loại thiết bị khác này, b) bạn phải lo lắng về điều gì và cách bạn ghi lại "người tiền nhiệm" khi một điểm thu thập dữ liệu bị tấn công nhiều lần.

0

gcov (hoặc lcov) là một tùy chọn. Nó tạo ra hầu hết thông tin bạn đang tìm kiếm, mặc dù tần suất các tệp đó được cập nhật phụ thuộc vào tần suất gọi là __gcov_flush(). Nó không thực sự được dự định là thời gian thực, và không bao gồm tất cả thông tin bạn đang tìm kiếm (đáng chú ý là 'khi'). Có một bản tóm tắt ngắn về định dạng dữ liệu gcovhere và trong tệp tiêu đề here. lcov dữ liệu được mô tả here.

Đối với những gì bạn đang tìm kiếm DTrace sẽ có thể cung cấp tất cả thông tin bạn cần và trong thời gian thực.Đối với mục tiêu-C trên nền tảng của Apple có dtrace đầu dò cho thời gian chạy cho phép bạn theo dõi khá nhiều bất cứ điều gì. Có một số hướng dẫn và ví dụ hữu ích để tìm hiểu về dtrace và cách viết tập lệnh. Brendan Gregg cung cấp một số ví dụ thực sự tuyệt vời. Big Nerd Ranch đã thực hiện một số series of articles trên đó.

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