GDB에서 레지스터 값을 인쇄하는 방법은 무엇입니까?


191

%eax및 의 값을 어떻게 인쇄 %ebp합니까?

(gdb) p $eax
$1 = void

8
사용은 layout reg이전 명령에 의해 변경 사람 (들)을 강조, 모든 정수 플래그 레지스터의 테이블을 보여 GDB해야합니다. 예를 들어 stackoverflow.com/tags/x86/info 를 참조하십시오 .
Peter Cordes

답변:


232

info registers모든 레지스터를 보여줍니다. info registers eax레지스터 만 표시합니다 eax. 이 명령은 다음과 같이 축약 될 수 있습니다i r


나는 얻는다 : 유효하지 않은 레지스터`% eax '그리고 만약 내가 "정보 레지스터"를하면 eax는 나타나지 않는다. 그러나 EXC_BAD_ACCESS 신호가 다음 명령으로 생성 된 IDE에서 코드 어셈블리를보고 있습니다. test % eax, % eax gdb를 실행하는 XCode에 있습니다. gdb가 eax 레지스터를보고하지 않는 이유는 무엇입니까?
NoahR

1
같은 문제 : % eax가 코드에 있지만 print $ eax는 void로 표시됩니다.
Ruslan Yushchenko

5
브리짓의 대답이 저에게 효과적입니다. geekosaur의 대답은 대부분 옳지 만 % 기호를 생략해야하므로 특정 레지스터의 명령은 info registers eax입니다. 그래도 이것이 다른 버전의 gdb와 다른지 확실하지 않습니다.
Kevin

lldb에 대해서도 같은 내용을 찾고 있었으므로 다음과 같이 설명하겠습니다. lldb의 경우 명령은register read [eax]
holgac

코드를 단계별로 진행하면서 레지스터 값을 계속 표시하려면 사용할 수 있습니다 display. 예를 들어 display $eax.
srgsanky

50

GDB에서 특정 레지스터를 인쇄하려는 경우 % 기호를 생략해야합니다. 예를 들어

info registers eip

실행 파일이 64 비트이면 레지스터는 r로 시작합니다. e로 시작하는 것은 유효하지 않습니다.

info registers rip

그것들은 다음과 같이 축약 될 수 있습니다 :

i r rip

37

도 있습니다:

info all-registers

그러면 원하는 레지스터 이름을 얻을 수 있습니다. ARM의 NEON Q ...와 같은 플랫폼 별 레지스터를 찾는 데 매우 유용합니다.


3
이 :-) 내가 존재를 몰랐 레지스터에 대해 수 가르쳐
치로 틸리가郝海东冠状病六四事件法轮功

1
내 컴퓨터에서이 인쇄 eax, ecx및 기타 표준 레지스터에 의해 숨겨진 info registers. 이것은 아마도 대답이 될 것입니다.
EntangledLoops

15
  • 한 번만 확인하려면 info registers레지스터를 표시하십시오.
  • 예를 들어 하나의 레지스터 만 감시하려면 display $espgdb 명령 행에 esp 레지스터를 계속 표시하십시오.
  • 모든 레지스터를보고 싶다면 layout regsTUI 모드로 계속해서 레지스터를 표시하십시오.

12

GDB 명령 :

  • i r <register_name>: 예를 들어, 하나의 레지스터를 인쇄 i r rax,i r eax
  • i r <register_name_1> <register_name_2> ...: 예를 들어, 여러 개의 레지스터를 인쇄 i r rdi rsi,
  • i r: 부동 소수점 및 벡터 레지스터 (xmm, ymm, zmm)를 제외한 모든 레지스터를 인쇄합니다.
  • i r a: 모든 레지스터를 인쇄하고 부동 소수점 및 벡터 레지스터를 포함합니다 (xmm, ymm, zmm).
  • i r f: 모든 FPU 부동 레지스터를 인쇄합니다 ( st0-7및 기타 몇 개 f*).

a( all) 및 f( float) 이외의 다른 레지스터 그룹 은 다음을 통해 찾을 수 있습니다.

maint print reggroups

:에 설명 된대로 https://sourceware.org/gdb/current/onlinedocs/gdb/Registers.html#Registers

:

  • xmm0~ xmm15는 128 비트이며 거의 모든 현대 컴퓨터에 있습니다. 1999 년에 출시되었습니다.
  • ymm0~ ymm15, 256 비트, 새로운 기계는 보통 그것을 가지고, 그들은 2011 년에 발표했다.
  • zmm0~ zmm31, 512 비트, 일반 PC에는 아마도 ( 2016 년 ), 2013 년에 출시되어 주로 서버에서 사용됩니다.
  • xmm / ymm / zmm의 일련 번호는 서로 다른 모드에서 동일한 레지스터이기 때문에 표시됩니다. 내 컴퓨터에는 ymm이 표시됩니다.

6

p $eax GDB 7.7.1부터 작동

GDB 7.7.1부터 시도한 명령이 작동합니다.

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

이 구문은 부동 소수점 또는 정수일 수있는 ARM 부동 소수점 레지스터와 같은 다른 공용체 멤버 중에서 선택하는 데에도 사용할 수 있습니다.

p $s0.f
p $s0.u

에서 워드 프로세서 :

사전 정의 된 머신 특정 레지스터 이름 중 하나가 아닌 경우 '$'가 앞에 오는 모든 이름을 편의 변수로 사용할 수 있습니다.

그리고 :

표현식에서 기계 레지스터 내용을 '$'로 시작하는 이름을 가진 변수로 참조 할 수 있습니다. 레지스터 이름은 기계마다 다릅니다. 정보 레지스터를 사용하여 컴퓨터에서 사용 된 이름을 봅니다.

그러나 지금까지 제어 레지스터는 그리 운이 없었습니다. OSDev 2012 http://f.osdev.org/viewtopic.php?f=1&t=25968 || 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

ARM 부동 소수점 레지스터

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


2
$구문 을 사용하여 표현식에서 레지스터를 사용할 수있는 것이 좋습니다 .
remcycles
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.