2012-02-24 34 views
9

Tôi có câu hỏi chung về thực tiễn mã hóa ...Làm thế nào để theo dõi một chương trình gỡ lỗi trong OCaml?

Trong khi gỡ lỗi, tại một số thời điểm mã của tôi, tôi cần một số mã để in trạng thái hiện tại; Khi tôi không gỡ lỗi, tôi không muốn để lại mã ở đó vì nó làm phiền tầm nhìn của mã khác ...

Thật khó để đóng gói chúng thành một hàm vì phần lớn thời gian, nó liên quan đến biến cục bộ và tôi không muốn chuyển mọi thứ dưới dạng đối số ...

Vậy làm cách nào để bạn quản lý loại mã "in/kiểm tra" này? có thực hành tốt nào không?

Trả lời

5

Tôi thường sử dụng một chức năng debug mà in giá trị chỉ khi một lá cờ debug được thiết lập là true:

let debug_flag = ref false 

let debug fmt = 
    if !debug_flag then Printf.eprintf fmt 
    else Printf.ifprintf stderr fmt 
+0

Điều này ... những gì tôi muốn in bao gồm nhiều dòng và liên quan đến nhiều biến địa phương ... – SoftTimur

+1

Vấn đề với hàm gỡ lỗi này là đối số luôn được tính, ngay cả khi chúng không được sử dụng ở cuối. –

6

Tôi đã từng có một chức năng gỡ lỗi, mà chỉ sẽ in ra chuỗi thức chỉ khi một lá cờ là bộ. Bây giờ, tôi thích chỉ cần thêm if báo cáo:

  • họ không lâu hơn nữa
  • gì được tính là điều kiện là sai
  • nó rất dễ dàng khi đọc mã để thấy rằng nó chỉ là để gỡ lỗi

Tôi cũng từng có macro camlp4, có thể tạo ra các câu lệnh if từ các ứng dụng chức năng, nhưng nó chỉ hoạt động trong các dự án sử dụng camlp4. Lưu ý rằng, thông thường, tôi không sử dụng một cờ gỡ lỗi, nhưng nhiều cờ gỡ lỗi, một cờ cho mỗi mô-đun và sau đó là các thẻ meta sẽ kích hoạt gỡ lỗi một số mô-đun hoặc các khía cạnh trực giao. Chúng được đặt trong một hashtable như danh sách các cờ, và tôi có thể thiết lập chúng với một đối số hoặc một biến môi trường.

4

tôi sử dụng một phần mở rộng cú pháp khai thác gỗ:

http://toss.svn.sourceforge.net/viewvc/toss/trunk/Toss/caml_extensions/pa_log.ml?revision=1679&view=markup

Bạn cũng có thể vượt qua số dòng với chức năng khai thác gỗ (đó là mã hóa cứng để AuxIO.log trong nguồn ở trên) sử dụng Loc.start_line _loc (có lẽ tôi sẽ thêm nó).

Lưu ý rằng điều kiện phải là một phần của phần mở rộng cú pháp, theo cách này, nó sẽ không tính toán đối số nếu nó không cần in chúng. Ngoài ra, chúng tôi có cú pháp "printf" linh hoạt.

Ngoài ra, tôi sử dụng một lệnh trong Emacs:

(defun camldev-insert-log-entry() 
    (interactive) 
    (insert "(* {{{ log entry *) 
LOG 2 \"\"; 
(* }}} *)") 
    (goto-char (- (point) 12))) 

cùng với `gấp-mode'.

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