HN chia sẻ: Thiếu niên 17 tuổi dành 6 tháng để phát triển trình gỡ lỗi C
(github.com/d4ckard)Giới thiệu về trình gỡ lỗi Spray
- Spray là một trình gỡ lỗi đơn giản, dễ hiểu dành cho mã C.
- Cung cấp khả năng điều khiển việc thực thi của chương trình đang chạy, đồng thời kiểm tra và sửa đổi trạng thái.
- Dự án được bắt đầu nhằm thỏa mãn sự tò mò về cách trình gỡ lỗi hoạt động bên trong và tìm cách giúp việc gỡ lỗi trở nên dễ tiếp cận hơn.
Tính năng chính
- Đặt breakpoint theo hàm, dòng trong tệp và địa chỉ.
- In ra và thiết lập giá trị của biến, địa chỉ bộ nhớ và thanh ghi.
- Tô sáng cú pháp C, backtrace, thực thi từng bước.
- Tính năng bộ lọc để chỉ định định dạng đầu ra của lệnh.
Lộ trình phát triển
- In ra và chỉnh sửa các cấu trúc phức tạp.
- Tô sáng cú pháp cho các cấu trúc phức tạp.
- Backtrace dựa trên DWARF thay vì frame pointer.
- Bắt tín hiệu được gửi tới chương trình đang được gỡ lỗi, cùng với hàm inline và việc nạp thư viện bên ngoài.
Cách cài đặt
- Một phần frontend của Spray được viết bằng Scheme và được biên dịch sang C thông qua CHICKEN Scheme.
- Cần cài đặt CHICKEN, và do phụ thuộc vào libdwarf nên cần cài libdwarf trước.
- Clone kho lưu trữ và cài đặt Spray bằng lệnh
make. - Thêm vào
$PATHđể có thể dùng như một lệnh thông thường.
Cách sử dụng Spray
- Tệp nhị phân cần gỡ lỗi phải được bật thông tin debug và tắt tối ưu hóa.
- Cần biên dịch chương trình bằng Clang.
- Truyền tên tệp nhị phân cần gỡ lỗi ở đối số đầu tiên, sau đó là các đối số dành cho chương trình cần gỡ lỗi.
Lệnh
Đọc và ghi giá trị
- In ra hoặc thiết lập giá trị của biến, thanh ghi và địa chỉ.
- Tên thanh ghi dùng tiền tố
%theo cú pháp assembly AT&T. - Giá trị có thể được chỉ định ở dạng thập phân hoặc thập lục phân.
Breakpoint
- Đặt và xóa breakpoint theo hàm, dòng trong tệp và địa chỉ.
- Dùng lệnh
continueđể tiếp tục chạy tới breakpoint tiếp theo.
Thực thi từng bước
- Chuyển tới dòng tiếp theo, đi vào bên trong hàm hoặc thoát khỏi hàm hiện tại.
- Chuyển tới lệnh tiếp theo, in backtrace tại vị trí hiện tại.
Bộ lọc
- Có thể dùng bộ lọc để thay đổi định dạng đầu ra.
- Gắn bộ lọc sau lệnh
printvàsetđể thay đổi định dạng hiển thị.
Cách đóng góp
- Mọi đóng góp đều được hoan nghênh; trước khi gửi pull request, hãy chạy bộ kiểm thử cục bộ để xác nhận không làm hỏng tính năng.
- Có thể bỏ qua các lỗi kiểm thử do lỗi off-by-one với một số giá trị cụ thể.
Tài liệu tham khảo
- Loạt bài trên blog của Sy Brand "Writing a Linux Debugger", tiêu chuẩn DWARF 5, tài liệu libdwarf, và bài viết "How debuggers work" của Eli Bendersky.
Ý kiến của GN⁺
Điểm quan trọng nhất của bài viết này là Spray là một trình gỡ lỗi thân thiện với người dùng dành cho mã C, tập trung vào việc giúp gỡ lỗi trở nên dễ tiếp cận hơn. Điểm hấp dẫn là nó cung cấp cấu trúc và lệnh đủ dễ hiểu ngay cả với kỹ sư phần mềm mới vào nghề, từ đó giúp xử lý các tác vụ gỡ lỗi phức tạp một cách dễ dàng hơn. Ngoài ra, lộ trình phát triển và cách đóng góp cũng được trình bày rõ ràng, mang lại cơ hội thú vị cho các nhà phát triển muốn tham gia vào dự án mã nguồn mở.
1 bình luận
Ý kiến trên Hacker News
Mã của lập trình viên trẻ này đặc biệt gọn gàng, nhất quán và được mô-đun hóa rất tốt. Những dự án như vậy đòi hỏi kiến thức không hề thông thường về định dạng nhị phân và API của kernel. Ngay cả nhiều lập trình viên "cao cấp" cũng có thể gặp khó khăn khi xây dựng thứ như thế này ở mức độ khái niệm.
Đọc mã của các lập trình viên trẻ luôn thú vị. Dù còn thiếu kinh nghiệm, vẫn có thể thấy họ thiết kế với lượng kiến thức khá đáng kể. Tác giả có vẻ học rất nhanh, và kết quả của 6 tháng làm việc là rất ấn tượng.
Khâm phục mức độ tận tâm như vậy. Khuyên nên tham gia những chương trình như Google Summer of Code, KDE Season of Code, Linux Foundation LFX, và X.org EVoC. Có rất nhiều bài toán thú vị ở đó. Ước gì khi còn là sinh viên tôi đã biết đến những chương trình này. Giờ tôi đã có công việc toàn thời gian nên không còn thời gian đóng góp cho mã nguồn mở.
Khi xem qua dự án lần đầu, thấy nó được tổ chức rất tốt. Rất đáng khen.
Xin chúc mừng và chúc may mắn với dự án. Compiler là một trong những chủ đề đầu tiên khiến tôi hứng thú với điện toán.
Điều này cho thấy cả các bạn 17 tuổi vẫn biết CD là gì. Biểu tượng lưu dưới dạng đĩa mềm có lẽ vẫn chưa hẳn lỗi thời.
Kiến thức và sự chín chắn thể hiện ở tuổi 17 thật ấn tượng. Những chủ đề được nghiên cứu và vận dụng là thứ người ta thường kỳ vọng ở bậc đại học, còn dự án này thì xứng tầm một học phần sau đại học. Chúc bạn có một sự nghiệp thành công.
Tôi nhớ hồi trẻ từng dùng Turbo Pascal để viết một thư viện đồ họa 2D. Khi đó là trước lúc tôi biết đến Internet, nên cuối cùng nó chỉ là niềm vui cá nhân, nhưng tôi nghĩ việc làm ra thứ để người khác có thể xem vẫn là rất đáng khen. Mã sạch sẽ, chú thích tốt và README rõ ràng.
Làm thêm một hướng dẫn kiểu "viết trình gỡ lỗi" đi kèm dự án có thể hơi nhàm chán, nhưng sẽ cực kỳ hữu ích.
Tò mò tại sao lại có khoảng trắng giữa tên hàm và đối số. Với người đã đọc mã C suốt 18 năm như tôi, điều đó có cảm giác hơi lạ.