2013-09-03 38 views
11

Có công cụ tự động "đánh dấu" một số chức năng để tôi có thể nhận được xấp xỉ "ngăn xếp cuộc gọi" hay không.Lỗi gỡ lỗi: Hiển thị tên của hàm tại mỗi cuộc gọi

Thực ra, tôi muốn có một hành vi tương tự như cách bạn nhận được bằng cách viết fct = Debug.trace "fct" $ ... mà không cần phải thêm nó trước mỗi chức năng.

Tôi biết rằng lược tả thực hiện điều gì đó tương tự với -fprof-auto, nhưng tôi cần nó được hiển thị trong khi ứng dụng đang chạy.

Một thời gian, tôi có vòng lặp vô hạn và việc hiển thị này có thể hiển thị cho tôi ngay lập tức chức năng nào bị lỗi. Sử dụng hlist và breakpoint không thực sự hữu ích vì bạn đã phải biết tên của một trong các hàm trong chu trình.

+1

Bạn có biết "gỡ lỗi xác suất" kỹ thuật? Bạn bắt đầu chương trình đang chạy và tại bất kỳ thời điểm nào bạn chọn, hãy đột nhập vào trình gỡ rối. Bây giờ bạn có thể trong hàm mất nhiều thời gian nhất để tính toán (vì xác suất mà bạn dừng trong bất kỳ hàm nào đã cho có liên quan đến thời gian được sử dụng trong hàm đó!). –

+0

Đúng, đó là những gì được khuyến cáo bởi tài liệu của trình gỡ lỗi GHCi (trước tiên bạn nên đặt -fbreak-on-exception). Nhưng theo như tôi nhớ lại, nó không hoạt động tốt trong lần cuối cùng tôi sử dụng nó, và tôi thực sự phải thêm vào trước mỗi cuộc gọi tên hàm để tìm ra những gì đang xảy ra. –

Trả lời

12

Đây là điều cực kỳ xấu xí ;-), và nó chỉ cung cấp cho bạn số dòng thay vì tên hàm, nhưng tôi ngạc nhiên khi biết rằng nó hoạt động, vì vậy tôi nghĩ tôi sẽ chia sẻ nó. Và nó vẫn tốt hơn là không có gì. Bạn có thể sử dụng tiền xử lý C giống như trong tốt ngày C cũ:

{-# LANGUAGE CPP #-} 

#define traceLoc trace (__FILE__ ++":"++ show __LINE__) 

import Debug.Trace 

f 0 = traceLoc $ 1 
f n = traceLoc $ g (n-1) 
g 0 = traceLoc $ 2 
g n = traceLoc $ 2 * f (n-1)  

Bây giờ,

*Main> f 3 
Test.hs:16 
Test.hs:18 
Test.hs:16 
Test.hs:17 
4 
+0

loại CPP nào là: '__FILE__ ++": "++ hiển thị __LINE__' ;-) nhưng nó rất tuyệt! –

+1

@SassaNF Đó là haskell với các macro CPP cho tên tập tin và số dòng. CPP chỉ là một hệ thống macro, không có lý do gì để yêu cầu các macro dẫn đến bất kỳ ngôn ngữ cụ thể nào. –

+0

Đó là đẹp hơn theo cách đó, mặc dù nếu bạn có hàng trăm chức năng, nó vẫn là một nỗi đau: ( –

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