2009-08-25 5 views
6

신청이 있습니다. 나는 소스 코드 (C 언어)를 가지고있다. 어쨌든 나는 그것을 컴파일 할 수있다. 내가 원하는 도구를 추가하십시오. 등. 그러나, 나는 printf의 무리와 소스 코드를 후추 싶지 않아요. 특정 값 (예 : 전역 구조의 일부 구성원)에 (값 변경) 기록 될 때를 보여주는 일종의 로그를 생성 할 수 있기를 원합니다. 원본 파일과 줄 번호, 이전 값과 새 값을 표시하고 싶습니다.gdb 추적 (또는 유사) 도움말

또한 주소가 아닌 이름으로 값을 지정할 수 있기를 바랍니다. 그러나 주소는 괜찮습니다. 함수에 로컬 인 값을 지정할 수 있으면 보너스 포인트.

아직 gdb의 추적 명령을 찾으려고 노력하고 있습니다. 어떤 도움이라도 대단히 감사합니다. 감사.

답변

1

감사합니다 @derobert 및 @peter! 드디어 이것으로 돌아가서 이것 :

break main 
commands 
     watch somevar 
     commands 
       cont 
     end 
     cont 
end 
run 

트릭을 수행합니다. 이 기능은 "somevar"가 전역이거나 "main"에 로컬 인 경우 작동합니다. "somevar"가 다른 함수의 지역 변수 인 경우 위의 함수 이름으로 "main"을 대체하십시오.

gdb -x gdbscript a.out 
6

먼저 디버그 기호로 프로그램을 컴파일해야하며 gdb를 가장 유용하게 만들려면 w/o 최적화가 필요합니다. gcc의 경우 -g -O0이됩니다.

둘째로, 찾고있는 기능이 추적 기능이 아니라 해당 감시 점입니다.

(gdb) help watch 
Set a watchpoint for an expression. 
A watchpoint stops execution of your program whenever the value of 
an expression changes. 

그래서, 몇 가지 예제 코드 제공 :

int main() { 
    int a; 
    a = 1; 
    a = 2; 
    return 0; 
} 

당신이 다음에 GDB를 실행할 수 있습니다, 그리고 :이 때문에 스택에있는 약간 재미 일하고

(gdb) b main 
Breakpoint 1 at 0x80483a5: file test.c, line 4. 
(gdb) run 
Starting program: /tmp/test 

Breakpoint 1, main() at test.c:4 
4    a = 1; 
(gdb) watch a 
Hardware watchpoint 2: a 
(gdb) c 
Continuing. 
Hardware watchpoint 2: a 

Old value = -1207552288 
New value = 2 
main() at test.c:8 
8    return 0; 

, 기억이 아닙니다. 그리고 최적화가 실행 되었다면, 더 적은 작업을 할 수 있습니다 : 최적화 된 것입니다.

+1

이 예제는 잘 작동 할 수 있습니다 휘발성 int''로 선언'A'를보십시오 : 같은

는 파일 (예를 들어, "gdbscript") 및 실행 GDB를 이러한 명령을 넣습니다. – caf

+0

감사합니다. 내가 시계에 대해 이해할 수있는 점은 프로그램 실행이 사용자가 "계속"될 때까지 중단된다는 것입니다. 이 작업을 수행하기 위해 expect 스크립트를 작성할 수는 있지만, gdb에서 자동으로이를 수행 할 수 있습니까? – tvaughan

+0

@tvaughan : gdb에서 자동으로 수행하는 방법을 모르겠습니다. – derobert

3

이미 언급 한 것처럼 변수에 감시 점을 설정해야합니다.

를 사용해서

(gdb) help commands 
Set commands to be executed when a breakpoint is hit. 
Give breakpoint number as argument after "commands". 
With no argument, the targeted breakpoint is the last one set. 
The commands themselves follow starting on the next line. 
Type a line containing "end" to indicate the end of them. 
Give "silent" as the first line to make the breakpoint silent; 
then no output is printed when it is hit, except what the commands print. 

그래서 "명령"명령을 사용하여, 시계 명령의 감시 점 번호를 찾아이 할 가정

(gdp) commands 2 
> print a 
> cont 
> end 

(시계를 가정하면 두 번째 휴식 시간입니다) a는 원하는 변수입니다. gdb가 제공하는 출력에 만족한다면 인쇄 라인을 생략 할 수 있습니다.

원래 중단 점의 명령을 사용하여 감시 점을 설정하고 계속할 수도 있습니다.