Tôi đang viết để xem liệu có ai trong số các bạn đã từng thấy hoặc nghe nói về triển khai ý tưởng mà tôi sắp mô tả hay không.printf() gỡ lỗi thư viện bằng cách sử dụng bảng chuỗi "bộ giải mã vòng"
Tôi quan tâm đến việc phát triển thư viện gỡ lỗi kiểu printf cho một mục tiêu được nhúng. Mục tiêu cực kỳ xa và ngân sách băng thông giữa tôi và mục tiêu cực kỳ chặt chẽ, vì vậy tôi muốn có thể nhận được thông báo gỡ lỗi ở định dạng rất hiệu quả.
Khá thường xuyên, báo cáo debug trông giống như sau:
myDebugLibraryPrintf("Inside loop, processing item %d out of %d.\n", i, numItems);
Tất nhiên, khi điều này được mở rộng sang văn bản, chuỗi in là một cái gì đó như "loop Bên trong, xử lý mục 5 trong 10 \ n ", tổng cộng ~ 42 byte hoặc hơn. Hơn 90% dữ liệu được in ra bởi câu lệnh này là tĩnh, theo nghĩa đen - được biết đến tại thời gian biên dịch. Tất nhiên, chỉ có "5" và "10" không được biết tại thời gian biên dịch.
Điều tôi muốn làm là chỉ có thể gửi lại hai số nguyên đó (8 byte thay vì 42). Khi tôi đã nhận được dữ liệu đó, tôi sẽ có một số loại "bộ giải mã" cho phép tôi "reconstitute" dữ liệu nhận được và in ra thông báo gỡ lỗi đầy đủ tại đây tại vị trí của tôi.
Tôi sẽ tự động tạo "vòng giải mã" (như một phần của quy trình xây dựng) cho mỗi myDebugLibraryPrintf() tuyên bố một ID duy nhất tại thời gian biên dịch và tạo bảng ánh xạ các ID duy nhất đó . Sau đó, bất kỳ lúc nào myDebugLibraryPrintf() được gọi trên đích, nó truyền ID duy nhất và bất kỳ giá trị varargs "%d"
, "%f"
, v.v ... được xem trong chuỗi định dạng, nhưng chuỗi định dạng không được truyền đi. (Có lẽ tôi sẽ không cho phép "%s"
mục bây giờ ...) Quay lại vị trí của tôi, chúng tôi sẽ có một chương trình tìm kiếm các ID duy nhất trong bảng, tìm chuỗi định dạng thích hợp và sử dụng nó để tạo lại gỡ lỗi ban đầu thông điệp.
Tôi cảm thấy như ai đó có thể đã có ý tưởng này trước đây và tôi nghĩ có thể một người nào đó trong cộng đồng đã thấy thứ gì đó giống như nó (hoặc thậm chí biết thư viện nguồn mở thực hiện điều này).
ràng buộc:
Để làm rõ, tôi đang đối phó với C/C++ ở đây, và tôi không quan tâm đến một -complete 100% thực hiện thay thế printf() - những thứ như phi các chuỗi định dạng theo nghĩa đen,
%s
(chuỗi) định dạng thông số, hoặc nhiều định dạng nâng cao hơn như đặt chiều rộng hoặc độ chính xác trong danh sách varargs với%*.*d
không cần phải được hỗ trợ.Tôi muốn bảng chuỗi được tạo tự động như một phần của quá trình xây dựng để thêm gỡ rối không liên quan đến công việc nhiều hơn việc thêm printf truyền thống(). Nếu có nhiều hơn số tiền tối thiểu của nỗ lực là cần thiết, không ai trong dự án của tôi sẽ sử dụng nó.
Làm thêm công việc như là một phần của quá trình tạo để tạo bảng chuỗi được giả định khá nhiều. May mắn thay, tôi có quyền kiểm soát tất cả các mã nguồn mà tôi quan tâm đến việc sử dụng thư viện này, và tôi có rất nhiều tính linh hoạt trong quá trình xây dựng.
Cảm ơn!
Những gì bạn đang đề xuất là một hình thức đơn giản của nén dữ liệu. Bạn có thể tiết kiệm rất nhiều thời gian và công sức, và vẫn nhận được 90% lợi ích, đơn giản bằng cách lọc đầu ra gỡ lỗi của chương trình của bạn thông qua gzip trước khi gửi nó qua liên kết và lọc nó qua gunzip ở đầu kia. gzip/gunzip sẽ tự động xây dựng các bảng biểu tượng và thực hiện nén cho bạn, mà không hạn chế đầu ra chương trình của bạn theo cách mà lược đồ mã thông báo thủ công sẽ làm như thế nào. –
Có phải C hoặc C++ không? (Biên tập viên Tag dường như không đồng ý) – AShelly
@ Jeremy Friesner: Trong các cuộc thảo luận của tôi với các đồng nghiệp, nén cũng xuất hiện như một lựa chọn, và dường như nó có thể là một lựa chọn tốt - tuy nhiên, 'd có được lợi ích so sánh từ nó. Trong ví dụ tôi đã đưa ra, tôi đã có thể gửi hiệu quả 42 byte giá trị thông tin trong 8 byte - tiết kiệm không gian là 80%. Gzip thực sự có thể đạt được tiết kiệm không gian 80% đối với loại dữ liệu này không? (Tôi cần phải làm một thử nghiệm để tìm hiểu.) Tất nhiên, ngay cả khi gzip không thể đạt được cùng một khoản tiết kiệm, tôi có thể sẵn sàng chấp nhận sự không hiệu quả tương đối trong tên của độ phức tạp thấp hơn. – jeremytrimble