태그 보관물: gdb

gdb

GDB에서 현재 어셈블리 명령어 표시 있습니다. 현재 소스 라인을 표시하는

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

0x0001433f      990         Foo::bar(p);

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



답변

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)


답변

넌 할 수있어

display/i $pc

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

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


답변

명령

x/i $pc

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


답변

다음 옵션 설정 :

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


답변

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

display /3i $pc

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

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


답변

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

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

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

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

스크린 샷보기


답변

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

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

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

관련 질문 :