GNU Debugger được sử dụng để gỡ lỗi một chương trình, để phân tích sự cố hoặc để xem chương trình làm gì tại một điểm cụ thể. Nó được phát triển bởi Dự án GNU vào những năm 1980 và là một trong những trình gỡ lỗi dòng lệnh được sử dụng rộng rãi nhất cũng như là một trong những phần mềm GNU phổ biến nhất.
Đầu tiên chúng ta hãy viết một chương trình C nhỏ mà sau đó chúng ta sẽ gỡ lỗi. Để bắt đầu, hãy tạo một .C
sử dụng tập tin khí lực
hoặc bất kỳ trình soạn thảo nào bạn chọn:
vim test.c
Tạo chương trình C sau:
#include int main () {int i = 5; float f = 5.5 i = i + 3; f = f + 2,2; printf ("Giá trị của i và f là:% d và% f \ n", i, f); trả về 0; }
nhấn Thoát khỏi
để chuyển đến chế độ lệnh vim. Sau đó gõ : wq
để lưu chương trình và thoát.
Biên dịch và xem chương trình có chạy không:
gcc test.c -o test ./test Giá trị của i và f là: 8 và 7.700000
Để bật hỗ trợ gỡ lỗi trong một chương trình, chúng tôi biên dịch nó với -g
lá cờ. Nếu cờ không được sử dụng, người dùng vẫn có thể gỡ lỗi chương trình, mặc dù với các tùy chọn hạn chế.
gcc test.c -g -o test
Để bắt đầu gỡ lỗi tệp thực thi của chúng tôi kiểm tra
trong gdb
, chúng ta chạy:
kiểm tra gdb
Nó sẽ mở ra gdb
bảng điều khiển, nơi bạn có thể nhập gdb
các lệnh. Để xem danh sách các lệnh, hãy sử dụng Cứu giúp
yêu cầu.
$ (gdb) help Danh sách các lớp lệnh: bí danh - Bí danh của các lệnh khác ngắt điểm - Làm cho chương trình dừng lại ở dữ liệu điểm nhất định - Kiểm tra tệp dữ liệu - Chỉ định và kiểm tra tệp nội bộ - Lệnh bảo trì bị che khuất - Ẩn các tính năng đang chạy - Chạy ngăn xếp chương trình - Kiểm tra trạng thái ngăn xếp - Hỗ trợ truy vấn trạng thái - Các điểm theo dõi phương tiện hỗ trợ - Theo dõi quá trình thực thi chương trình mà không dừng chương trình do người dùng định nghĩa - Các lệnh do người dùng định nghĩa Nhập "trợ giúp" theo sau là tên lớp cho danh sách các lệnh trong lớp đó. Nhập "help all" cho danh sách tất cả các lệnh. Gõ "help" theo sau là tên lệnh để có tài liệu đầy đủ. Gõ "apropos word" để tìm kiếm các lệnh liên quan đến "word". Cho phép viết tắt tên lệnh nếu rõ ràng.
Sau đó bạn có thể gõ class_name trợ giúp
để xem các lệnh thuộc lớp đó. Để tìm kiếm lệnh bằng chuỗi con, hãy sử dụng chuỗi con apropos
.
Để đặt điểm ngắt khi chương trình nhập một hàm, chạy:
$ (gdb) ngắt main
Ở đây chúng tôi đặt một điểm ngắt tại chức năng duy nhất trong mã của chúng tôi, tức là chủ yếu
. Sử dụng lệnh chạy
để thực hiện chương trình cho đến điểm ngắt tiếp theo hoặc cho đến khi thoát.
$ (gdb) chạy
Để đặt điểm ngắt tại một vị trí cụ thể trong một hàm, sử dụng:
ngắt * chính + 4
Thao tác này sẽ thiết lập một điểm ngắt ở dòng thứ 4 của hàm main.
Bây giờ, để chuyển qua dòng chương trình sang dòng mã tiếp theo, chỉ cần chạy bươc
yêu cầu.
$ (gdb) bước 5: float f = 5.5;
Để hiển thị nội dung của một biến, chạy trưng bày
.
$ (gdb) hiển thị i 6: i = 5
Để sửa đổi nội dung của một biến, có thể được yêu cầu để phân tích quá trình chạy chương trình theo các giá trị cụ thể của một biến, chạy biến đặt = Biểu thức
.
$ (gdb) đặt biến i = 10 $ (gdb) hiển thị i 7: i = 10
Ở đây, 'Biểu thức' có thể là bất kỳ biểu thức hợp lệ (số học / lôgic) nào. Để đơn giản, chúng tôi chỉ gán một giá trị khác (10) cho biến tôi
.
Để in mã lắp ráp cho chương trình, sử dụng lệnh tên chức năng tháo rời
:
Chỉ sử dụng tháo rời
để in mã hợp ngữ cho toàn bộ chương trình. Lưu ý mũi tên tại một dòng cụ thể trong mã lắp ráp. Nó biểu thị rằng phiên gỡ lỗi hiện đang bị tạm dừng tại vị trí bộ nhớ cụ thể đó (tức là dòng mã đó).
Để chuyển trình gỡ lỗi tại một dòng mã cụ thể, chạy:
$ (gdb) jump * main + 2 Tiếp tục ở 0x400528. Điểm ngắt 2, 0x000000000040052a trong main () tại test.c: 3 3 int main () {1: i = 2: f = 3: h = (void *) 0x0 4: main = {int ()} 0x400526 5: i =
Điều này sẽ làm cho trình gỡ lỗi nhảy vào vị trí bộ nhớ của dòng mã thứ 2 trong chức năng chủ yếu
. Lưu ý rằng ở đây tôi đã chuyển từ vị trí bắt đầu của vị trí chính sang vị trí thứ hai trực tiếp. Do đó, biến tôi
chưa bao giờ được thiết lập, dẫn đến lỗi ném ra trình gỡ lỗi rằng nó không thể truy cập nội dung bộ nhớ tại địa chỉ của biến tôi
.
Đây là một số lệnh cơ bản có thể giúp bạn bắt đầu gỡ lỗi tệp thực thi trong Linux. Chúng tôi hy vọng bạn thấy thông tin trên trang này hữu ích.