Wednesday, December 27, 2006
소프트웨어 엔지니어링 문제
1. 소프트웨어를 개발하여 출시하고 나면 어떤 현상이 발생하는가?
"네? 4번 메뉴를 클릭하면 프로그램이 죽는다구요?"
"교차로에서 지도 표시가 제대로 안된다고 하는데, 이게 재현이 가능한가요?"
"어제는 잘 돌아갔는데, 오늘은 죽네요."
"DB 연결 모듈에서 오류가 발생하는 것 같은데요? 네? DB 연결 모듈은 아무 이상 없다고요?"
"BF존에서 캐릭터가 자주 다운된다는데, 회사 서버에서는 재현이 안되요."
...
2. 에러의 원인이 무엇인지 자동으로 알 수는 없을까?
--> 어떤 S/W component가 오류를 발생시키는가?
--> 해당 S/W component의 어느 부분이 오류를 발생시키는가?
(오류 Localization 문제)
오류 정보를 Data Mining하여 발생한 오류와 동작중인 S/W 모듈들의 연관관계를 파악하면
도움이 될 것 같다.
예를 들어, A라는 소프트웨어에서 계속해서 "비정상 종료" 보고가 올라오는데, 이 경우, 항상
B라는 DLL이 같이 동작하고 있다면, A S/W와 B DLL 사이의 충돌이 있을 가능성이 매우 높다.
3. 프로그램을 개발하면서 자주 접하는 버그들
1. memory leakage
- 메모리를 Heap에서 할당한 후, 해제하지 않아 계속해서 메모리 사용량이 증가하는 문제
프로그램 실행 직후에는 잘 감지되지 않고, 시간이 좀 지나야 문제를 발생시킴. 예를 들어
1시간에 4MB memory leak이 발생한다면, 4GB 메모리를 가진 시스템에서는 1000시간 후에
메모리 부족 문제가 발생하게 됨.
2. dangling pointer
- 포인터가 이미 삭제된 데이터 오브젝트를 가리키는 경우. 오브젝트가 사용하던 메모리
영역이 재사용되지 않고 유지되는 경우에는 포인터로 데이터를 사용해도 별 문제가 발생
하지 않음 (물론 이렇게 하는 것 자체가 잘못된 것임) 하지만, 재사용되는 경우에는 illegal
memory access 문제가 발생함. memory leakage와 마찬가지로 찾아내기 힘든 버그임.
3. array bound violation (배열 영역 벗어나는 경우)
- 배열을 선언하고, 사용하는 과정에서 배열의 index 범위를 벗어나는 경우에 발생하는 문제
이다. 다행이도 최근 컴파일러나 디버거는 이러한 문제들을 미리 검사하여 경고를 해준다.
하지만, 배열이 동적으로 할당되는 경우(Heap에서)에는 걸러지지 않는다. 배열 접근 시
index의 범위를 항상 검사하여 안전성을 확보하는 것이 좋다.
4. endless loop (무한 루프)
- For 혹은 While 같은 제어문의 조건식이 항상 참이 되는 경우이다. 이 경우 프로그램은
종료되지 않고, 같은 코드를 무한히 반복 수행한다. Endless loop 때문에 앞에서 말한
Memory leakage 문제나 array bound violation 문제가 발생할 수도 있다.
"네? 4번 메뉴를 클릭하면 프로그램이 죽는다구요?"
"교차로에서 지도 표시가 제대로 안된다고 하는데, 이게 재현이 가능한가요?"
"어제는 잘 돌아갔는데, 오늘은 죽네요."
"DB 연결 모듈에서 오류가 발생하는 것 같은데요? 네? DB 연결 모듈은 아무 이상 없다고요?"
"BF존에서 캐릭터가 자주 다운된다는데, 회사 서버에서는 재현이 안되요."
...
2. 에러의 원인이 무엇인지 자동으로 알 수는 없을까?
--> 어떤 S/W component가 오류를 발생시키는가?
--> 해당 S/W component의 어느 부분이 오류를 발생시키는가?
(오류 Localization 문제)
오류 정보를 Data Mining하여 발생한 오류와 동작중인 S/W 모듈들의 연관관계를 파악하면
도움이 될 것 같다.
예를 들어, A라는 소프트웨어에서 계속해서 "비정상 종료" 보고가 올라오는데, 이 경우, 항상
B라는 DLL이 같이 동작하고 있다면, A S/W와 B DLL 사이의 충돌이 있을 가능성이 매우 높다.
3. 프로그램을 개발하면서 자주 접하는 버그들
1. memory leakage
- 메모리를 Heap에서 할당한 후, 해제하지 않아 계속해서 메모리 사용량이 증가하는 문제
프로그램 실행 직후에는 잘 감지되지 않고, 시간이 좀 지나야 문제를 발생시킴. 예를 들어
1시간에 4MB memory leak이 발생한다면, 4GB 메모리를 가진 시스템에서는 1000시간 후에
메모리 부족 문제가 발생하게 됨.
2. dangling pointer
- 포인터가 이미 삭제된 데이터 오브젝트를 가리키는 경우. 오브젝트가 사용하던 메모리
영역이 재사용되지 않고 유지되는 경우에는 포인터로 데이터를 사용해도 별 문제가 발생
하지 않음 (물론 이렇게 하는 것 자체가 잘못된 것임) 하지만, 재사용되는 경우에는 illegal
memory access 문제가 발생함. memory leakage와 마찬가지로 찾아내기 힘든 버그임.
3. array bound violation (배열 영역 벗어나는 경우)
- 배열을 선언하고, 사용하는 과정에서 배열의 index 범위를 벗어나는 경우에 발생하는 문제
이다. 다행이도 최근 컴파일러나 디버거는 이러한 문제들을 미리 검사하여 경고를 해준다.
하지만, 배열이 동적으로 할당되는 경우(Heap에서)에는 걸러지지 않는다. 배열 접근 시
index의 범위를 항상 검사하여 안전성을 확보하는 것이 좋다.
4. endless loop (무한 루프)
- For 혹은 While 같은 제어문의 조건식이 항상 참이 되는 경우이다. 이 경우 프로그램은
종료되지 않고, 같은 코드를 무한히 반복 수행한다. Endless loop 때문에 앞에서 말한
Memory leakage 문제나 array bound violation 문제가 발생할 수도 있다.