GDB : 변수가 같은 값이면 중단


89

변수가 내가 설정 한 값과 같을 때 GDB를 중단 점으로 설정하고 싶습니다.이 예제를 시도해 보았습니다.

#include <stdio.h>
main()
{ 
     int i = 0;
     for(i=0;i<7;++i)
        printf("%d\n", i);

     return 0;
}

GDB의 출력 :

(gdb) break if ((int)i == 5)
No default breakpoint address now.
(gdb) run
Starting program: /home/SIFE/run 
0
1
2
3
4
5
6

Program exited normally.
(gdb)

보시다시피, GDB는 중단 점을 만들지 않았습니다. 이것이 GDB로 가능합니까?

답변:


123

중단 점 안에 중첩 된 감시 점 외에도 'filename : line_number'에 단일 중단 점을 설정하고 조건을 사용할 수도 있습니다. 나는 때때로 그것이 더 쉽다는 것을 안다.

(gdb) break iter.c:6 if i == 5
Breakpoint 2 at 0x4004dc: file iter.c, line 6.
(gdb) c
Continuing.
0
1
2
3
4

Breakpoint 2, main () at iter.c:6
6           printf("%d\n", i);

나처럼 줄 번호 변경에 질리면 레이블을 추가 한 다음 다음과 같이 레이블에 중단 점을 설정할 수 있습니다.

#include <stdio.h>
main()
{ 
     int i = 0;
     for(i=0;i<7;++i) {
       looping:
        printf("%d\n", i);
     }
     return 0;
}

(gdb) break main:looping if i == 5

30

이를 위해 감시 점 (코드 대신 데이터에 대한 중단 점)을 사용할 수 있습니다.

을 사용하여 시작할 수 있습니다 watch i.
그런 다음 사용하여 조건을 설정하십시오.condition <breakpoint num> i == 5

다음을 사용하여 중단 점 번호를 얻을 수 있습니다. info watch


3
(gdb) watch i No symbol "i" in current context.
SIFE

2
코드에서 i존재 하는 위치에 있어야 합니다. 보십시오 break main, run, c, s그 대답에 명령을 (단계는 당신이 선언 과거를 얻을 수 있도록하기 위해)합니다. -g플래그 를 사용하여 프로그램을 컴파일하십시오 . (예 : 디버그 정보 포함)
imreal

실행이 시작되기 전에 주 실행 파일에 연결된 다른 컴파일 단위 / 파일이 아직로드되지 않을 수 있습니다. 맵시 옵션은 사용하는 것 start <args>같다, tb main, run <args>. 이렇게하면 프로그램이 시작되어 중단 / 감시 지점을보다 쉽게 ​​설정할 수 있습니다.
JWCS

9

먼저 적절한 플래그를 사용하여 코드를 컴파일하여 코드로 디버그를 활성화해야합니다.

$ gcc -Wall -g -ggdb -o ex1 ex1.c

그런 다음 좋아하는 디버거로 코드를 실행하십시오.

$ gdb ./ex1

코드를 보여주세요.

(gdb) list
1   #include <stdio.h>
2   int main(void)
3   { 
4     int i = 0;
5     for(i=0;i<7;++i)
6       printf("%d\n", i);
7   
8     return 0;
9   }

5 행을 끊고 i == 5인지 확인합니다.

(gdb) b 5
Breakpoint 1 at 0x4004fb: file ex1.c, line 5.
(gdb) rwatch i if i==5
Hardware read watchpoint 5: i

중단 점 확인

(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000004004fb in main at ex1.c:5
    breakpoint already hit 1 time
5       read watchpoint keep y                      i
    stop only if i==5

프로그램 실행

(gdb) c
Continuing.
0
1
2
3
4
Hardware read watchpoint 5: i

Value = 5
0x0000000000400523 in main () at ex1.c:5
5     for(i=0;i<7;++i)

4

하드웨어 및 소프트웨어 감시 점이 있습니다. 변수를 읽고 쓰기위한 것입니다. 튜토리얼을 참조해야합니다.

http://www.unknownroad.com/rtfm/gdbtut/gdbwatch.html

감시 점을 설정하려면 먼저 환경에서 변수 i가있는 위치로 코드를 분할하고 감시 점을 설정해야합니다.

watch명령은 쓰기, rwatch읽기 및 awatch읽기 / 쓰기 를 위한 감시 장치를 설정하는 데 사용됩니다 .

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