2014-10-20 18 views
7

Tôi thực sự mặc dù tôi muốn tìm một câu trả lời trực tuyến, nhưng tôi không thể. Có sự khác biệt nào không? Mọi người nói rằng một 'backtrace' được tạo ra khi một cái gì đó ném một ngoại lệ, trong khi một dấu vết stack là một danh sách các cuộc gọi phương thức từ điểm khi ứng dụng được bắt đầu đến điểm mà trường hợp ngoại lệ đã được ném. Nếu chúng ta cho rằng một dấu vết ngăn xếp là một mảng, thì phần tử cuối cùng sẽ là phương thức mà trường hợp ngoại lệ được ném ra. Nó sẽ là trường hợp ngược lại cho một dấu vết ngược lại? Trong một ngôn ngữ lập trình như Ruby, ví dụ, nếu chúng ta có:Sự khác biệt giữa stack-trace và back-trace là gì?

begin 
    raise 1 
rescue 
    p $!.backtrace ; p caller(0) #=> displays the back-trace, then the stack-trace 
end 

Họ sẽ ra 2 mảng khác nhau, điều này gợi ý cho tôi có điều gì đó hoàn toàn khác nhau về họ.

Trả lời

5

"Backtrace", "stack trace", "stack backtrace", v.v ... là tên cho cùng một điều. "Backtrace" có thể xuất phát từ công cụ Linux có cùng tên. Dấu vết ngăn xếp không chỉ đề cập đến ngoại lệ - trạng thái hiện tại của ngăn xếp cuộc gọi của chương trình luôn có thể được hiển thị dưới dạng dấu vết ngăn xếp (theo dõi ngược, nhưng cũng có nhiều chế độ xem và công cụ gỡ lỗi). Nó chỉ hữu ích để xuất một dấu vết ngăn xếp trong trường hợp ngoại lệ hoặc lỗi.

Chỉnh sửa: Rất tiếc, tôi vẫn nằm trong thẻ 'C' - nhưng nhìn vào tài liệu, cả Exception.backtrace và người gọi nên giữ mảng nơi đầu ngăn xếp cuộc gọi đầu tiên trong mảng. Có vẻ khác biệt về độ sâu của chúng và một số định dạng.

+1

Linux hầu như không tồn tại khi Ruby được tạo, tôi nghi ngờ rằng bất kỳ thuật ngữ nào trong Ruby đều bắt nguồn từ đó. Ruby đã được tạo ra vào tháng 2 năm 1993, Linux vào mùa hè năm 1991. SLS, bản phân phối Linux đầu tiên chỉ mới 5 tháng tuổi và bị lỗi khi địa ngục bắt đầu. –

+0

@ JörgWMittag Suy đoán về phía tôi và bạn có lẽ đúng, mặc dù điều đó phụ thuộc vào thời điểm Exception.backtrace được thêm vào ngay từ đầu. Nó có nhiều khả năng là một thuật ngữ phổ biến vào thời điểm đó vì các công cụ GNU có xu hướng sử dụng thuật ngữ đó (ví dụ GDB, và công cụ backtrace, tồn tại trên Unix trước). Như tôi đã nói - ở đây một cách tình cờ! Tôi ngạc nhiên khi Ruby thực sự là cũ. –

+1

Được hình thành vào ngày 24 tháng 2 năm 1993, được xuất bản vào năm 1995, 1.0 vào dịp Giáng sinh năm 1996. –

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