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:5chỉ chính xác file và dòng gây lỗi. - Lệnh
bt(backtrace) hiển thị call stack. - Lệnh
print ptrxem 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ệnh | Chức năng |
|---|---|
run [args] | Chạy chương trình |
break file:line | Đặt breakpoint |
next / step | Step over / step into |
print expr | In giá trị biến/biểu thức |
bt | Stack trace |
info locals | Xem biến cục bộ |
continue | Tiếp tục chạy |
quit | Thoát GDB |
Lưu ý
- Core dump cần
ulimit -c unlimitedvà 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...).
-g khi debug.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ù.