Computer >> Máy Tính >  >> Lập trình >> C ++

Làm thế nào để tìm lỗi phân đoạn trong C &C ++? (Sử dụng GDB)

Lỗi phân đoạn là một trong những lỗi thời gian chạy, được gây ra do vi phạm quyền truy cập bộ nhớ, như truy cập chỉ mục mảng không hợp lệ, trỏ một số địa chỉ bị hạn chế, v.v. Trong bài viết này, chúng ta sẽ thấy cách phát hiện loại lỗi này bằng công cụ GDB .

Hãy cho chúng tôi xem mã và các bước tương ứng để xác định lỗi.

Ví dụ

 #include  main () {int * ptr =NULL; * ptr =1; // cố gắng truy cập vị trí bộ nhớ không xác định printf ("% p \ n", ptr);} 

Biên dịch mã bằng cách sử dụng ‘gcc –g program_name.c’ và chạy bằng cách sử dụng ‘./a.out’

Đầu ra

 soumyadeep @ soumyadeep-VirtualBox:~ / Cpp_progs $ ./a.out Lỗi phân đoạn (đã kết xuất lõi) 

Đã xảy ra lỗi phân đoạn.

Viết 'gdb ./a.out core'

 soumyadeep @ soumyadeep-VirtualBox:~ / Cpp_progs $ gdb ./a.out coreGNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-gitCopyright (C) 2018 Free Software Foundation, Inc.License GPLv3 +:GNU GPL phiên bản 3 hoặc sau  Đây là phần mềm miễn phí:bạn có thể tự do thay đổi và phân phối lại nó. KHÔNG CÓ BẢO HÀNH, trong phạm vi pháp luật cho phép. Nhập "hiển thị sao chép" và "hiển thị bảo hành" để biết chi tiết. GDB này được định cấu hình là "x86_64-linux-gnu". Nhập "hiển thị cấu hình" để biết chi tiết cấu hình. Để biết hướng dẫn báo cáo lỗi, vui lòng xem:.Tìm hướng dẫn sử dụng GDB và các nguồn tài liệu khác trực tuyến tại:. Để được trợ giúp, hãy nhập "help". Nhập "apropos word" để tìm kiếm các lệnh liên quan đến "word" ... Đọc ký hiệu từ ./a.out...done./home/soumyadeep/Cpp_progs/core:Không có tệp hoặc thư mục nào như vậy. (Gdb)  

Nhập ‘r’ và nhấn enter.

 Khởi động chương trình:/home/soumyadeep/Cpp_progs/a.out Chương trình nhận được tín hiệu SIGSEGV, Lỗi phân đoạn.0x000055555555465e trong main () tại 1230.find_seg_error.c:55 * ptr =1; // cố gắng truy cập vị trí bộ nhớ không xác định (gdb) 

Vậy là chúng ta đã sửa lỗi thành công, bây giờ hãy thoát khỏi GDB

 (gdb) thoát Một phiên gỡ lỗi đang hoạt động. Inferior 1 [process 2794] sẽ bị loại bỏ. Bạn vẫn tiếp tục hoạt động? (y hoặc n) y