2013-12-09 3 views
5
define traverse 
    while(CONDITION) 
     if $start == 0 
      set $start = 1 
      print_node 
      print_rss_item 
     else 
      continue 
      print_node 
      print_rss_item 
     end 
    end 
end 

프로그램이 완료되면 루프를 중지하는 데 필요한 조건은 무엇입니까?프로그램이 완료 될 때까지 GDB 스크립트를 반복하는 방법은 무엇입니까?

+0

'$ start = 1'은 루프를 멈추는 절이라고 가정합니다. 그래서 while ($ start == 0)을 원하겠습니까? 이 링크는 https://sourceware.org/gdb/onlinedocs/gdb/Command-Files.html에 도움이됩니다. – KeithSmith

답변

0

단순히 무한 루프로 반복하십시오. 프로그램이 끝나면 종료됩니다.

define traverse 
    while(CONDITION) 
     if $start == 0 
      set $start = 1 
      print_node 
      print_rss_item 
     else 
      continue 
      print_node 
      print_rss_item 
     end 
    end 
end 

몇 가지주의 할 :

define traverse 
    while(1) 
     if $start == 0 
      set $start = 1 
      print_node 
      print_rss_item 
     else 
      continue 
      print_node 
      print_rss_item 
     end 
    end 
end 
5

여러분의 GDB 스크립트를 보면

  1. 및 디버그 대상 (그래서 "디버거"라고도 함) GDB 스크립트는 항상 토글에서 운영 모드 : GDB SCRIPT RUN이 실행되는 동안 디버거는 일시 중지되고 실행되지 않으며 DEBUGGEE가 실행될 때마다 gdb 스크립트가 일시 중지되고 실행되지 않습니다.

  2. 왜 이렇게됩니까? 이는 디버거가 일시 중지 모드 ("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 회까지 실행됩니다.

관련 문제