GDB로 스텝 인, 스텝 오버 및 스텝 아웃하는 방법?


42

나는 helpGDB에있는 동안 타이핑 했지만 스텝 인, 스텝 오버 및 스텝 아웃에 대해서는 아무것도 찾지 못했습니다. _start( break _start) 의 어셈블리 프로그램에 중단 점을 넣었습니다 . 그 후 나는 타이핑 next하고 디버깅을 마쳤다. 나는 그것이 끝나고 내가 원하는대로 들어 가지_start 않았기 때문이라고 생각합니다 .

도움이 될 사람이 있습니까?


전체 GDB 문서를 읽으십시오. 내가 기억할 때, 나는 그것을 처음 배울 때 이것에 대해 매우 도움이되었습니다. 불행히도, 수십 년 동안 그 수준의 프로그램을 디버깅 할 필요가 없었으므로 실제 명령이 내 두뇌에서 바뀌어 버린 것 같습니다. 그래서 나는 실제로 답을 쓸 수 없습니다. 그러나 매뉴얼에서 알아 내면 보너스에 대한 자신의 질문에 대답 할 수 있습니다.
지도

@MAP 다시 시도하겠습니다. 더 나은 디버거 (KDbg)를 사용하려고했지만 우분투에서 사용하지 못했습니다 .
Pichi Wuana

답변:


38

help running 힌트를 제공합니다.

있다 stepnextinstuctions (도 nexti하고 stepi).

(gdb) help next
Step program, proceeding through subroutine calls.
Usage: next [N]
Unlike "step", if the current source line calls a subroutine,
this command does not enter the subroutine, but instead steps over
the call, in effect treating it as a single source line.

그래서 우리가 볼 수있는 step단계 서브 루틴을하지만, next단계 것 이상의 서브 루틴을.

stepstepi(상기 nextnexti)는 "선"또는 "지시"단위로 구분된다.

step -- Step program until it reaches a different source line
stepi -- Step one instruction exactly

관련 내용 finish:

(gdb) help finish
Execute until selected stack frame returns.
Usage: finish
Upon return, the value returned is printed and put in the value history.

훨씬 유용한 정보는 https://sourceware.org/gdb/onlinedocs/gdb/Continuing-and-Stepping.html에 있습니다.


다른 소스 라인에 도달 할 때까지 무엇을 의미 합니까?
Pichi Wuana

1
for(i=0;i<10;i++) { printf("%d\n",i); }하나의 소스 행이지만 여러 명령입니다.
Stephen Harris

3
탈퇴 할 수있는 방법이 있습니까? 나는 달리기를 도와 줄 수 없었다.
nukeguy

1
"스텝 아웃"이란 무엇입니까? 이 finish명령은 현재 스택 프레임을 완료하며, 일반적으로 현재 서브 루틴을 완료하고 호출자로 돌아갑니다.
Stephen Harris

@PichiWuana gdb는 소스 코드의 다음 줄을 나타내는 첫 번째 명령에 도달 할 때까지 필요한 수의 어셈블리 명령을 단계별로 수행합니다.
U007D

0

나는 같은 질문을했기 때문에 여기에 왔습니다. 결국 루프의 "스텝 아웃 (step-out)"과 같은 것을 사용할 수있을 때마다 내 목적에 따라 루프 다음에 다른 중단 점을 설정 한 다음 프로그램 continue이 루프를 끝내고 그 후 중단 점으로 실행할 수 있다고 생각했습니다. 그것이 대부분의 사람들에게 명백한 경우 미안하지만 아마도이 질문에 대한 답을 찾고있는 누군가에게 도움이 될 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.