Làm thế nào để sửa đổi nội dung bộ nhớ bằng GDB?


87

Tôi biết rằng chúng ta có thể sử dụng một số lệnh để truy cập và đọc bộ nhớ: ví dụ: print, p, x ...

Nhưng làm thế nào tôi có thể thay đổi nội dung của bộ nhớ tại bất kỳ vị trí cụ thể nào (trong khi gỡ lỗi trong GDB)?


Câu trả lời:


124

Cách dễ nhất là đặt một biến chương trình (xem GDB: gán ):

(gdb) l
6       {
7           int i;
8           struct file *f, *ftmp;
9
(gdb) set variable i = 10
(gdb) p i
$1 = 10

Hoặc bạn chỉ có thể cập nhật vị trí tùy ý (có thể ghi) theo địa chỉ:

(gdb) set {int}0x83040 = 4

Còn nữa. Đọc hướng dẫn sử dụng .


4
Tôi có cần đặt một biến chương trình TRƯỚC KHI truy cập các vị trí bộ nhớ tùy ý không? Tôi không thể chạy lệnh thiết lập thứ hai ngay lập tức?
Spidey

cũng set (str[6]) = 'c'hoạt động, trong trường hợp bạn có một mảng, nhưchar str[]
xealits

29

Như Nikolai đã nói, bạn có thể sử dụng lệnh gdb 'set' để thay đổi giá trị của một biến.

Bạn cũng có thể sử dụng lệnh 'set' để thay đổi vị trí bộ nhớ. ví dụ. Mở rộng ví dụ của Nikolai:

(gdb) l
6       {
7           int i;
8           struct file *f, *ftmp;
9
(gdb) set variable i = 10
(gdb) p i
$1 = 10

(gdb) p &i
$2 = (int *) 0xbfbb0000
(gdb) set *((int *) 0xbfbb0000) = 20
(gdb) p i
$3 = 20

Điều này sẽ hoạt động đối với bất kỳ con trỏ hợp lệ nào và có thể được truyền sang bất kỳ kiểu dữ liệu thích hợp nào.


set {char[100]}(0x00) = ""Xóa 100 byte bộ nhớ tại địa chỉ 0x00
davenpcj

16

Mở rộng các câu trả lời được cung cấp ở đây.

Bạn chỉ có thể thực hiện set idx = 1để đặt một biến, nhưng cú pháp đó không được khuyến khích vì tên biến có thể xung đột với lệnh con đã đặt. Như một ví dụ set w=1sẽ không hợp lệ.

Điều này có nghĩa là bạn nên thích cú pháp: set variable idx = 1hoặc set var idx = 1.

Cuối cùng nhưng không kém phần quan trọng, bạn chỉ có thể sử dụng lệnh in cũ đáng tin cậy của mình, vì nó đánh giá một biểu thức. Sự khác biệt duy nhất là anh ta cũng in kết quả của biểu thức.

(gdb) p idx = 1
$1 = 1

Bạn có thể đọc thêm về gdb tại đây .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.