Cơ Chế Theo Dõi Luồng Gọi Hàm Trong MinGW - nói dối e blog

Cơ Chế Theo Dõi Luồng Gọi Hàm Trong MinGW

Trong quá trình phát triển phiên bản Windows của dự án hiện tại, nhóm chúng tôi đã sử dụng môi trường MinGW để xây dựng. Mặc dù có thể dùng gdb để gỡ lỗi và xem luồng thực thi khi ứng dụng gặp sự cố, nhưng phương pháp này vẫn chưa thực sự tối ưu trong nhiều trường hợp.

Trong một sự cố gần đây, phần mềm trình chỉnh sửa mô hình do nhóm phát triển khi triển khai cho đồng nghiệp tại Học viện Mỹ thuật Quảng Châu đã gặp lỗi nghiêm trọng. Điều này một lần nữa khẳng định tính “khó chiều” của ứng dụng 3D khi chạy trên các nền tảng card đồ họa khác nhau. Đặc biệt là khi phải gỡ lỗi từ xa, việc xác định nguyên nhân gặp rất nhiều khó khăn. Đây chính là lúc chúng tôi mong muốn có công cụ hiển thị luồng gọi hàm để phân tích nguyên nhân sự cố.

Mặc dù thư viện GNU C cung cấp hàm backtrace(), nhưng đáng tiếc MinGW lại không hỗ trợ tính năng này. Trước tình hình đó, nhóm đã quyết định tự xây dựng giải pháp riêng.

Giải pháp của chúng tôi vận hành dựa trên cơ chế khai thác thư viện imagehlp.dll của Windows - thành phần giúp trích xuất thông tin hình ảnh bộ nhớ của tệp tin thực thi hoặc thư viện liên kết động đang chạy (đã qua giai đoạn định vị lại). Đồng thời kết hợp với libbfd để truy xuất thông tin mã nguồn dựa trên các offset tương ứng.

Điểm mấu chốt trong việc thu thập thông tin luồng lỗi nằm ở hàm SetUnhandledExceptionFilter - cho phép đăng ký một hàm xử lý ngoại lệ để tiếp nhận ngữ cảnh lỗi. Qua nghiên cứu, nhóm phát hiện một giải pháp viết bằng C++ đã tồn tại trước đó, tuy nhiên tôi vẫn quyết định chọn phiên bản C do tự tay xây dựng.

Giải pháp hoàn toàn dễ sử dụng: chỉ cần nạp trước file backtrace.dll đã được biên dịch sẵn vào ứng dụng cần theo dõi. Khi xảy ra sự cố, hệ thống sẽ tự động xuất ra stderr toàn bộ thông tin luồng gọi hàm chi tiết.

Các bạn quan tâm có thể tìm hiểu thêm tại dự án mã nguồn mở của tôi trên nền tảng code.google.com. Với mong muốn chia sẻ kiến thức và học hỏi thêm từ cộng đồng, dự án được công bố với giấy phép MIT đầy đủ.

0%