12/08/2018, 17:57

Rails Stack Trace

1. Stack Trace là gì: Trong quá trình lập trình Rails, thỉnh thoảng ta sẽ thấy những thông báo lỗi như thế này. Thông báo lỗi đang hiển thị Stack Trace, bao gồm 3 phần ApplicationTrace (được hiển thị mặc định), Framework Trace và Full Trace. Stack Trace là thứ tự chi tiết các ...

1. Stack Trace là gì:

  • Trong quá trình lập trình Rails, thỉnh thoảng ta sẽ thấy những thông báo lỗi như thế này.

  • Thông báo lỗi đang hiển thị Stack Trace, bao gồm 3 phần ApplicationTrace (được hiển thị mặc định), Framework Trace và Full Trace.

  • Stack Trace là thứ tự chi tiết các function xãy ra lỗi được gọi, cho phép ta debug và fix lỗi.

2. Cách đọc của Stack Trace:

  • Trong nhiều trường hợp, Stack Trace được hiển thi khá dài, nhất là phần Framework Trace và Full Trace.

  • Tuy nhiên đọc Stack Trace là kĩ năng cần thiết giúp chúng ta tìm ra code đang chạy theo thứ tự nào, lỗi xảy ra ở đâu và tại sao.

  • Trong hình minh họa trên, màn hình đang hiển thị 1 đoạn Stack Trace ngắn, nhìn vào đó ta có thể biết được các thông tin sau

  • Nội dung lỗi: When assigning attributes, you must pass a hash as an argument.

  • Lỗi tại: app/controllers/users_controller.rb:5:in show

  • Code tại dòng lỗi: @user = User.new(params[:id])

  • Ta thay thế function new bắng function find và chạy lại, kết quả thu được

3. Tác dụng Stack Trace:

  • Ta sẽ thử với 1 đoạn Stack Trace dài hơn để làm rõ hơn tác dụng của Stack Trace.

  • Ta thêm 2 function trong application_helper.rb

      def raise_error
        raise "Error"
      end
    
      def call_raise_error
        raise_error
      end
    
  • Gọi function call_raise_error trong method show của UsersController và chạy lại.

    def show
        call_raise_error
        @user = User.find(params[:id])
    end
    
  • Kết quả thu được

  • Lần này ta có 1 đoạn Stack Trace dài hơn và chi tiết hơn.

  • Các dòng trong Stack Trace được hiển thị từ dưới lên theo thứ tự chạy của các function được gọi.

  • Trong ví dụ, các funtion được gọi theo thứ tự

    • app/controllers/users_controller.rb:5:in show gọi app/helpers/application_helper.rb:7:in call_raise_error
    • app/helpers/application_helper.rb:7:in call_raise_error gọi app/helpers/application_helper.rb:3:in raise_error
  • Dòng trên cùng là dòng đang gây ra lỗi.

    • app/helpers/application_helper.rb:3:in raise_error
  • Trong nhiều trường hợp ta cần sữa lỗi theo thứ tự từ tên xuống dưới.

  • Click vào từng dòng có thể xem được chi tiết code lỗi tại dòng đó.

  • Lỗi tại dòng app/controllers/users_controller.rb:5:in show

  • Lỗi tại dòng app/helpers/application_helper.rb:7:incall_raise_error'`

  • Trong Rails Stack Trace chỉ được hiển thị khi xảy ra lỗi.

  • Để in ra Stack Trace trong cả trường hợp xảy ra lỗi và không xảy ra lỗi, ta sử dụng

    puts caller
    
  • Ví dụ khi mình sử dụng caller cho action show của UsersController

    def show
        @user = User.find(params[:id])
        puts caller
    end
    
  • Kết quả thu được

4. Link source code:

  • https://github.com/LeTanThanh/stack_strace
0