Sửa lỗi dev c không debug được trong

Bug là gì?

  • Bugs là ám chỉ các lỗi xảy ra trong logic, hay bất kỳ vấn đề gì gây ra việc làm cho ứng dụng không thực thi được hoặc thực thi sai.
  • Bugs luôn tiềm ẩn ở mọi nơi, và ta không thể lường trước được mọi tình huống có thể xảy ra mà chỉ có thể cố gắng làm giảm nó đến mức thấp nhất có thể tùy vào khả năng của ta tại thời điểm phát triển và bảo trì ứng dụng.
  • Debug là quá trình tìm kiếm ra lỗi hay nguyên nhân gây ra lỗi (bug ở đâu) để có hướng sửa lỗi (fix bug). Việc kiểm soát lỗi của rất nhiều các dòng code là việc không hề đơn giản với những người lập trình viên chưa có nhiều kinh nghiệm.
  • Chuyện xảy ra lỗi trong hàng nghìn dòng lệnh đó là chuyện bình thường đối với bất cứ 1 người làm lập trình nào. Chương trình có thể chạy không đúng ý người lập trình, hoặc chạy sai chức năng nó được quy định, gây cho chương trình bị đánh giá kém chất lượng. Vậy khi bị lỗi thì các lập trình viên phải debug để fix lỗi giúp cho chương trình (program) chạy tốt.

Mục đích của việc debug

  • Mục đích của Debug không chỉ là để loại bỏ lỗi (error) khỏi chương trình mà quan trọng hơn còn để giúp lập trình viên hiểu rõ hơn sự thực thi của chương trình. Một lập trình viên không có khả năng Debug hiệu quả thì cũng giống như bị mù vậy.

Các phương pháp debug

  • Debugging Tool – dùng công cụ để Debug – là phương pháp Debug đi sâu vào source code nhất. Thường thì chúng ta gọi những Debugging Tool này là Debugger. Những Debugger phần mềm thông dụng là Microsoft Visual Studio Debugger , GNU Debugger . Ngoài ra còn có những Debugger phần cứng được thiết kế kèm cho các hệ thống nhúng (Embedded System) bởi các thiết kế nhúng không phải là những thiết kế mang tính mục đích chung (General-purpose) mà thường được thiết kế trên các platform riêng biệt phục vụ các ứng ứng dụng riêng biệt nên cũng cần những Debugger đặc thù đi kèm.
  • Printlining: đơn giản là bạn thêm vào source code của bạn những dòng lệnh để in ra những thông tin mà bạn cần theo dõi trong quá trình thực thi. Chẳng hạn nếu bạn dùng Arduino IDE thì bạn sẽ không có Debugger và cách Debug phù hợp nhất là bạn dùng Serial.print().
  • Logging: tạo ra một biểu mẫu để ghi (log) lại những thông tin sau khi chương trình thực thi. Phân tích nguyên nhân lỗi dựa trên những thông tin này.
  • Ngoài ra thì còn một phương pháp mà cá nhân mình cho là rất hiệu quả đó là phương pháp – Nhờ người khác debug – là việc bạn vác đoạn code ra nhờ người có kinh nghiệm hơn debug dùm.

Mẹo viết code giúp chúng ta soát lỗi nhanh

  • Dùng comment (chú thích) sau khi viết xong 1 đoạn code về 1 phần nào đó để sau này dễ tìm và sửa.
  • Đặt tên các hàm các biến có ý nghĩa để dễ kiểm soát và tìm lỗi.
  • Hoặc có thể sử dụng Breakpoints để rà soát xem phần mềm của bạn chạy đến vị trí nào của code và đến đó có đúng không.
  • Đừng bỏ qua các Error Message nó sẽ giúp chúng ta có thể tìm ra số dòng code và sửa rất nhanh.

Sửa lỗi dev c không debug được trong

  • Software engineer phát triển bản thân như thế nào?
  • Hướng dẫn cách viết clean code cho lập trình viên (P1)
  • Những sự thật ít người biết tới về nghề lập trình

Ai trong chúng ta cũng đều muốn thiết kế ra một phần mềm tuyệt vời, code được viết một cách hoàn hảo, ấn run và chạy được luôn mà không có một bug nào xảy ra.

Nhưng thực tế rằng, chúng ta đã dành nhiều thời gian cho việc debug - gỡ lỗi hơn là cho việc code mới, tạo ra các chức năng mới. Đôi khi bạn sẽ cảm thấy bó tay trước việc hiểu được cơ chế xảy ra của bug và tìm cách để fix được nó, nó sẽ trở thành vấn đề ảnh hưởng rất lớn đến tốc độ và chất lượng của dự án.

Ngày nay, chúng ta có thể học thêm rất nhiều các kiến thức mới, các kỹ năng về lập trình, các công cụ mới v.v... từ một cuốn sách, tham dự các buổi seminar hay vào các trang mạng, google v.v... Tuy nhiên chúng ta thường tập trung vào các công cụ, ngôn ngữ, hoặc framework mà ít khi chúng ta tìm kiếm về các đề tài cơ bản khác như: kĩ năng đọc source code, fix bug nhanh, tổ chức source code, thiết kế class hợp lý và hiệu quả v.v... Các ngôn ngữ lập trình, framework có thể thay đổi, công cụ không phải là tất cả, nhưng khả năng nắm tổng thể source code, lần theo vết bug, fix bug một cách nhanh chóng sẽ ở lại với chúng ta mãi mãi, sẽ tiết kiệm cho chúng ta vô khối thời gian.

