2014-05-05 18 views
6

Vì vậy, tôi đang cố gắng để gỡ lỗi một số mã và tất cả tôi có là thực thi. Tôi biết rằng một thanh ghi có chứa địa chỉ của những gì cần biết. Có cách nào tôi có thể in ra các giá trị hex từ đầu của địa chỉ đó đến một độ dài nhất định?dereferencing đăng ký gdb

điều tôi đã cố gắng:

x/s $ebp 
p (char) ($ebp) 
p (char) (*ebp >> 4) 
p (char)*(%ebp 4) 
p $($ebp) 
p $(%ebp + $0x1) 

Có bình thường con trỏ số học không làm việc với thanh ghi? có nghĩa là gì khi nó nói "lịch sử là trống

+0

Liên quan: http://stackoverflow.com/questions/12758217/printing-string-pointed-to-from-register-in-gdb –

Trả lời

7

Lệnh x sẽ là cách dễ nhất để hiển thị giá trị trong bộ nhớ Hãy thử, ví dụ:.

(gdb) x/32b $ebp 

Nếu điều này không làm việc (đặc biệt nếu bạn nhận được lỗi "giá trị không thể được chuyển đổi thành số nguyên"), có thể bạn đang gỡ lỗi thực thi 64 bit. Các thanh ghi x86-64 có các tên khác nhau, thay vào đó hãy sử dụng $rbp. trong lệnh x kiểm soát số lượng giá trị được hiển thị và định dạng nào được sử dụng.sẽ cố gắng đọc một chuỗi từ địa chỉ đó, chẳng hạn. Nếu bạn không sử dụng bất cứ điều gì, gdb sẽ sử dụng bất cứ điều gì bạn sử dụng lần cuối.

Trong khi nó không phải là thực sự cần thiết để trả lời câu hỏi của bạn, tôi đã cố định lên một số lệnh khác mà bạn đang cố gắng để chạy:

p *((char *) $ebp)  <- treat $ebp as a character pointer and display what it points to 
p *((char *) $ebp + 4) <- with an offset 
p ((char *) $ebp)[4]  <- same thing as above, except using array syntax 

Nhân vật $ chỉ cần thiết khi đề cập đến đăng ký, hoặc biến gdb. Bạn không cần nó cho bất cứ điều gì khác.