Gần đây, tôi đã gặp phải một lỗi lập trình khá kỳ lạ trong quá trình phát triển, khiến tôi mất rất nhiều thời gian để gỡ lỗi. Sau một đêm vật lộn với mã nguồn, cuối cùng tôi đã tìm ra nguyên nhân gốc rễ của vấn đề. Xin chia sẻ chi tiết ba vấn đề quan trọng mà tôi đã phát hiện:
Vấn đề thứ nhất: Quản lý ngăn xếp (stack) trong hàm C
Khi làm việc với lua_State trong các hàm C, không nên tùy tiện sử dụng ngăn xếp của máy ảo. Nếu cần sử dụng nhiều vị trí trên ngăn xếp (vượt quá giới hạn mặc định LUA_MINSTACK là 20), bắt buộc phải gọi hàm lua_checkstack
để đảm bảo không gian ngăn xếp đủ trước khi thao tác. Điều này đã được ghi chú trong tài liệu chính thức, nhưng tiếc rằng tôi đã quên mất. Cá nhân tôi vẫn cảm thấy hàm lua_checkstack
có chút bất hợp lý về mặt ngữ nghĩa - tên gọi “kiểm tra ngăn xếp” nghe như chỉ kiểm tra mà không làm thay đổi trạng thái, nhưng thực tế nó lại có thể mở rộng kích thước ngăn xếp, điều khiến người dùng dễ hiểu lầm.