Kĩ năng debug và fix bug phần lớn là đến từ kinh nghiệm, có thể là kinh nghiệm cả chính bản thân, có thể là được chia sẻ từ người khác. Hoặc như có thể đó cũng là một loại năng khiếu bẩm sinh, năng khiếu sử lý lỗi, tức là sinh ra đã có rồi, thời gian sử lý bug thường rất nhanh và hầu như không gặp một chút khó khăn gì cả. Tuy nhiên, cả hai con đường, hoặc đến từ kinh nghiệm rèn luyện, hay từ bẩm sinh đi nữa, đều có những đặc điểm chung, chúng ta có thể học tập và làm theo một trong số những bước sau:

  • Tăng cường tính kỉ luận của bản thân khi debug. Debug là một quá trình, nó không phải là một chuỗi các sự kiện ngẫu nhiên, khi có cùng điều kiện ở đầu vào, cùng điều kiện về môi trường thì đầu ra luôn cố định. Không debug một cách vu vơ, làm theo một quy trình nhất định và theo dõi chặt chẽ quá trình sử lý của source code. Kiểm tra đầu vào và đầu ra của các module để chắc chắn rằng nó đã thực hiện đúng như ta mong muốn hay chưa, luôn phải xác định được đầu vào và đầu ra ta mong muôn sẽ như thế nào, nếu đúng thì chúng ta có thể chuyển sang xem xét ở phần tiếp theo.
  • Để cải thiện kỹ năng debug & fix bug, chúng ta cần thực hành trên code của người khác nữa. Điều này sẽ giúp chúng ta có được cách nhìn nhận khách quan hơn trong quá trình gỡ lỗi, phát triển khả năng nhận ra các nguyên nhân gây ra bug nhanh hơn, loại bỏ chúng trong quá trình phát triển source code của bản thân.
  • Học cách đưa ra các giả thuyết về cách thức làm việc của compiler, của server, chạy logic để kiểm định tính chính xác của nó. Luôn nghi ngờ và xác minh lại về cơ chế làm việc của source code, đôi khi bug xuất hiện ở chính đoạn code mà chúng ta luôn cho rằng chính xác -> sẽ rất khó để tìm ra những bug như thế này nếu không thay đổi tính cố chấp của bản thân.
  • Học cách fig bug sớm trong quá trình phát triển phần mềm, thông qua viết theo TDD, chuẩn bị unit test. Hoặc học cách gỡ lỗi các thiết kế kém, chỉnh sửa lại detail design.
  • Nếu có thể, hãy giữ toàn bộ hệ thống trong đầu của bạn, lúc đấy thì debug và fix bug rất là đơn giản. Hãy chú ý đến mối quan hệ của toàn hệ thống, cách thức các module trao đổi với nhau, đọc và hiểu source code ở nhiều cấp độ. Một lập trình viên giỏi thì luôn có khả năng nắm hết được hệ thống, và không phải chờ đến lúc fix bug anh ta mới tìm hiểu chương trình chạy như thế nào.
  • Cần học tập để có sự hiểu biết sâu hơn về hệ thống, bạn cần hiểu chính xác thông điệp của hệ thống gửi đến bạn có nghĩa là gì, nó sẽ giúp bạn tìm ra những gì đang xảy ra với source code của bạn.

Tất nhiên để đạt tới tất cả các mục ở trên thì không phải là một việc đơn giản, chúng ta có thể bắt đầu làm từ những việc đơn giản trước như:

  • Sử dụng thật tốt tool debug, watch variable, next step, go into, go finish, Nếu ở dùng visual studio thì có một chức năng rất mạnh là Trace output và go to step.
  • Check kĩ lại môi trường, điều kiện gây ra bug. Lời khuyên ở đây là tìm mọi cách để loại bỏ bớt điều kiện đi trước khi fix bug, -> Giúp chúng ta tập trung vào ít module hơn.
  • Nếu như không tìm được bug, quay lại tìm kiếm ở bước trước nó, các thành phần liên quan xung quanh, check lại mọi giả thuyết của bản thân.
  • Không work around qua bug, khi chưa tìm được nguyên nhân bug, không fix bug hú hóa. Mang tâm lý work around sẽ không giúp chúng ta tiến bộ lên được.
  • Log các thông tin cần thiết ra file
  • Gặp các bug xuất hiện không ổn định thì check log file để tìm hiểu điều kiện đầu vào, đầu ra, error message, trace log.
  • Thay đổi suy nghĩ, fix bug không chỉ đơn giản là sửa chữa các bug mà còn là học hỏi từ bug, có tinh thần tốt, bản lĩnh vững vàng không chấp nhận lùi bước.

Trình bày về bug với một ai đó, giúp chúng ta tổ chức, xắp xếp lại cách thức source code làm việc.