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 |