GDB에서 현재 어셈블리 명령어 표시


179

GDB에서 어셈블리 수준 디버깅을하고 있습니다. 현재 소스 라인을 표시하는 것과 같은 방식으로 GDB가 현재 어셈블리 명령을 표시하는 방법이 있습니까? 모든 명령 후 기본 출력은 다음과 같습니다.

0x0001433f      990         Foo::bar(p);

이것은 현재 명령의 주소를 제공하지만 disassemble현재 실행중인 명령을 보려면 출력을 계속 참조해야합니다 .


답변:


314

GDB에서 어셈블리 레이아웃으로 전환 할 수 있습니다 :

(gdb) layout asm

자세한 내용은 여기 를 참조하십시오. 현재 어셈블리 명령어가 어셈블러 창에 표시됩니다.

   ┌───────────────────────────────────────────────────────────────────────────┐
   │0x7ffff740d756 <__libc_start_main+214>  mov    0x39670b(%rip),%rax        #│
   │0x7ffff740d75d <__libc_start_main+221>  mov    0x8(%rsp),%rsi              │
   │0x7ffff740d762 <__libc_start_main+226>  mov    0x14(%rsp),%edi             │
   │0x7ffff740d766 <__libc_start_main+230>  mov    (%rax),%rdx                 │
   │0x7ffff740d769 <__libc_start_main+233>  callq  *0x18(%rsp)                 │
  >│0x7ffff740d76d <__libc_start_main+237>  mov    %eax,%edi                   │
   │0x7ffff740d76f <__libc_start_main+239>  callq  0x7ffff7427970 <exit>       │
   │0x7ffff740d774 <__libc_start_main+244>  xor    %edx,%edx                   │
   │0x7ffff740d776 <__libc_start_main+246>  jmpq   0x7ffff740d6b9 <__libc_start│
   │0x7ffff740d77b <__libc_start_main+251>  mov    0x39ca2e(%rip),%rax        #│
   │0x7ffff740d782 <__libc_start_main+258>  ror    $0x11,%rax                  │
   │0x7ffff740d786 <__libc_start_main+262>  xor    %fs:0x30,%rax               │
   │0x7ffff740d78f <__libc_start_main+271>  callq  *%rax                       │
   └───────────────────────────────────────────────────────────────────────────┘
multi-thre process 3718 In: __libc_start_main     Line: ??   PC: 0x7ffff740d76d
#3  0x00007ffff7466eb5 in _IO_do_write () from /lib/x86_64-linux-gnu/libc.so.6
#4  0x00007ffff74671ff in _IO_file_overflow ()
   from /lib/x86_64-linux-gnu/libc.so.6
#5  0x0000000000408756 in ?? ()
#6  0x0000000000403980 in ?? ()
#7  0x00007ffff740d76d in __libc_start_main ()
   from /lib/x86_64-linux-gnu/libc.so.6
(gdb)

1
@ greatwolf, gdb에서 tui 지원이없는 것 같습니다. 자세한 내용은이 질문을 참조하십시오 : stackoverflow.com/q/6706838/72178 .
ks1322

9
산뜻한! 이제 레지스터와 비슷한 창을 가질 수 있습니까? 실제로 :layout regs
Jens

정수 reg 대신 벡터 reg를 표시하는 것과 같은 다른 TUI 명령에 대해서는 gdb 문서 도 참조하십시오 tui reg vector. (그렇지만 항상 .v8_int16무언가 를 선택할 수 없기 때문에 항상 유용하지는 않기 때문에 디스플레이가 엉망입니다.) x86 태그 위키 를 참조하여 asm 디버깅에 대한 빠른 자습서를 참조하십시오 .
Peter Cordes

그것은 쓸모없는 기능과 출력에 관한 것입니다. C ++ 맹 글링 된 이름이 너무 길어서 내가 보려고하는 모든 것이 화면 오른쪽에 있습니다. 멍청한 결정 (기본적으로 ASM을 표시하지 않음 si)과 쓸모없는 기능 (필요한 정보를 표시하지 않는 뷰포트) 당신이 메신저
뿐이므로이

