AILapTrinh.comAI Lập Trình
Gỡ lỗi cùng AI

Đọc stack trace cùng AI: lần từ dòng báo lỗi về đúng chỗ hỏng trong mã của bạn

Cách đọc ngăn xếp lời gọi trong Python, JavaScript, PHP và nhờ AI giải nghĩa: tìm dòng thuộc mã của bạn, lỗi lồng nhau, lỗi bất đồng bộ.

Two developers in a small Da Nang office leaning toward one laptop with a blurred blank screen, one pointing with a pen, desk lamp, seen from the side, faces turned away

Ngăn xếp lời gọi, hay stack trace, là bản đồ đường đi của chương trình tới lúc hỏng: nó liệt kê hàm nào gọi hàm nào, ở tệp nào, dòng nào. Đọc được bản đồ này, bạn biết lỗi nổ ra ở đâu và nên bắt đầu tìm nguyên nhân ở đâu. Hai chỗ đó thường không trùng nhau.

Nhiều người mới nhìn thấy năm mươi dòng chữ đỏ là chép cả khối dán cho AI rồi chờ. Cách đó không sai, nhưng bạn sẽ dùng AI hiệu quả hơn nhiều nếu tự đọc được khung cơ bản: chiều đọc của từng ngôn ngữ, dòng nào là của mình, dòng nào là của thư viện, lỗi lồng nhau trông thế nào. Phần sau của bài là các câu lệnh mẫu để AI giải nghĩa những đoạn khó.

Chiều đọc khác nhau ở mỗi ngôn ngữ

Điều gây nhầm lẫn đầu tiên là thứ tự. Có ngôn ngữ in lời gọi gần nhất ở cuối, có ngôn ngữ in ở đầu. Bảng dưới tóm cách đọc ba ngôn ngữ hay gặp ở các nhóm nhỏ tại Việt Nam.

Ngôn ngữDấu hiệu nhận raDòng gần chỗ hỏng nhấtTên loại lỗi nằm ở
PythonMở đầu bằng Traceback (most recent call last)Khung cuối cùng, ngay trên dòng tên lỗiDòng cuối, ví dụ ValueError kèm thông điệp
JavaScript (Node.js, trình duyệt)Dòng tên lỗi trước, sau đó các dòng bắt đầu bằng chữ atDòng at đầu tiênDòng đầu, ví dụ TypeError kèm thông điệp
PHPThông báo lỗi trước, sau đó mục Stack trace với các dòng đánh số #0, #1Dòng #0Dòng đầu, ví dụ Uncaught TypeError hoặc Fatal error

Mẹo nhớ đơn giản: tìm dòng có tên loại lỗi trước, rồi tìm khung gần nó nhất. Từ đó đi ngược lên chuỗi lời gọi cho tới khi gặp tệp do chính dự án của bạn viết.

Java, C# và nhiều ngôn ngữ khác cũng in kiểu giống JavaScript, lời gọi gần nhất ở trên cùng. Khi gặp ngôn ngữ lạ, câu đầu tiên đáng hỏi AI là chiều đọc của nó.

Dòng của bạn và dòng của thư viện

Trong một ngăn xếp dài, phần lớn khung thuộc về thư viện và khung làm việc: bộ định tuyến của khung web, trình điều khiển cơ sở dữ liệu, thư viện xử lý dữ liệu. Những khung đó hiếm khi là chỗ hỏng thật. Lỗi nổ ra bên trong thư viện thường vì mã của bạn đã đưa vào một giá trị sai từ trước. Vì vậy, dòng đáng đọc kỹ nhất là dòng cuối cùng thuộc mã dự án trước khi chuỗi gọi đi vào thư viện.

Nhận ra dòng của mình khá dễ nhờ đường dẫn tệp. Mã thư viện Python thường nằm trong thư mục site-packages, mã Node.js nằm trong node_modules, mã PHP cài qua Composer nằm trong vendor. Dòng nào trỏ về thư mục dự án của bạn, như app, src hay tên module tự đặt, là dòng của bạn. Nhiều trình soạn thảo còn tô màu khác hoặc thu gọn sẵn các khung thư viện.

