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를 사용하여 예를 들어 next
TUI와 같이 GDB가 중지 될 때마다 원하는 것을 표시합니다 .
그러나이 구현이 내장 GDB TUI 모드에 대한보다 강력하고 구성 가능한 대안이라는 것을 알았습니다. 코드가있는 gdb split view
예를 들어 다음과 같이 디스 어셈블리, 소스, 레지스터 및 스택을 표시하도록 GDB 대시 보드를 구성 할 수 있습니다.
dashboard -layout source assembly registers stack
사용 가능한 모든보기를 대신 활성화하면 다음과 같이 나타납니다.
참고 URL : https://stackoverflow.com/questions/1902901/show-current-assembly-instruction-in-gdb
'Programing' 카테고리의 다른 글
밀리 초를“hh : mm : ss”형식으로 변환하는 방법은 무엇입니까? (0) | 2020.05.31 |
---|---|
adb가 내 장치 / 전화를 찾지 못했습니다 (MacOS X) (0) | 2020.05.31 |
투명으로 버튼 배경 (0) | 2020.05.31 |
OS X에서 파일 인코딩을 어떻게 확인합니까? (0) | 2020.05.31 |
안드로이드 페이스 북 키 해시를 만드는 방법? (0) | 2020.05.31 |