GDB


Setting breakpoints programmatically


복잡한 C 프로그램을 디버깅할 때는 소스코드 내에 중단점을 설정할 수 있습니다.


int main() {
    int val = 1;
    val = 42;
    asm("int $3"); // set a breakpoint here
    val = 7;
}

위와 같이 설정하면 val = 42; 뒤에 break point가 설정됩니다.

gdb로 이 프로그램을 실행하면 아래와 같이 val = 7;앞에서 중단된 것을 알 수 있습니다.


$ gcc main.c -g -o main && ./main
(gdb) r
[...]
Program received signal SIGTRAP, Trace/breakpoint trap.
main () at main.c:6
6	    val = 7;
(gdb) p val
$1 = 42


이때 p(rint) val을 이용해 val의 값을 찍어볼 수 있습니다.



Checking memory content

다음과 같은 코드가 있다고 합시다.


int main() {
    char bad_string[3] = {'C', 'a', 't'};
    printf("%s", bad_string);
}



$ gcc main.c -g -o main && ./main


위 코드를 gdb로 실행해 다음과 같이 브레이크 포인트를 걸어줍니다.


(gdb) l
1	#include <stdio.h>
2	int main() {
3	    char bad_string[3] = {'C', 'a', 't'};
4	    printf("%s", bad_string);
5	}
(gdb) b 4
Breakpoint 1 at 0x100000f57: file main.c, line 4.
(gdb) r
[...]
Breakpoint 1, main () at main.c:4
4	    printf("%s", bad_string);
(gdb) x/16xb bad_string
0x7fff5fbff9cd:	0x63	0x61	0x74	0xe0	0xf9	0xbf	0x5f	0xff
0x7fff5fbff9d5:	0x7f	0x00	0x00	0xfd	0xb5	0x23	0x89	0xff

(gdb)



b 4를 통해 4번째 줄에 break point를 설정했습니다. 그 후 r로 break point까지 프로그램을 동작시킨 후, x command를 16xb라는 파라미터로 실행하면 bad_string이 시작하는 0x7fff5fbff9cd부터 메모리 안에 들어있는 값을 볼 수 있습니다.  이 문자열은 null character없이 만들어졌기 때문에 printf로 본다면 0x00이 나올 때까지 0x00을 포함한 10개의 문자열을 하나의 문자열로 인식할 것입니다.

'Angrave System Programming > Learning C' 카테고리의 다른 글

Question/Exercises  (0) 2019.01.16
Debugging(3)  (0) 2019.01.09
Debugging(2)  (0) 2019.01.09
Debugging(1)  (0) 2019.01.09
Strings and Structs(2)  (0) 2019.01.09
Posted by 몰랑&봉봉
,