Có hai bộ ký hiệu mà gdb sử dụng.
Tập hợp -g là các biểu tượng gỡ lỗi, giúp mọi thứ dễ dàng hơn nhiều khi chúng cho phép bạn xem mã của bạn và xem các biến trong khi gỡ lỗi.
Một bộ biểu tượng khác được bao gồm theo mặc định khi bạn biên dịch. Đây là những biểu tượng liên kết và sống trong bảng biểu ELF (biểu mẫu có thể liên kết có thể thực hiện được). Điều này chứa thông tin ít hơn rất nhiều so với các biểu tượng gỡ lỗi, nhưng chứa những thứ quan trọng nhất, chẳng hạn như địa chỉ của những thứ trong tệp thực thi của bạn (hoặc thư viện hoặc tệp đối tượng). Nếu không có thông tin này, gdb thậm chí sẽ không biết chính ở đâu, vì vậy (gdb) break main
sẽ không thành công.
Nếu bạn không có biểu tượng gỡ lỗi (-g) thì bạn vẫn có thể (gdb) break main
nhưng gdb sẽ không có bất kỳ khái niệm nào về các dòng mã trong tệp nguồn của bạn. Khi bạn cố gắng bước qua mã, bạn sẽ chỉ tiến một lệnh máy tại một thời điểm, thay vì một dòng tại một thời điểm.
Lệnh dải thường được sử dụng để strip
tắt các ký hiệu từ tệp thực thi (hoặc tệp đối tượng khác). Điều này thường được sử dụng nếu bạn không muốn ai đó có thể nhìn thấy biểu tượng hoặc nếu bạn muốn tiết kiệm dung lượng trong tệp. Biểu tượng bảng có thể nhận được lớn. Dải loại bỏ cả hai biểu tượng gỡ lỗi và các biểu tượng liên kết, nhưng nó có một số thiết bị chuyển mạch dòng lệnh có thể giới hạn những gì nó loại bỏ.
Nếu bạn chạy lệnh file
trên chương trình của mình, một trong những điều nó sẽ cho bạn biết là thời tiết hoặc không thực thi được đã bị xóa.
$ gcc my_prog.c -o my_prog
$ file my_prog
my_prog: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped
$ strip my_prog
my_prog: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped
$
Bạn có nghĩa là gdb không thể được sử dụng để gỡ lỗi programe arbitary? – user198729
@ user198729: Bạn có thể sử dụng GDB để gỡ lỗi chương trình tùy ý, nhưng bạn phải làm việc chăm chỉ hơn nhiều nếu chương trình không có bảng biểu tượng. Về cơ bản, bảng biểu tượng cho trình gỡ rối biết về các hàm và các biến và số dòng và các tệp nguồn - và nếu nó bị thiếu, tất cả những gì bạn đã để lại là trình biên dịch. –
@ Jonathan Leffler, có vẻ như bạn có nghĩa là vẫn có thể gỡ lỗi chương trình ngay cả khi nó không có bảng biểu tượng, bạn có thể đưa ra một ví dụ không? – user198729