Câu 1Trong các dòng chữ hiện ra khi chương trình dừng, thứ nào cho biết nơi nó dừng?
Cách đọc lỗi và log — xem ở đâu và cần báo gì để sửa được
Bài viết này nằm trong khóa Kiến thức nền tảng về CNTT, xây dựng từ đầu những kiến thức CNTT thực tế tối thiểu mà bạn cần để lập trình và vibe coding.
Nơi cần xem chia thành ba: thông báo lỗi, stack trace và log. Các sơ đồ cho thấy nên xem ở đâu và cần nói gì với người trả lời để vấn đề được sửa.
Bài viết này nói về cách đọc thông báo lỗi và log.
Dòng chữ hiện ra khi chương trình dừng và bản ghi được lưu lại trong lúc chương trình đang chạy là hai thứ khác nhau.
Từ một sự việc duy nhất là "đã xảy ra lỗi", nơi cần xem chia thành ba chỗ.
Hai mục trên là dòng chữ hiện ra khi chương trình dừng, mục dưới cùng là bản ghi được lưu lại trong lúc chương trình đang chạy.
Khi chương trình dừng, thông báo lỗi và stack trace hiện ra
Khi xảy ra lỗi (error — việc thực thi dừng lại vì không thể chạy tiếp các lệnh), môi trường chạy sẽ viết ra bằng chữ những gì đã xảy ra.
Dòng chữ này chia thành hai phần có vai trò khác nhau.
Khi bạn chạy app.js của ứng dụng đặt chỗ my-app bằng node app.js, dòng chữ sau hiện ra tại chỗ nó dừng.
/Users/you/my-app/app.js:5
return items.price * items.count;
^
TypeError: Cannot read properties of undefined (reading 'price')
at keisan (/Users/you/my-app/app.js:5:16)
at goukei (/Users/you/my-app/app.js:9:10)
at Object.<anonymous> (/Users/you/my-app/app.js:13:13)
at Module._compile (node:internal/modules/cjs/loader:1356:14)
Dòng đầu bắt đầu bằng TypeError là thông báo lỗi, còn bốn dòng bên dưới bắt đầu bằng at là stack trace.
Bản thân một dòng thông báo lỗi cũng chia thành ba phần: loại lỗi, mô tả và đối tượng.
- Loại lỗi — tên gọi cho nhóm vấn đề
- Tùy theo tên mà nơi xem đầu tiên khác nhau
- Mô tả — việc gì đã không làm được
- Có một giá trị đã trở thành undefined
- Đối tượng — giá trị hay tên nào đã thất bại
- Nó đã thử đọc price và thất bại
- Dãy các dòng bắt đầu bằng at
- Các dòng trong app.js do bạn viết
- Các dòng bên trong thư viện và môi trường chạy
Phần trong cùng là loại lỗi (error type — tên do môi trường chạy đặt sẵn để chỉ nhóm vấn đề), và tùy theo tên mà nơi bạn xem đầu tiên thay đổi.
Dòng chữ cho biết chuyện gì đã xảy ra và xảy ra ở đâu
Dòng chữ màu đỏ trên màn hình gồm hai thứ: thông báo lỗi nêu ngắn gọn chuyện gì đã xảy ra, và stack trace liệt kê nơi chương trình dừng.
Hãy đọc thông báo lỗi theo ba phần là loại lỗi, mô tả và đối tượng; khi biết tên loại lỗi, bạn đoán được nên mở chỗ nào tiếp theo.
Stack trace là dãy những nơi chương trình đã đi qua trước khi dừng
Chương trình được chia thành các khối xử lý, và khối này gọi khối kia trong lúc chạy.
Mỗi dòng được liệt kê là một khối xử lý còn đang dở khi chương trình dừng.
Dòng càng ở trên thì càng ở phía trong, dòng càng ở dưới thì càng ở phía ngoài.
| Dòng được liệt kê | Xử lý đang chạy | Việc đã làm ở đó | Nơi xem tiếp theo |
|---|---|---|---|
| at keisan | keisan | Đã thử đọc items.price | Đây là dòng chương trình dừng |
| at goukei | goukei | Đã gọi keisan | data.cart đã truyền vào |
| at Object.<anonymous> | Dòng ngoài cùng | Đã gọi goukei | Giá trị truyền ở đây là nguồn gốc |
Dòng keisan là nơi chương trình dừng, nhưng ở đó chỉ có một biểu thức dùng giá trị nhận được.
Lần theo giá trị đã truyền, bạn đi tới dòng 13 ở ngoài cùng.
Thứ được truyền ở đó không chứa price, nên chương trình dừng khi keisan thử đọc nó.
Các dòng được liệt kê còn hiện cả tên file khác ngoài app.js do bạn viết.
Hãy bắt đầu bằng cách mở dòng của file do chính bạn viết.
Thứ tự và cách viết khác nhau tùy môi trường chạy.
Python viết File thay cho at, và gọi cả dãy đó là traceback (một tên gọi khác của stack trace).
Các dòng liệt kê là chuỗi gọi từ trong ra ngoài
Stack trace là dãy gồm nơi chương trình dừng và những nơi nó đã đi qua để đến đó.
Mỗi dòng là một khối xử lý, dòng càng ở trên thì càng ở phía trong; cách viết và chiều liệt kê khác nhau tùy môi trường chạy, nhưng ở đâu bạn cũng bắt đầu đọc từ dòng có tên file do chính bạn viết.
Log là bản ghi các sự việc trong lúc chương trình chạy, kèm thời điểm
Những dòng chữ nói đến từ đầu bài đến đây chỉ đọc được trên màn hình khi bạn chạy chương trình trên máy của mình.
Trên server công khai, chúng không hiện lên màn hình của người dùng, vì để lộ ra là cho kẻ tấn công một manh mối.
| Một lần thất bại | Khi chạy trên máy của bạn | Sau khi đã công khai |
|---|---|---|
| Loại lỗi | Dòng TypeError: | Dòng ERROR trong log |
| Nơi chương trình dừng | Các dòng bắt đầu bằng at | Các dòng at còn lại trong log |
| Thời điểm xảy ra | Ngay sau khi bạn gõ lệnh | Thời điểm ở đầu dòng |
| Thứ người dùng nhìn thấy | Toàn văn trên cùng màn hình | Chỉ một thông báo ngắn |
Thứ xuất hiện ở cột bên phải là log (bản ghi các sự việc trong lúc chương trình chạy, được viết ra kèm thời điểm).
Không chỉ có lỗi: request nhận được và cả những xử lý thành công cũng được liệt kê, mỗi dòng một mục, theo đúng thứ tự xảy ra.
Sau khi nhận được báo là không lưu được đơn đặt chỗ, bạn mở log của my-app.
Quanh thời điểm đó có ba dòng sau.
2026-09-03 10:12:04 INFO đã tiếp nhận đăng ký đặt chỗ id=182
2026-09-03 10:12:05 ERROR lưu đơn đặt chỗ thất bại id=182
2026-09-03 10:12:05 ERROR kết nối tới cơ sở dữ liệu đã hết thời gian chờ
Bên trong một dòng cũng vậy, các phần xếp theo thứ tự cố định: thời điểm, mức log và nội dung.
- Xảy ra khi nào
- Thời điểm bạn đưa vào câu hỏi lấy từ đây
- Sự việc nặng đến mức nào
- Cách phân loại này gọi là mức log
- Chuyện gì đã xảy ra
- Có thể ghi thêm manh mối như id=182
Nhờ mức log (log level — cách phân loại cho biết sự việc ở dòng đó nặng đến mức nào) nằm ở giữa, bạn có thể lọc ra và chỉ đọc những dòng nặng.
Tên và số lượng phân loại khác nhau tùy thư viện, nhưng điểm chung là chúng được xếp hạng từ bản ghi nhẹ đến bản ghi nặng, và bạn có thể chọn trong thiết lập là giữ lại từ mức nào trở lên.
Log của server được viết ra file, hoặc gửi tới một dịch vụ thu thập log để lưu giữ.
Cách chỉ đọc phần cuối file được nói tới trong Xem nội dung file — cat / head / tail / wc.
Nơi cần xem được quyết định bởi phía nào đã dừng.
Nếu dừng ở khung bên trái thì xem console của trình duyệt, nếu dừng ở khung bên phải thì xem log của server.
Sau khi công khai, thứ bạn đọc là log
Dòng chữ hiện trên màn hình khi chạy ở máy bạn, sau khi công khai sẽ nằm lại trong log của server.
Một dòng log xếp theo thứ tự thời điểm, mức log rồi nội dung, nên khi tìm thấy dòng ERROR, hãy đọc các dòng quanh nó để biết lúc đó chuyện gì đang diễn ra.
Khi hỏi, bạn cần báo 4 thứ: toàn văn dòng chữ, các bước tái hiện, môi trường và thời điểm
Nếu bạn chỉ nói "gặp lỗi", người trả lời sẽ phải bắt đầu bằng việc hỏi lại bạn.
Họ không nhìn thấy máy tính của bạn, nên điều quyết định là họ có tạo lại được đúng trạng thái đó trên máy mình hay không.
Mục thứ hai, các bước tái hiện (steps to reproduce — chuỗi thao tác để tạo lại đúng trạng thái đó), là thứ người trả lời hỏi đầu tiên.
Hãy liệt kê theo thứ tự bạn ở màn hình nào, nhập gì và bấm gì, kèm cả việc lỗi có xảy ra mỗi lần hay không.
Hãy dán cả bốn thứ thành một khối thay vì gửi rời rạc.
Trước khi dán, hãy kiểm tra xem có lẫn tên server đích hay API key nào không.
- Từ dòng TypeError đến các dòng at
- Đừng chỉ cắt lấy dòng cuối cùng
- Đã chọn 12/24 18:00 trên màn hình đặt chỗ
- Đã bấm nút đăng ký
- my-app trên máy bạn, hay server công khai
- Một dòng lệnh dùng để chạy, ví dụ node app.js
- 2026-09-03 10:12:05
- Nhờ đó biết cần xem phần nào của log
Đôi khi không có dòng chữ lỗi nào mà mọi thứ vẫn không chạy như bạn nghĩ.
Màn hình trắng và không có gì xảy ra, hoặc có kết quả nhưng giá trị lại sai.
Những lúc như vậy, hãy tìm xem bản ghi trong log đứt ở chỗ nào.
Đủ 4 thứ thì người kia tạo lại được trạng thái
Bạn cần báo bốn thứ: toàn văn dòng chữ đã hiện, các bước tái hiện, nơi bạn đã chạy và thời điểm xảy ra.
Thứ nào cũng cần cho người trả lời để tạo lại đúng trạng thái đó, nên hãy dán nguyên dòng chữ chứ đừng cắt bớt, và trước khi dán chỉ cần kiểm tra xem có lẫn giá trị bí mật nào không.
Kiểm tra kiến thức
Hãy trả lời từng câu hỏi một.
Câu 2Khi lỗi xảy ra trên server công khai, bạn đọc nội dung chi tiết ở đâu?
Câu 3Khi bạn hỏi về một lỗi, người trả lời cần thông tin nào để tạo lại đúng trạng thái đó?