Ví dụ giả định: trang báo cáo của một cửa hàng ở Cần Thơ báo lỗi chia cho số không, khung cuối nằm sâu trong thư viện tính toán. Đi ngược lên, khung đầu tiên thuộc dự án là hàm tính tỉ lệ đổi trả theo tháng, gọi với tổng đơn bằng không vì tháng đó cửa hàng nghỉ Tết. Lỗi nằm ở chỗ hàm không xử lý tháng không có đơn, không nằm ở thư viện. Khi hỏi AI, đưa đúng khung này cùng hàm liên quan sẽ ra câu trả lời trúng ngay lượt đầu.

Lỗi lồng nhau: khi một ngoại lệ sinh ra ngoại lệ khác

Python in hai loại câu nối. Câu During handling of the above exception, another exception occurred nghĩa là trong lúc xử lý lỗi thứ nhất thì khối bắt lỗi lại hỏng tiếp. Câu The above exception was the direct cause of the following exception nghĩa là mã cố ý ném lỗi mới và gắn lỗi cũ làm nguyên nhân. Cả hai trường hợp, lỗi gốc thường là khối in phía trên.

Đừng chỉ đọc khối cuối cùng. Người mới hay đọc lỗi cuối rồi dừng, trong khi lỗi cuối chỉ là hệ quả. Ví dụ giả định: lỗi cuối báo không ghi được nhật ký, còn khối phía trên cho thấy nguyên nhân thật là mất kết nối tới cơ sở dữ liệu.

JavaScript có thuộc tính cause. Từ các bản JavaScript gần đây, lỗi có thể mang theo lỗi gốc qua thuộc tính cause. Khi in ra, nhiều môi trường hiển thị cả chuỗi. Nếu chỉ thấy một lỗi chung chung, kiểm xem mã có đang bọc lỗi gốc mà không in phần nguyên nhân hay không.

PHP có lỗi trước đó. Ngoại lệ PHP có thể mang ngoại lệ trước đó, hiển thị trong mục Next hoặc qua phương thức getPrevious. Khung làm việc thường bọc lỗi cơ sở dữ liệu trong một lỗi riêng của nó, và thông tin quý nằm ở lớp bên trong.

Khi dán cho AI, dán đủ cả chuỗi. Cắt bớt khối phía trên để cho gọn là mất đúng phần quan trọng nhất. Nếu quá dài, giữ nguyên dòng tên lỗi của mọi khối và vài khung thuộc mã dự án, bỏ bớt khung thư viện ở giữa.

Ngăn xếp đứt đoạn với mã bất đồng bộ

Với mã bất đồng bộ, như async và await trong JavaScript hay Python, hoặc các lời gọi hẹn giờ, ngăn xếp lời gọi có thể chỉ còn vài khung và không cho thấy ai đã gọi hàm hỏng. Lý do là đến lúc hàm chạy, hàm đã khởi động nó có thể đã kết thúc từ lâu. Bạn nhìn thấy chỗ hỏng mà không thấy đường dẫn tới đó.

Môi trường hiện đại đã cải thiện nhiều chuyện này. Node.js và các trình duyệt phổ biến ghép được các khung async lại khi dùng await đúng cách, hiện chữ async trước tên hàm. Nhưng nếu mã trộn lẫn kiểu gọi lại cũ với await, hoặc quên await ở một chỗ, chuỗi lại đứt. Một lời hứa bị từ chối mà không ai bắt sẽ sinh ra cảnh báo kiểu unhandled rejection, có khi in ra ở chỗ không liên quan gì tới dòng gây lỗi.

