Làm thế nào để in giá trị đăng ký trong GDB?


191

Làm thế nào để tôi in giá trị của %eax%ebp?

(gdb) p $eax
$1 = void

8
Sử dụng layout regđể có gdb hiển thị một bảng gồm tất cả các thanh ghi số nguyên và cờ, làm nổi bật một (các) thay đổi theo hướng dẫn trước đó. Xem stackoverflow.com/tags/x86/info chẳng hạn.
Peter Cordes

Câu trả lời:


231

info registershiển thị tất cả các thanh ghi; info registers eaxchỉ hiển thị đăng ký eax. Lệnh có thể được viết tắt lài r


Tôi nhận được: Đăng ký không hợp lệ `% eax 'Và nếu tôi chỉ làm" đăng ký thông tin "thì eax không hiển thị. Tuy nhiên, tôi đang xem tập hợp mã của mình trong IDE nơi tín hiệu EXC_BAD_ACCESS đã được tạo với hướng dẫn: test% eax,% eax Đây là trong XCode chạy gdb. Tại sao gdb không báo cáo đăng ký eax?

1
Vấn đề tương tự:% eax có trong mã, nhưng in $ eax hiển thị khoảng trống.
Ruslan Yushchenko

5
Câu trả lời của Bridgette làm việc cho tôi. Câu trả lời của geekizard hầu hết là đúng, nhưng bạn cần bỏ qua dấu%, vì vậy lệnh cho một thanh ghi cụ thể là info registers eax. Tôi không chắc chắn nếu điều này là khác nhau cho các phiên bản khác nhau của gdb, mặc dù.
Kevin

Tôi đã tìm kiếm điều tương tự cho lldb, vì vậy tôi xin lưu ý rằng: đối với lldb, lệnh làregister read [eax]
holgac

Nếu bạn muốn hiển thị các giá trị đăng ký liên tục khi bạn bước qua mã bạn có thể sử dụng display. Ví dụ display $eax.
srssanky

50

Nếu bạn đang cố in một thanh ghi cụ thể trong GDB, bạn phải bỏ qua dấu%. Ví dụ,

info registers eip

Nếu tệp thực thi của bạn là 64 bit, các thanh ghi bắt đầu bằng r. Bắt đầu với e là không hợp lệ.

info registers rip

Chúng có thể được viết tắt là:

i r rip

37

Ngoài ra còn có:

info all-registers

Sau đó, bạn có thể nhận được tên đăng ký mà bạn quan tâm - rất hữu ích để tìm các thanh ghi dành riêng cho nền tảng (như NEON Q ... trên ARM).


3
Điều này được dạy về các thanh ghi mà tôi không biết tồn tại :-)
Ciro Santilli 郝海东 冠状 病 六四

1
Trên máy tính của tôi, bản in này eax, ecxvà đăng ký tiêu chuẩn khác ẩn bởi info registers. Đây có lẽ nên là câu trả lời được chấp nhận.
EntangledLoops

15
  • Nếu chỉ muốn kiểm tra nó một lần, info registershiển thị các thanh ghi.
  • Nếu chỉ muốn xem một thanh ghi, ví dụ, display $esptiếp tục hiển thị các thanh ghi đặc biệt trong dòng lệnh gdb.
  • Nếu muốn xem tất cả các thanh ghi, layout regstiếp tục hiển thị các thanh ghi, với chế độ TUI.

12

Các lệnh của Btb :

  • i r <register_name>: In một thanh ghi duy nhất, ví dụ i r rax,i r eax
  • i r <register_name_1> <register_name_2> ...: In nhiều đăng ký, ví dụ i r rdi rsi,
  • i r: in tất cả các thanh ghi trừ dấu phẩy động & thanh ghi vector (xmm, ymm, zmm).
  • i r a: in tất cả các thanh ghi, bao gồm thanh ghi dấu phẩy động & dấu phẩy động (xmm, ymm, zmm).
  • i r f: in tất cả các thanh ghi nổi FPU ( st0-7và một vài cái khác f*)

Các nhóm đăng ký khác ngoài a( all) và f( float) có thể được tìm thấy với:

maint print reggroups

như tài liệu tại: https://sourceware.org/gdb/cản/onlinesocs/gdb/Registers.html#Registers

Mẹo :

  • xmm0~ xmm15, là 128 bit, hầu hết mọi máy hiện đại đều có nó, chúng được phát hành vào năm 1999.
  • ymm0~ ymm15, là 256 bit, máy mới thường có nó, chúng được phát hành vào năm 2011.
  • zmm0~ zmm31, là 512 bit, máy tính bình thường có thể không có nó ( như năm 2016 ), chúng được phát hành vào năm 2013 và chủ yếu được sử dụng trong các máy chủ cho đến nay.
  • Chỉ một chuỗi xmm / ymm / zmm sẽ được hiển thị, bởi vì chúng là các thanh ghi giống nhau trong chế độ khác nhau. Trên máy của tôi ymm được hiển thị.

6

p $eax hoạt động như của GDB 7.7.1

Kể từ GDB 7.7.1, lệnh bạn đã thử hoạt động:

set $eax = 0
p $eax
# $1 = 0
set $eax = 1
p $eax
# $2 = 1

Cú pháp này cũng có thể được sử dụng để chọn giữa các thành viên hợp nhất khác nhau, ví dụ như các thanh ghi dấu phẩy động ARM có thể là dấu phẩy động hoặc số nguyên:

p $s0.f
p $s0.u

Từ các tài liệu :

Bất kỳ tên nào đứng trước '$' đều có thể được sử dụng cho một biến tiện lợi, trừ khi đó là một trong những tên đăng ký cụ thể của máy được xác định trước.

:

Bạn có thể tham khảo nội dung đăng ký máy, theo biểu thức, dưới dạng các biến có tên bắt đầu bằng '$'. Tên của các thanh ghi là khác nhau cho mỗi máy; sử dụng các thanh ghi thông tin để xem tên được sử dụng trên máy của bạn.

Nhưng tôi chưa gặp nhiều may mắn với các thanh ghi điều khiển cho đến nay: OSDev 2012 http://f.osdev.org/viewtopic.php?f=1&t=25968 || Yêu cầu tính năng năm 2005 https://www.sourceware.org/ml/gdb/2005-03/msg00158.html || alt.lang.asm 2013 https://groups.google.com/forum/#!topic/alt.lang.asm/JC7YS3Wu31I

Thanh ghi dấu phẩy động ARM

Xem: /reverseengineering/8992/floating-point-registers-on-arm/20623#20623


2
Thật tuyệt khi có thể sử dụng các thanh ghi trong biểu thức với $cú pháp này .
xe má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.