2015-04-06 35 views
5

Gần đây tôi đã có một cuộc phỏng vấn và được yêu cầu thiết kế/triển khai chức năng stacktrace. Đây là những gì tôi đã đưa ra.Làm cách nào để triển khai theo dõi ngăn xếp khi có lỗi?

  • Duy trì ngăn xếp chứa tất cả cuộc gọi phương thức từ điểm chính của lối vào chương trình.
  • Nếu có lỗi tại bất kỳ thời điểm nào trong quá trình thực hiện, hãy tạm dừng chương trình và in toàn bộ ngăn xếp bằng cách bật mọi phần tử.

tôi sau đó đã hỏi hai câu hỏi:

  1. Làm thế nào/nơi sẽ ngăn xếp này được khởi tạo?
  2. Bạn sẽ quyết định số lượng dữ liệu mà ngăn xếp sẽ lưu trữ mà không cần chạy OOM? Tại sao JVM không bao giờ chạy nguyên nhân OOM của ngăn xếp?

Đối với câu hỏi đầu tiên tôi đã nói, ngăn xếp phải là tĩnh và phải được khởi chạy khi bắt đầu chương trình. Nhưng tôi không chắc về câu hỏi thứ hai. Tôi đã cố gắng để đọc như thế nào JVM làm điều này nhưng nó là một chút phức tạp. Tôi đã thử googling cho việc triển khai cơ bản nhưng không thể tìm thấy bất kỳ. Sẽ rất nhiều đánh giá cao nếu một người nào đó chỉ sẽ chỉ cho tôi đúng hướng như những gì chính xác tôi nên tìm kiếm để trả lời này.

+0

bản sao có thể có của [Kích thước ngăn xếp mặc định Java] (http://stackoverflow.com/questions/20030120/java-default-stack-size) – ControlAltDel

+1

Nhìn vào Throwables printStackTrace() – user489041

+0

Xin lỗi đã bỏ phiếu để đóng nhưng tôi nhận ra hai câu hỏi không giống nhau. Bạn có thể tìm thấy nhiều thông tin về phân bổ stack với câu hỏi này: http://stackoverflow.com/questions/20030120/java-default-stack-size – ControlAltDel

Trả lời

0

Một chút của một câu hỏi mở đã kết thúc, đây là quan điểm của tôi:

  1. stack không nên tĩnh - có một ngăn xếp mỗi chủ đề, không tính theo chương trình, và chủ đề có thể được thêm vào và lấy ra trong chương trình cả đời. Vì vậy, các ngăn xếp cũng phải được phân bổ động.
  2. ngăn xếp Java có thể tràn. Mà có thể khác với OOM, nhưng không khác nhau. Đối với những gì để lưu trữ trong ngăn xếp - Tôi muốn đi với người dùng cấu hình, như các yêu cầu rất khác nhau khi chạy trong phát triển so với chế độ sản xuất. Bạn cũng có thể thảo luận về các cải tiến quản lý ngăn xếp có thể, chẳng hạn như tail-call optimizations. Điều này sẽ ngăn chặn tràn ngăn xếp, nhưng ảnh hưởng đến cách mã được viết.

Dù sao, 2 ¢ của tôi.

0

Tôi sẽ không lưu trữ bất kỳ thông tin theo dõi ngăn xếp nào ở bất cứ nơi nào vì thông tin này đã được lưu trữ trong khung ngăn xếp của mỗi chuỗi. Khi yêu cầu ngăn xếp ngăn xếp (ví dụ: ngoại lệ được ném), tôi sẽ tạo nó từ khung ngăn xếp.

Vấn đề là tôi không chắc liệu khung ngăn xếp có tất cả thông tin cần thiết để làm như vậy hay không.

0

Gọi Thread.currentThread(). GetStackTrace() để trả về StackElement [] có thể được in vào nhật ký của bạn.

+0

Tôi không nghĩ rằng đây là những gì OP đã hỏi về –

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