임동문의 횡설수설

dmlim.egloos.com

포토로그


라이프로그


Java Regular Expression Package 의 버그 프로그래밍

가금 서버가 행걸려서 CPU 를 100% 다 잡아먹고 서비스가 안되는 현상이 종종 발생 하였는데

오늘 지인의 도움에 힘입어 jmap 과 jhat 을 이용해서 JVM 의 Heap 을 디버깅 해본 결과

스팸 차단을 위해 패턴에 등록한 regular expression 이 특정 검색 문자열을 만나면 라이브러리 내부에서 무한루프를 도는 현상을 찾았습니다.

물론 regular expression 자체가 좀 난해하게 만들어진 점이 없쟎아 있지만, 무한루프를 도는건 아무래도 문제가 있는 듯 싶네요, 유닉스에 있는 awk, grep 에서는 별 문제 없이 동작하더군요

오늘 잡힌 regular expression 과 입력 문자열은 다음과 같습니다.


------------------------------------------------------------------------------
- 정규식 : [wW]{0,3}\.*.*\.*.*\.[cC][^a-zA-Z0-9]{1,32}[nN]
- 문자열 : 니마........{엄청길게썼음972개}........나...... 안된다~^.^
------------------------------------------------------------------------------
- 정규식: [wW]{0,3}\.*.*\.*.*\.[cC]*%63[nN]*
- 문자열: 나........{엄청길게썼음928개}.........내일 사랑니수술 하러가..ㅠ.ㅠ
------------------------------------------------------------------------------


참고로 JDK 1.6 에서 지원되는 jmap, jhat 사용법을 간단하게 설명 드립니다.

jmap, jhat 은 런타인중인 JVM 의 힙의 내용을 살펴보고자 할 때 사용하고요, 메모리에 있는 대부분의 객체들을 일목 요연하게 볼 수 있습니다.


1. jmap 으로 힙 덤프 파일을 생성한다.

>$ jmap -dump:live,file=heap.bin <pid>

2. jhat 으로 힙 덤프 파일을 분석한다

>$ jhat heap.bin

이렇게 하면 분석이 끝나고 디폴트 7000포트로 웹서버가 하나 뜹니다.

3. 웹 브라우저로 http://<host>:7000/ 로 접속하여 결과를 확인한다.

http://<host>:7000/oql/ 로 접속하면 직접 SQL 과 유사한 OQL (Object Query Language) 를 이용하여 객체들을 뒤져볼 수 있습니다. 

 


핑백

덧글

  • 아침이슬 2012/02/22 09:22 # 삭제 답글

    요새 정규표현식을 공부하고 있는데 우연히 찾아들어오게 되었어요.
    그 무한 루프를 만난다는 특정 문자열이 뭔지 궁금하군요.
    그리고 정규표현식에서 .*.*.*.* 이렇게 두번 반복해서 적은 이유가 무엇인가요?
    한번만 적어도 똑같은거 아닌가요?
댓글 입력 영역