Cách xử lý thực tế: thêm nhật ký ở điểm bắt đầu và kết thúc mỗi tác vụ bất đồng bộ, kèm một mã định danh cho từng yêu cầu, để nối được các dòng rời rạc. Khi hỏi AI, nói rõ đây là mã bất đồng bộ và dán cả hàm khởi động tác vụ, không chỉ hàm hỏng. Một câu lệnh hữu ích: “Ngăn xếp này có vẻ bị đứt ở đoạn bất đồng bộ. Chỉ ra những chỗ trong đoạn mã có thể thiếu await hoặc có lời hứa không được bắt lỗi.”

Câu lệnh mẫu để AI giải nghĩa ngăn xếp

Dán ngăn xếp nguyên văn, sau đó chọn một trong các câu dưới tuỳ việc bạn cần. Đừng dịch thông điệp lỗi sang tiếng Việt trước khi dán, vì AI nhận diện loại lỗi qua đúng câu chữ gốc.

  • “Giải thích ngăn xếp này theo thứ tự thời gian từ lúc chương trình bắt đầu tới lúc hỏng, mỗi bước một câu, đánh dấu bước nào thuộc mã dự án.”
  • “Chỉ ra khung cuối cùng thuộc mã dự án trước khi lỗi đi vào thư viện, và giá trị nào được truyền vào thư viện ở đó có thể sai.”
  • “Ngăn xếp có hai khối lỗi nối nhau. Khối nào là nguyên nhân gốc, khối nào là hệ quả, vì sao.”
  • “Từ ngăn xếp này, đề xuất ba chỗ nên đặt lệnh in giá trị để xác nhận nguyên nhân, chưa sửa gì.”
  • “Thông điệp lỗi này nghĩa là gì bằng lời thường cho người mới học, kèm một ví dụ hai dòng gây ra đúng lỗi đó.”

Câu cuối đặc biệt có ích cho sinh viên và người tự học: hiểu được một loại lỗi qua ví dụ tối thiểu, lần sau gặp lại bạn tự nhận ra mà không cần hỏi. Đó là cách dùng AI để giỏi lên chứ không chỉ để xong việc.

Quy trình mười phút với một ngăn xếp lạ

Khi gặp một lỗi chưa từng thấy, quy trình dưới đây giữ cho bạn không bị cuốn vào việc sửa vội. Thời gian là ước lượng cho lỗi thường gặp, không phải cam kết.

  1. Đọc dòng tên lỗi và thông điệp. Ghi ra một câu: chương trình phàn nàn về điều gì.
  2. Tìm khung gần chỗ hỏng nhất, rồi khung cuối cùng thuộc mã dự án. Mở đúng dòng đó trong trình soạn thảo.
  3. Kiểm xem có khối lỗi lồng nhau không. Nếu có, quay lên khối đầu tiên.
  4. Che khoá, mật khẩu, dữ liệu khách trong ngăn xếp. Nhiều ngăn xếp in cả giá trị tham số, trong đó có thể có chuỗi kết nối hoặc thông tin người dùng.
  5. Dán cho AI cùng đoạn mã quanh dòng của dự án, hỏi giải nghĩa và các cách kiểm, chưa hỏi cách sửa.
  6. Kiểm giả thuyết đứng đầu bằng một lệnh in hoặc điểm dừng trong trình gỡ lỗi. Đúng thì mới bàn cách sửa, sai thì quay lại AI với kết quả vừa có.

Sau vài chục lần, bước một đến bước ba sẽ thành phản xạ, và bạn sẽ thấy mình hỏi AI ít hơn nhưng hỏi trúng hơn.

Những ngăn xếp nói dối

Có lúc ngăn xếp chỉ đúng một nửa. Mã JavaScript đã nén và gộp cho trình duyệt sẽ báo lỗi ở một tệp duy nhất với số dòng vô nghĩa, trừ khi bạn có tệp ánh xạ nguồn, gọi là source map, để trình duyệt dịch ngược về tệp gốc. Nếu thấy lỗi ở dòng 1 cột hơn chục nghìn, gần như chắc là bạn đang đọc mã đã nén, và hỏi AI về dòng đó chẳng ích gì. Bật source map ở bản thử nghiệm trước rồi tái hiện lại.

