2009-06-22 49 views
16

Có cách nào để xuất một dấu vết cuộc gọi cho một chuỗi cụ thể trong java không?Dấu vết cuộc gọi trong java

Tôi không muốn theo dõi ngăn xếp. Tôi muốn một chuỗi các cuộc gọi trên từng đối tượng để truy tìm.

Trả lời

10

btrace, có thể được sử dụng cho loại hành động này.

2

Runtime.traceMethodCalls(), mà in một dòng cho mỗi cuộc gọi phương pháp của tất cả các đối tượng trong tất cả các chủ đề

+0

của Sun hotspot của trên cửa sổ dường như không sản lượng các cuộc gọi phương pháp dấu vết. Tôi đã đọc tôi cần chạy java debug với 'java_g'. Bất kỳ ý tưởng? – JavaRocky

+0

Vâng, đối với tôi 'Runtime.getRuntime(). TraceMethodCalls (true);' cũng không có gì. Tôi có cần truyền các đối số cho 'javac' hoặc' java' không? –

+0

Vẫn không phải là phiên bản java "1.8.0_111" –

2

Bạn muốn về cơ bản muốn lập trình hướng khía cạnh của một số hình thức, nơi mà các khía cạnh có thể xác định xem các chủ đề hiện có nghĩa là phải ghi nhật ký cuộc gọi. (Cách khác là tự đặt chính xác đăng nhập vào mọi phương thức, điều này sẽ gây đau đớn.)

Có rất nhiều khung công tác AOP trong Java, chẳng hạn như AspectJSpring (Mùa xuân nhiều hơn AOP tất nhiên).

Áp dụng các khía cạnh cho mỗi cuộc gọi phương thức trong hệ thống có thể phức tạp ... Tôi không có kinh nghiệm với AspectJ, nhưng Spring AOP về cơ bản được thiết kế để bật AOP xung quanh các thành phần. Các lớp học có hiệu quả không biết đến Spring không thể thay đổi dễ dàng. Hãy nhớ bạn, đã lâu rồi kể từ khi tôi sử dụng ngay cả Mùa xuân AOP - mọi thứ có thể xuất hiện kể từ đó :)

2

Chúng tôi có thể tạo đối tượng Throwable mới có dấu vết cuộc gọi. Và sử dụng một số thao tác chuỗi, chúng ta có thể nhận được ngăn xếp cuộc gọi.

Throwable t = new Throwable(); 
System.out.println(t.getStackTrace()[1].toString()); 

Tôi không chắc chắn lấy thông tin theo cách này, là một thực hành tốt hay không. :)

+1

Làm chậm một cách đau đớn, vì vậy để được sử dụng để truy tìm cục bộ trong khi gỡ lỗi. – glmxndr

13

Tôi nghĩ bạn có thể thấy điều này thú vị. Nó là một tác nhân java bổ sung thêm việc ghi vào và thoát ra các phương thức, sử dụng khung công tác slf4j để thực sự đăng nhập đầu ra. Sau đó, nó là một vấn đề cấu hình khung đăng nhập để chỉ in ra rằng chủ đề mà bạn quan tâm đến

http://www.slf4j.org/extensions.html#javaagent

(chỉ để được rõ ràng: 1). Tôi đã viết nó, 2) nó làm việc cho tôi :))

+1

WOW. Tâm trí = Thổi! – JavaRocky

+0

hoàn toàn tuyệt vời! đã thử nó và nó làm việc tuyệt vời :) cảm ơn cho phần mở rộng này rất hữu ích! – stratwine

+0

làm cách nào tôi có thể sử dụng điều này trên các dự án Android? – RegisteredUser

3

Nếu bạn muốn theo dõi việc thực thi mã Java của mình, bạn có thể sử dụng công cụ có tên là InTrace.

LƯU Ý: InTrace là một công cụ mã nguồn mở và miễn phí mà tôi đã viết.

1

Cách dễ dàng hơn Btrace đang sử dụng HouseMD, bạn có thể lấy từ vm here

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