2 điểm bởi GN⁺ 2023-11-12 | 1 bình luận | Chia sẻ qua WhatsApp

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 printset để 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

 
GN⁺ 2023-11-12
Ý 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.

    • Tò mò không biết một người 17 tuổi học được kiến thức như vậy bằng cách nào. Qua sách, bạn bè đồng trang lứa, câu lạc bộ lập trình, hay cha mẹ là lập trình viên chăng?
  • Đọ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.

    • Tò mò không biết bạn đã lập trình bao lâu rồi, và bắt đầu với ngôn ngữ nào. Có nhiều nhà phát triển lớn hơn bạn vài chục tuổi mà còn không biết viết Makefile.
    • Cũng tò mò liệu việc dùng emoji nội tuyến trong mã nguồn là xu hướng mới nhất, hay là để nhắc mọi người chú ý đến đầu vào không phải ASCII.
  • 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.

    • Có một cuốn sách tôi đã đọc đi đọc lại nhiều lần, hiện giờ đang được phát hành miễn phí. Dù là sách về phần compiler, nó cũng có thể thú vị với việc gỡ lỗi.
  • Đ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.

    • Đưa sản phẩm của mình ra với thế giới là điều đáng sợ, nhưng những gì người khác nói thường cũng phản ánh chính họ, nên bạn không nhất thiết phải quá nghiêm túc với lời của họ.
  • 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ạ.

    • Tôi thích phong cách BSD, và nếu bạn dùng hệ thống BSD thì có thể tham khảo 'man style' để thử theo phong cách đó.