Mã PHP đã qua bộ nhớ đệm hay mã Python chạy qua lớp bọc của khung làm việc đôi khi báo số dòng lệch nếu tệp vừa sửa mà tiến trình chưa nạp lại. Khi số dòng trỏ vào một dòng trống hoặc một chú thích, nghi ngay chuyện tệp đang chạy không phải tệp bạn đang mở. Kiểm thời điểm sửa tệp trên máy chủ, khởi động lại tiến trình nếu cần, rồi tái hiện lỗi lần nữa.

Cuối cùng, ngăn xếp chỉ cho biết đường đi của lần chạy hỏng. Nó không nói gì về những lần chạy êm. Nếu lỗi chỉ thỉnh thoảng xảy ra, một ngăn xếp duy nhất có thể dẫn bạn tới chỗ lỗi bộc lộ chứ không phải chỗ lỗi sinh ra. Khi đó, hãy gom nhiều ngăn xếp của cùng lỗi trong nhật ký, so điểm chung giữa chúng, rồi mới đưa cho AI cả nhóm để nó tìm quy luật.

Câu hỏi thường gặp

Stack trace và traceback có khác nhau không?

Về bản chất là một: danh sách các lời gọi hàm đang dang dở lúc chương trình hỏng. Traceback là tên Python dùng, stack trace là tên chung ở nhiều ngôn ngữ khác. Tiếng Việt hay gọi là ngăn xếp lời gọi hoặc vết ngăn xếp.

Vì sao dòng báo lỗi lại nằm trong thư viện mà không phải trong mã của mình?

Vì lỗi thường bộc lộ ở chỗ giá trị sai được dùng tới, mà chỗ đó hay nằm sâu trong thư viện. Nguyên nhân thật thường ở khung cuối cùng thuộc mã dự án, nơi giá trị sai được tạo ra hoặc truyền vào thư viện.

Ngăn xếp quá dài, dán cho AI có bị cắt không?

Phần lớn trợ lý nhận được vài trăm dòng mà không sao. Nếu quá dài, giữ nguyên mọi dòng tên lỗi, các khung thuộc mã dự án và vài khung thư viện sát hai bên, bỏ phần lặp ở giữa, và ghi chú rõ là đã lược bớt.

Ngăn xếp có thể chứa thông tin nhạy cảm không?

Có. Một số khung làm việc in cả giá trị tham số, biến môi trường hoặc truy vấn đầy đủ, trong đó có thể có mật khẩu, khoá hoặc dữ liệu người dùng. Đọc qua và che những phần đó trước khi dán vào bất kỳ công cụ nào ngoài máy của bạn.

Mã đã nén trên trình duyệt báo lỗi ở dòng 1 thì làm sao đọc?

Cần tệp ánh xạ nguồn. Tạo bản dựng có source map cho môi trường thử nghiệm, mở công cụ nhà phát triển của trình duyệt, tái hiện lỗi, khi đó ngăn xếp sẽ trỏ về tệp và dòng gốc. Cân nhắc kỹ trước khi công khai source map trên bản chạy thật.

Có nên nhờ AI đọc ngăn xếp thay mình luôn không?

Dùng AI để giải nghĩa thì tốt, nhưng nên tự đọc được khung cơ bản: chiều đọc, dòng tên lỗi, khung của dự án. Khi đó bạn biết đoạn nào cần dán, nhận ra lúc AI giải thích sai, và gỡ được những lỗi đơn giản mà không cần hỏi ai.

Cần tư vấn cụ thể cho trường hợp của bạn?

Chúng tôi sẽ liên hệ trong vòng 24 giờ.

Đăng ký tư vấn ngay

Bài viết liên quan

Bạn cần hỗ trợ thêm?

Để lại thông tin, chúng tôi sẽ liên hệ trong 24 giờ.

hoặc
Gọi ngay 0926 138 138