diff --git a/README.md b/README.md
index aed3aea3b46aafc52eddfc790b071d03e58d517e..13bd8deaa3c828dbdee5b0475bff55e2d9f982b4 100644
--- a/README.md
+++ b/README.md
@@ -468,3 +468,37 @@ int main()
      fprintf(stdout, "%f : %d %d\n, fa, (int)fa, (int)(fa*powf(2.0f,16)));
  }
  ```
+
+
+## lesson09
+
+* c 언어에서 ^ 는 XOR을 나타낸다.
+
+1. $gcc -g : debug하는 명령어  (gdb -GNU Debugger 이용)
+> * 디버깅 : 버그를 잡는다는 뜻
+> * 디버깅을 하고 $file a.out 을 하면 with debug_info 라는 것이 같이 출력된다.
+
+2. 버그 생성 후 디버깅 해보기
+> 1. fscanf 에서 정수를 입력받을 때 &number 형태로 정수의 주소를 받아야 하는데 그냥 number로 받아 버그를 생성했다.
+>> * 그랬더니 실행파일 생성 과정에서 segmentation fault(core dumped) 가 발생했다. 
+> 2. gdb 사용법 
+>> * $gdb a.out : gdb interface 안에 들어가기
+>> * (gdb) run : 실행 -> 에러가 어디서 났는지 알 수 있다. (위의 예의 경우 scanf에서 났음)
+>> * (gdb) where : call stack 현재 내가 어디 있다는 것을 알려준다.
+>> * (gdb) list main : main 소스코드를 보여주어 에러코드 찾아 볼 수 있음
+>> * (gdb) list : 전체코드를 부분씩 보여줌
+>> * (gdb) break 34 : 34번째 line에서 스톱
+>>>>   run 하면 위의 것 작동
+>> * (gdb) next : 지금하는 소스코드의 바로 다음(한줄)실행 
+>> * (gdb) step : 함수속으로 들어 가서 다음 코드를 실행 하고 싶을 때 사용 (ex)fscanf의 소스코드로 들어가서 다음 줄 
+>> * (gdb) continue : 계속 다 실행
+>> * (gdb) print i : 현재 i 값 프린팅
+>> * (gdb) delete breakpoint : break point 모두 지우기
+>> * (gdb) clear 34 : 34번에 걸린 브레이크 포인트만 지우기(특정 브레이크 포인트 찝어서 지우기)
+>> * (gdb) start : 처음부터 다시 시작
+>> * (gdb) bt : call stack을 보여준다. 
+>> * (gdb) info break : break 한것들을 볼 수 있다.
+>> * (gdb) sisable br 4 : 잠깐 동안만 4번의 브레이크를 머추게 한다.
+>> * (gdb) watch : 변수가 변경 될 때 프로그램을 중단하기 위해 변수에 감시점을 설정한다. 프로그램 실행 중에 변수가 어떻게 변경되는지 자동으로 인쇄할려면 디스플레이를 사용하면 된다. watch 사용시 변수의 값이 바뀔 때 마다 실행을 중지할 수 있다. 
+
+