1
마찬가지로 ·layout src디버깅 할 때 소스 코드를 확인하고이 모드를 종료하여 기억할만한 가치가 있음CTRL+x+a
Baiyan Huang

149

넌 할 수있어

display/i $pc

GDB가 중지 할 때마다 다음 명령어의 디스 어셈블리가 표시됩니다.

GDB-7.0또한 set disassemble-next-line on다음 행 전체를 분해하고 더 많은 분해 컨텍스트를 제공하는을 지원합니다.


1
사용시 si(이 아닌 s) 이 기능을 어떻게 활성화 합니까?
jww

54

명령

x/i $pc

일반적인 구성 메커니즘을 사용하여 항상 실행되도록 설정할 수 있습니다.


29
그리고 x/ni $pc다음 n 명령을 보는 것이 종종 유용합니다.
Stephen Canon

48

다음 옵션 설정 :

set  disassemble-next-line on
show disassemble-next-line

다음과 같은 결과가 나타납니다.

(gdb) stepi
0x000002ce in ResetISR () at startup_gcc.c:245
245 {
   0x000002cc <ResetISR+0>: 80 b5   push    {r7, lr}
=> 0x000002ce <ResetISR+2>: 82 b0   sub sp, #8
   0x000002d0 <ResetISR+4>: 00 af   add r7, sp, #0
(gdb) stepi
0x000002d0  245 {
   0x000002cc <ResetISR+0>: 80 b5   push    {r7, lr}
   0x000002ce <ResetISR+2>: 82 b0   sub sp, #8
=> 0x000002d0 <ResetISR+4>: 00 af   add r7, sp, #0

이 옵션이 설치에없는 것 같습니다. 제거 되었습니까?
fuz

2
@fuz 아마 당신의 gdb는 오래되었습니다
tbodt

@ fuz는 우분투 18.04의 GDB 8.1에 적어도 존재합니다.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

매우 유용한 기술
DaSqy STC

1
show disassemble-next-line은 테스트 용이며 플래그 상태를 인쇄 또는 해제합니다.
Sam

30

프로그램을 단계별로 실행하는 동안 다음 몇 가지 명령이 자동으로 표시 되도록하려면 다음과 같이 표시 명령을 사용할 수 있습니다.

display /3i $pc

위의 내용은 중단 점에 도달하거나 프로그램을 한 단계 씩 수행 할 때마다 3 가지 명령을 표시합니다.

블로그 항목에 대한 자세한 내용은 여기를 참조하십시오 .


23

gdb 내에서를 누르면 Ctrl x 2화면이 3 부분으로 나뉩니다.

첫 번째 부분에서는 일반 코드를 고급 언어로 보여줍니다.

두 번째는 해당하는 어셈블리를 보여줍니다. instruction Pointer .

셋째, gdb명령을 입력하라는 일반적인 프롬프트가 표시됩니다.

스크린 샷보기


로 시작할 수 없지만 모드 Ctrl-X 2처럼 보입니다 gdb -tui.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

7
이것은 또한 layout splitgdb 프롬프트에서 접근 할 수 있습니다.
chucksmash

22

GDB 대시 보드

https://github.com/cyrus-and/gdb-dashboard

이 GDB 구성은 공식 GDB Python API를 사용하여 예를 들어 GDB가 멈출 때마다 원하는 것을 보여줍니다. next TUI와 같이 .

그러나이 구현이 내장 GDB TUI 모드에 대한보다 강력하고 구성 가능한 대안이라는 것을 알았습니다. 코드가있는 gdb split view

예를 들어 다음과 같이 디스 어셈블리, 소스, 레지스터 및 스택을 표시하도록 GDB 대시 보드를 구성 할 수 있습니다.

dashboard -layout source assembly registers stack

사용 가능한 모든보기를 대신 활성화하면 다음과 같이됩니다.

여기에 이미지 설명을 입력하십시오

관련 질문 :


1
@ downvoters : 정보를 배우고 향상시킬 수 있도록 설명하십시오. 나는 이것이 TUI 현재 허용 대답에 대한 우수한 대안이라고 생각 : stackoverflow.com/a/2015523/895245이
치로 틸리郝海东冠状病六四事件法轮功
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.