2011-08-29 34 views
6

Có cách nào để thêm thông tin bổ sung vào ngăn xếp java không?Thêm thông tin do người dùng chỉ định vào dấu vết ngăn xếp java

Tôi đang phát triển một thông dịch viên cho ngôn ngữ kịch bản và muốn xem các dòng mã script tương ứng trong ngăn xếp java.

Kết quả có thể giống như thế này:

java.lang.NullPointerException 
at package.IPF_Try.execute(IPF_Try.java:76) called in script.scr:155 
at package.IPF_Block.execute(IPF_Block.java:304) 
at package.IPF_If.execute(IPF_If.java:105) called in script.scr:130 
at package.IPF_Block.execute(IPF_Block.java:304) 
at package.IPF_Main.execute(IPF_Main.java:147) 
... 

hay này:

java.lang.NullPointerException 
at package.IPF_Try.execute(IPF_Try.java:76) 
    --- called in script.scr:155 --- 
at package.IPF_Block.execute(IPF_Block.java:304) 
at package.IPF_If.execute(IPF_If.java:105) 
--- called in script.scr:130--- 
at package.IPF_Block.execute(IPF_Block.java:304) 
at package.IPF_Main.execute(IPF_Main.java:147) 
... 

này sẽ làm cho gỡ lỗi dễ dàng hơn rất nhiều, không may google không thể tìm thấy bất cứ điều gì để đạt được điều này. Cách duy nhất tôi có thể nghĩ đến là tạo ra rất nhiều lớp với các phương thức, tên có chứa thông tin tôi cần và chỉ đơn giản gọi phương thức tiếp theo trong stacktrace - nhưng điều đó có vẻ như lãng phí (permgen). bộ nhớ và cpu chu kỳ với tôi.

+0

Câu hỏi thú vị. Trình biên dịch java đặt trong các biểu tượng gỡ lỗi với tên tệp và số dòng vào mã byte. Tôi cho rằng nếu bạn làm hỏng bytecode, bạn có thể tinh chỉnh điều đó để phù hợp hơn với nhu cầu của bạn. Là trình biên dịch JSP làm một cái gì đó như thế? – Thilo

+0

@Thilo - yes - JSP được biên dịch sang bytecode (đôi khi sử dụng một mẫu Java trung gian); bạn thường có thể tìm thấy các lớp được biên dịch bằng cách chọc vòng các thư mục "làm việc" của máy chủ. – McDowell

+0

vấn đề là tôi không thể chỉ đơn giản là lộn xộn với bytecode của phương pháp của tôi, bởi vì chúng được gọi từ các kịch bản khác nhau, vì vậy tôi không thể thêm một phần thông tin cụ thể cho nó. Tuy nhiên, tôi có thể tự động tạo một số lớp chứa thông tin cần thiết trong tên phương thức hoặc tương tự, nhưng tôi lo ngại về các tác động hiệu suất. – ChristophK

Trả lời

1

Nếu bạn dịch tập lệnh của mình sang bytecode, bạn có thể cung cấp chi tiết gỡ lỗi bằng cách sử dụng thuộc tính SourceFileLineNumber.

Tôi không biết cơ chế nào để đưa thông tin vào ngăn xếp cuộc gọi khi chạy.

+0

quá tệ, cảm ơn bạn đã tham khảo về thuộc tính SourceFile và Linenumber. Có lẽ tôi sẽ phải tạo lớp sau khi tất cả, tuy nhiên vì tôi sẽ cần một lớp cho mỗi tệp và mỗi số dòng, điều này có nghĩa là tạo ra hàng nghìn lớp giả ... – ChristophK

+0

@ChristophK, tại sao bạn cần một lớp trên mỗi dòng? Thay vào đó, bạn có thể sử dụng một lớp cho mỗi thường trình/phần trong tập lệnh của mình không? – jelford

+0

có thể hoạt động, tuy nhiên tôi đã thử nghiệm một chút với việc tạo "các lớp giả", và thậm chí một vài nghìn dường như sử dụng khá nhiều không gian thế hệ vĩnh viễn. – ChristophK

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