Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Tìm lỗi Segmentation Fault trong C/C++ bằng GDB

Segmentation Fault (lỗi phân đoạn) là lỗi runtime phổ biến do truy cập bộ nhớ không hợp lệ: giải phóng con trỏ null, truy xuất mảng vượt chỉ số, truy cập vùng nhớ đã free, stack overflow...

Công cụ: GDB (GNU Debugger)

GDB cho phép dừng chương trình tại điểm lỗi, xem stack trace, giá trị biến, và dòng code gây lỗi.

Quy trình debug

1. Biên dịch với symbol debug

gcc -g ten_file.c -o ten_chuong_trinh
# Hoặc g++ -g ten_file.cpp -o ten_chuong_trinh

Cờ -g nhúng thông tin debug (số dòng, tên biến) vào file thực thi.

2. Chạy chương trình để sinh core dump (tùy chọn)

ulimit -c unlimited  # Cho phép tạo core dump (chỉ cần một lần/session)
./ten_chuong_trinh
# Segmentation fault (core dumped)

3. Khởi động GDB

Cách 1: Debug trực tiếp (khuyên dùng)

gdb ./ten_chuong_trinh
(gdb) run

Cách 2: Phân tích core dump

gdb ./ten_chuong_trinh core

4. Khi GDB dừng tại lỗi

Program received signal SIGSEGV, Segmentation fault.
0x000055555555465e in main () at ten_file.c:5
5       *ptr = 1; // trying to access unknown memory location
  • Dòng at ten_file.c:5 chỉ chính xác file và dòng gây lỗi.
  • Lệnh bt (backtrace) hiển thị call stack.
  • Lệnh print ptr xem giá trị con trỏ (sẽ là 0x0 / NULL).

Ví dụ code gây lỗi

#include <stdio.h>

int main() {
    int* ptr = NULL;
    *ptr = 1; // Lỗi: ghi vào địa chỉ 0 (NULL)
    printf("%p\n", ptr);
    return 0;
}

Phiên làm việc GDB thực tế

$ gcc -g segfault.c -o segfault
$ gdb ./segfault
(gdb) run
Starting program: /home/user/segfault

Program received signal SIGSEGV, Segmentation fault.
0x000055555555465e in main () at segfault.c:5
5       *ptr = 1; // trying to access unknown memory location
(gdb) bt
#0  0x000055555555465e in main () at segfault.c:5
(gdb) print ptr
$1 = (int *) 0x0
(gdb) quit

Các lệnh GDB hữu ích

LệnhChức năng
run [args]Chạy chương trình
break file:lineĐặt breakpoint
next / stepStep over / step into
print exprIn giá trị biến/biểu thức
btStack trace
info localsXem biến cục bộ
continueTiếp tục chạy
quitThoát GDB

Lưu ý

    Luôn biên dịch với -g khi debug.
  • Core dump cần ulimit -c unlimited và quyền ghi thư mục hiện tại.
  • Valgrind (valgrind --tool=memcheck ./prog) mạnh hơn cho lỗi bộ nhớ phức tạp (memory leak, use-after-free...).

GDB là công cụ bắt buộc phải biết khi lập trình C/C++ trên Linux. Nắm vững nó sẽ tiết kiệm hàng giờ debug mù.