여러분의 GDB 스크립트를 보면
이
및 디버그 대상 (그래서 "디버거"라고도 함) GDB 스크립트는 항상 토글에서 운영 모드 : GDB SCRIPT RUN이 실행되는 동안 디버거는 일시 중지되고 실행되지 않으며 DEBUGGEE가 실행될 때마다 gdb 스크립트가 일시 중지되고 실행되지 않습니다.
왜 이렇게됩니까? 이는 디버거가 일시 중지 모드 ("ptrace()"API 및 다양한 옵션 : PEEKUSER, POKEUSER, PTRACE_CONT)를 읽을 때마다 디버거가 실제로 디버거의 메모리를 깨끗하게 (그리고 메모리 일관성있게) 읽을 수 있기 때문입니다. 부패, 따라서 모든 변수 값 등
디버거가 실행되지 않을 때, 즉, 그것은 제어 디버에 전달되는 "계속"작업이, 디버 따라서 계속 실행할 수있는 실행과 변화 자신의 기억, 다른 프로세스에 의해 잘못 읽혀질 염려없이 - 일어날 수 없기 때문입니다.
그러면 디버거가 종료 된 시점을 어떻게 알 수 있습니까? "계속"하지 못하면 gdbscript가 계속 실행되지 않습니다. 그러나 breakpoint없이 debuggee를 설정하면 gdb "run"명령을 실행하면 gdb 스크립트를 실행할 기회없이 디버거를 계속 실행할 수 있습니다.
스크립트가 실행 중이면 debuggee가 STOP 모드이고 그 반대의 경우도 마찬가지입니다. exit()를 호출하여 디버거가 종료 된 경우 gdb 스크립트도 실행되지 않습니다.
예 :
defining the macro (inside .gdbinit file):
define myloop_print
set $total = $arg0
set $i = 0
while($i<$total)
set $i = $i + 1
print $i, $i
cont
end
end
그리고 "GDB/빈/LS"을 실행하고 "쓰기 휴식"과 "-al 실행"및 "myloop_print 10000"다음 (순서 또는 순서가 중요합니다) , 우리는 모든 "쓰기"가 중단되고 gdbscript가 카운터를 출력한다는 것을 알 수 있습니다. 실행
그리고 마지막 몇 줄은 다음과 같습니다 명확하게 인쇄 된 마지막 카운터가 나는 한계로 10000을 지정했다하더라도, 286 것을 보여준다
Breakpoint 1, write() at ../sysdeps/unix/syscall-template.S:81
81 in ../sysdeps/unix/syscall-template.S
$40571 = 285
drwxrwxr-x 2 tthtlc tthtlc 4096 Feb 18 00:00 yocto_slide
[Inferior 1 (process 7395) exited normally]
$40572 = 286
The program is not being run.
(gdb)
합니다. 디버 실행하지 않고 매크로를 실행
:
(gdb) myloop_print 10000
$40573 = 1
The program is not being run.
(gdb)
우리는 gdbscript가 실행되지 않습니다 것을 볼 수 있습니다.
그리고 "myloop_print 10000"(매크로가 .gdbinit 내부에서 정의되었다고 가정하면) 디버그를 실행하지 않고도 gdbscript가 완료 10000 회까지 실행됩니다.
'$ start = 1'은 루프를 멈추는 절이라고 가정합니다. 그래서 while ($ start == 0)을 원하겠습니까? 이 링크는 https://sourceware.org/gdb/onlinedocs/gdb/Command-Files.html에 도움이됩니다. – KeithSmith