Một Đêm Vật Lộn Cùng Insight - nói dối e blog

Một Đêm Vật Lộn Cùng Insight

Tôi đã cài đặt phiên bản Insight 6.3, phiên bản có thể dễ dàng tải file bin từ trang chủ MinGW. Việc cài đặt và sử dụng cực kỳ thuận tiện. Tiếc thay, phiên bản GDB 6.3 này lại gặp vấn đề nghiêm trọng khi debug trên Windows - cụ thể là không thể attach đúng vào tiến trình đang chạy. Thử nghiệm đặt lệnh ngắt bằng int 3 trong code, sau khi chương trình crash thì dùng Insight attach vào tiến trình lỗi, nhưng hệ thống lại không hiển thị chính xác call stack của tiến trình đang debug. Điều này khiến tôi vô cùng bực bội vì không thể debug theo kiểu “on-demand” như thời dùng Visual C++ nữa - giờ phải khởi động Insight/GDB trước rồi mới chạy chương trình được.

Chiều nay sau khi tra cứu trên Google, hóa ra đây là một bug đã được cộng đồng GDB ghi nhận. Theo một bài viết trên diễn đàn, lỗi này mới chỉ được sửa gần đây. Truy cập vào trang chủ GDB/Insight, tôi phát hiện phiên bản mới nhất hiện tại đã là 6.5, tuy nhiên chỉ có mã nguồn chứ không có bản bin cho Windows. Với tính lười biếng cố hữu, tôi luôn mong chờ có ai đó build sẵn giúp mình. Việc compile các công cụ GNU trên Windows quả thực là cơn ác mộng - tôi đã từng trải nghiệm quá nhiều lần rồi.

Sau hàng giờ trời mò mẫm tìm kiếm, đành phải thừa nhận không có ai tốt bụng build bản 6.5 cho Win32. Quyết định tự mình động thủ, tôi bắt đầu quá trình “tự cày”. Trên máy tôi không cài Cygwin mà chỉ có bản MinGW tối giản, nên trước tiên phải tải về MSYS - môi trường bắt buộc để chạy các script shell khi build phần mềm GNU. Việc cài đặt MSYS khá đơn giản, giao diện sau khi khởi động rất quen thuộc, gần giống Cygwin. Giờ đây ít ra tôi có thể dùng lệnh ls để xem danh sách thư mục thay vì gõ nhầm dir suốt ngày.

Nhưng từ đây bắt đầu chuỗi ngày địa ngục…

Tôi nghi ngờ rằng Windows XP có bug trong quản lý tiến trình. Khi dùng lệnh make đi kèm Insight, hệ thống liên tục báo lỗi fork thất bại giữa chừng. Ai hiểu cơ chế của make đều biết nó hoạt động bằng cách sinh ra hàng loạt tiến trình con. Trong khi Windows quản lý tiến trình kém xa các hệ thống *nix, khiến make hoạt động vô cùng bất ổn trên máy tôi. Mỗi lần gặp lỗi, dù có kill tiến trình và khởi động lại cũng vô hiệu - chỉ còn cách reset máy. May mắn là make có thể tiếp tục từ chỗ dừng sau khi khởi động lại. Sau 3-4 lần reboot máy, cuối cùng tôi cũng hoàn thành quá trình build.

Nhưng khi gần xong, dòng thông báo “Error: gdb không hỗ trợ native target i686-pc-mingw32” (._.!) khiến tôi suýt ngất. Tiếp tục tra cứu trên Google, phát hiện ra có người đã xin lỗi về vấn đề này, đồng thời chỉ ra cần phải cross-compile để tạo bản build dành riêng cho MinGW. Đến đây thì tôi đành đầu hàng, quá mệt mỏi.

Qua trải nghiệm đau thương này, tôi rút ra được vài bài học xương máu:

  1. Tuyệt đối không cài đặt các công cụ GNU vào thư mục Program Files - Đây là bài học đắt giá khi tôi cài Vim vào đây, khiến các đường dẫn trong makefile chứa khoảng trắng bị lỗi. Bạn chỉ còn nước nguyền rủa Microsoft vì đã cố tình đặt tên thư mục quan trọng có khoảng trắng, rõ ràng là tạo ra sự bất tương thích.

  2. Không nên quá kỳ vọng vào các gói source code GNU trên Windows - Dù các phần mềm này tuyệt vời, nhưng Windows không phải môi trường lý tưởng để compile chúng. Tốt nhất hãy tìm các bản build sẵn do cộng đồng chia sẻ.

  3. Windows thực sự là hệ điều hành kém ổn định - Người dùng Windows như chúng ta có thể chịu đựng được là nhờ đã học cách “né tránh” các khu vực dễ gây lỗi. Nếu không cẩn thận, bạn sẽ phải đối mặt với hàng tá vấn đề không tên.

0%