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)?
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:
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 .
set (str[6]) = 'c'
hoạt động, trong trường hợp bạn có một mảng, nhưchar str[]
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
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=1
sẽ 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 = 1
hoặ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 .