'Trouble Shooting'에 해당되는 글 24

  1. 2011.06.26 [TroubleShooting] 특정 업체의 데이터만 이상한 경우
  2. 2010.08.19 FindBugs에서 버그가 발견된 소스의 라인을 찾지 못하는 경우
  3. 2009.12.21 서버가 구동되지 않을때
  4. 2009.12.18 잘못된 예외 처리로 인해 엉뚱한 에러 발생
  5. 2009.09.28 문제해결 관점
  6. 2009.09.17 특정 PC에서 화면이 보이지 않음
  7. 2009.09.17 JSP를 수정해도 반영되지 않는 경우
  8. 2009.09.01 HTTP Error 405 - Method Not Allowed
  9. 2009.08.14 시스템 Hangup 현상 분석
  10. 2009.08.04 javap로 클래스 파일 버전 확인
  11. 2009.08.04 java.lang.UnsupportedClassVersionError
  12. 2009.06.18 ORA-01461: LONG 값은 LONG 열에만 입력할 수 있습니다
  13. 2009.06.10 Open quote is expected for attribute "{1}" associated with an element type "parameterClass".
  14. 2009.05.22 테이블을 수정할 수 없습니다./제한 시간이 만료되었습니다.
  15. 2009.05.19 Tomcat 에 Heap 메모리 할당하기
  16. 2009.05.14 Eclipse에서 Checkout Projects from SVN이 보이지 않는다.
  17. 2009.05.11 오라클 에러 모음
  18. 2009.04.02 Javascrpt 개체 접근하기
  19. 2009.03.23 멤버변수 문제점
  20. 2009.03.19 변경 쿼리문 실행시 반드시 트랜잭션 걸 것! /////운영팁, 쿼리문에 변경할 데이터 조건에 거는거
  21. 2009.03.11 Eclipse 구동시 에러
  22. 2009.03.03 문제 해결의 시작은 에러메세지
  23. 2009.03.01 유지보수 - 소스
  24. 2009.02.27 자바스크립트 문자열에 특수문자가 들어가서 에러가 나는 경우

[TroubleShooting] 특정 업체의 데이터만 이상한 경우

XML 로 데이터를 주고 받는데 특정 업체의 데이터만 뷰어에 나타나지 않는다.
로그에는 별다른 에러도 없고.

전달된 XML 을 살펴봐도 다른 업체 XML 과 다른 것이 없음.
내부 시스템의 소스를 볼 수가 없는 상황에서 해결이 되지 않고 있음.

내부 시스템 담당자와 디버깅을 하다 보니 URL 에 공백이 보인다.
WebSquare 를 사용하고 있었는데 에러가 명확하게 나오지 않아 힘들었는데 우연찮게 이것을 발견하였다.
이 URL 을 확인해보니 각 업체의 등록정보에서 가져오는데 특정 업체의 URL 에 공백이 포함되어 있었다.

처음부터 이렇게 접근했으면...

- 다른 업체 데이터는 문제가 없는데 이 업체 데이터가 문제가 발생한다.
전체 프로그램에는 이상이 없다.

- 그럼 다른 업체와 차이점은?
업체 등록은 각 업체의 정보를 입력한다. 이 부분이 다르다.

FindBugs에서 버그가 발견된 소스의 라인을 찾지 못하는 경우


컴파일시 디버깅 정보가 들어가지 않아서 그렇다.
Ant를 사용한다면 컴파일시 debug를 yes로 둔다.

<javac destdir="${classes.dir}" srcdir="${source.dir}"
    classpathref="master.classpath" includeantruntime="false"
    debug="yes"
/>

- 이거 해결하려고 클래스 파일을 비교해 봤다.

서버가 구동되지 않을때

서버가 구동되지 않을때 제일 먼저 살펴볼 것은 포트 충돌이다.
물론 로그를 봐도 되겠지만 서버가 이상하게 동작하는 경우 재시작을 해봐도 이상한 증상이 나오는 경우 포트부터 점검해 볼 것.

> netstat -nao | findstr 8080
  TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       2648
  TCP    10.20.30.40:8080      111.212.50.111:3550    TIME_WAIT       0
  TCP    10.20.30.40:8080      111.212.50.111:3575    TIME_WAIT       0

작업관리자에서 해당 PID를 찾아서 확인한다.

  1. 주로 보면 서비스로 서버를 띄우고, 콘솔로 서버를 다시 띄우는 경우도 많다.
  2. 기존에 설치된 프로그램이 같은 포트를 사용하고 있는 경우


  3. 서버가 제대로 내려가지 않은 경우도 있다. : 이클립스에서 톰캣을 구동시켰는데 문제가 생겨 이클립스만 닫은 경우
  4. 방화벽으로 막혀 있는 경우도 있다.

잘못된 예외 처리로 인해 엉뚱한 에러 발생

데이터 형식 nvarchar을(를) numeric(으)로 변환하는 중 오류가 발생했습니다.

갑자기 에러가 발생했다.
이런 에러가 예전부터 많이 나오긴 했었다.

문제가 없는 쿼리인데 에러가 발생한다.

로그를 보니 이상한 로그가 있다.
DEXTUploadException --> 데이터를 읽어오는 데 실패했습니다. 사용자와의 연결이 끊어졌거나 업로드를 중지했습니다.

예외를 잡아서 로그만 남기고 아무런 처리를 하지 않는다.
업로드컴포넌트에서 처리가 되지 않아서 DAO에서 쿼리문을 처리할때 pk2가 빈 문자열이 넘어온거 같다.
(웹요청에 대한 값을 Map에 넣었다가 getString(NAME) 같은 메서드로 처리하는데 NAME으로 된 값이 없으면 빈 문자열로 처리하게 되어 있음)

결국에는 아래와 같은 쿼리가 실행되었다.

업로드컴포넌트에서 에러가 난 이유는 디스크가 다 차서 더이상 용량이 남아 있지 않았다고 한다.

- 2010-02-08
다른 프로그램에서 동일한 에러 발생
전송을 했는데 화면이 정지하고 반응이 없었다고 함.
서버/네트워크 사용량이 많아서인지, 업체 PC 사양이 떨어져서 그런지는 불분명함.

문제해결 관점

현업에서 전화가 온다.

이거 내가 전자결제했는데 A시스템에서는 반려한 것으로 보인다.
현장에 공고를 내려야 하는데 버튼이 안보인다.

음...외부인터페이스에서 에러가 난거 같거 같은데...
현업은 자꾸 공고발송 버튼이 안보인다고 한다.
담당자가 버튼을 확인해보니 공고발송이라는 버튼이다.
현업에게 공고발송이라는 버튼이 안보이냐고 물어보니 현업은 아니라고 한다.
엥?
그 버튼이 아니면 다른 버튼은 없는데...
소스를 뒤져 본다.
그 버튼이 아닌 다른 버튼은 나올수가 없다.

이러는 동안 시간이 흘러 현업은 기다릴수가 없어서 팀장에게 바로 전화를 한다.
담당자가 업무를 처리하지 못하고 있는데 빨리 좀 처리해 달라고.

팀장이 상황을 들어본다.
현업이 원하는 버튼이 안보인다고 하는데...
담당자는 그 상태에서는 그 버튼이 안보이고 현업이 원하는 버튼을 물어보니 아니라고 한다라는 이야기를 설명해 준다.

그러나 문제의 발단, 핵심은 그게 아니다.
현업이 전자결제를 했는데 우리 시스템에서는 반려된 것으로 보이기 때문에 현장에 공고를 내릴 버튼이 안보이는 것이다.
공고발송 버튼인지 뭔지는 나도 모른다. 현업도 모를 것이다. 지금 안보이니깐
담당자는 소스를 뒤져보니 그 버튼이 공고발송인지 아는 거고.
담당자는 현업이 버튼이 안보인다고 하니깐 거기만 보고 있는거다.
버튼은 아무런 관련이 없는데도.

팀장은 지시를 내린다.
버튼은 신경쓰지 마라.
지금 각 시스템이 상태가 꼬인거 같으니깐 그걸 해결하면 나머지는 현업이 알아서 자기가 원하는 버튼을 찾아서 진행할테니깐.
전자결제시스템에서 결제를 했다고 하니 전자결제시스템의 상태와, ERP상태를 확인해서 3개의 시스템 상태를 맞추어 주고 우리 시스템에서도 맞춰진 상태에 의해 업무를 진행할 때 문제 없게끔 데이터를 처리하라고.

원인은 전자결제시스템에서 오류가 발생해서 현업이 결제한 데이터가 반려로 넘어왔다.
ERP 담당자도 전자결제시스템 오류라는 것을 알고 있고.
너무 눈에 보이는거, 귀로 들은 것만 집착해서는 문제해결을 하지 못한다.
보이는 것이 다가 아니기 때문이다.

특정 PC에서 화면이 보이지 않음

프레임으로 상단메뉴, 좌측메뉴, 메인화면으로 나누어진 구조로 구성된 사이트
특정 PC에서 특정 메뉴에 접근시 메인화면이 나오지 않는 현상이 발생.
그런데 이 사이트는 에러가 잘 남지 않아 담당자가 하루 고생했음.

소스보기를 해서 보니 JSP에서 에러가 발생하고 있음.
Define tag cannot set a null value
검색을 해보면 define 태그에 NULL이 들어가서 발생한듯 함.

메인화면이 나오지 않았던 것은 스크립트에서 에러가 발생해서 화면이 제대로 나타나지 않았음.

담당자가 클러스터링된 서버에서 어떤 서버인지 확인을 해줬다.
3대의 서버에서 에러가 발생하는 JSP를 가져와서 WinMerge로 비교해 보니 에러가 나는 서버의 JSP 파일이 다름.
개발자는 해당 파일을 수정하지 않았다고 함.
음...
정상적으로 동작하는 서버의 파일을 넣어주니 제대로 동작함.

여러 대의 서버로 구성된 환경에서 소스를 변경할 때 일부분만 적용되어서 문제가 발생한다.
이에 대한 방지책이 있어야 할거 같다.
==>[todo] 소스관리 및 적용 프로세스를 만들자.

Tip) 브라우저가 접속된 서버가 어떤 서버인지 알기 위해 서버구분문구를 넣어서 파일을 넣어둔다.
- Server01 서버
/whoami.html
Server01

- Server02 서버
/whoami.html
Server02

- Server03 서버
/whoami.html
Server03

JSP를 수정해도 반영되지 않는 경우

예전에(2002년도) WebLogic을 사용한 프로젝트에서 개발자들이 소스를 Samba를 통해서 올렸다.
그런데 아무리 파일을 새로 올려도 수정되지 않았다.
그러던 중 어떤 개발자가 touch로 파일수정시간을 갱신해서 해결했다.

얼마전 작업한 소스를 서버에 올렸는데 작업한 부분이 반영되지 않았다.
AP서버는 SunOne이었고, Windows환경이었다.
아무래도 이 경우도 JSP파일이 변경된 것을 서버에서 알지 못해서 그런거 같다.
파일을 복사해서 붙여넣는게 아니라 수정하니깐 JSP가 컴파일된다.

HTTP Error 405 - Method Not Allowed

동일한 설정의 프로그램에서 일부 프로그램에서만 다음과 같은 에러가 발생한다.
Live Http Headers 로 원인을 파악했다.
SunOne 서버에서 발생했는데 원인을 모르겠다.
일단 GET 방식으로 해결을 했음.


Firefox Add-on : http://livehttpheaders.mozdev.org/
파폭 만세~~

시스템 Hangup 현상 분석

Z건설사 시스템이 페이지가 열리지 않는 경우가 발생함.

[todo] 스레드덤프를 남겼지만 분석을 하지 못함.

어디에서 발생하는 에러인지 원인이 WAS인지 DB인지 파악도 안됨.

DBCP 설정에서 removeAbandoned, logAbandoned를 true로 두고 모니터링을 함.

예외처리도 정확하게 되었지만 Connection이 닫히지 않아 누수가 되고 있다.

[todo] 스레드덤프받아서 분석해보자.

javap로 클래스 파일 버전 확인

> javap -verbose EDIReply
Compiled from "EDIReply.java"
public class com.edi.intra.EDIReply extends com.edi.intra.EDIBase
  SourceFile: "EDIReply.java"
  minor version: 0
  major version: 46
  Constant pool:
const #1 = class    #2;    //  com/edi/intra/EDIReply
const #2 = Asciz    com/edi/intra/EDIReply;

- ClassNotFoundException이 발생했음. 웹로직에서 런타임 버전과 컴파일된 클래스의 버전이 다른 경우에 발생하였다는 말에 javap 명령으로 버전 확인

[todo] os, 자바 시스템 프로퍼티를 확인해 볼 것. 현재 서버에 구동되고 있는 클래스파일의 버전 확인해 볼것.

java.lang.UnsupportedClassVersionError

java.lang.UnsupportedClassVersionError: spring/TestGreeting (Unsupported major.minor version 49.0) java.lang.UnsupportedClassVersionError: Bad version number in .class file

위 상황은 6.0에서 컴파일한 클래스를 5.0에서 돌렸을 때 발생
아마 5.0에서 컴파일한 클래스를 그 하위 버전에서 실행시켰을때 일거 같다.

 

Exception in thread "main" java.lang.UnsupportedClassVersionError: Xxx has been compiled by a more recent version of the Java Runtime (class file version 59.0), this version of the Java Runtime only recognizes class file versions up to 52.0

STS - Java Build Path - JRE 1.8, Project Facets - Java 1.4 였음. 1.8로 설정해서 처리

 

클래스 버전(java.class.version)

  • version 50.0 : 6.0
  • version 49.0 : 5.0
  • version 48.0 : 1.4
  • 46 이 1.2 라고는 하지만, 이 문서에서는 1.4.1
    Eclipse에서 Generated .class files compatibility를 1.2로 했을 때 46으로 나타남.

 

ORA-01461: LONG 값은 LONG 열에만 입력할 수 있습니다

- K조합 G시스템 연계모듈(L건설)
ORA-01461: LONG 값은 LONG 열에만 입력할 수 있습니다

- CLOB 컬럼에 1287 byte의 데이터를 넣는데 에러가 발생

- 사용되는 드라이버의 위치를 찾아서 크기를 보니 1.33MB (1,397,543 바이트)
jar:file:/LConsB2B/jeus/jeus5/lib/datasource/ojdbc14.jar!/oracle/jdbc/driver/OracleDriver.class

- WAS : JEUS 5
Servlet : 2.4
JSP : 2.0
ServerInfo : Jeus Web Container

os.name=HP-UX
user.language=ko
java.version=1.4.2.17

- 최신 드라이버로 교체하면 됨.
그러나 여러 시스템이 해당 WAS를 사용하고 있어서 교체하기가 힘듬.
드라이버 위치도 JEUS/lib/datasource/ 임.

- KGModlue/WEB-INF/lib/ojdbc14.jar 를 사용하도록 클래스로딩 순서를 변경
jeus-web-dd.xml 에서 webinf-first 를 true로 설정하고 JEUS를 재기동해도 안됨.

- 확인해 본 결과 JEUS/lib/ 내에 있으면 JEUS 기동시 System Classloader 에 포함되므로 클래스로딩 순서를 변경할 수 없다.

- 결국은 JEUS/lib/datasource/ 의 오라클 드라이버를 교체해서 해결함.


Open quote is expected for attribute "{1}" associated with an element type "parameterClass".

java.lang.RuntimeException: Error occurred. 
Cause: com.ibatis.common.xml.NodeletException: Error parsing XML. 
Cause: java.lang.RuntimeException: Error parsing XPath '/sqlMapConfig/sqlMap'. 
Cause: com.ibatis.common.xml.NodeletException: Error parsing XML. 
Cause: org.xml.sax.SAXParseException: Open quote is expected for attribute "{1}" associated with an  element type  "parameterClass".
    at com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser.parse(SqlMapConfigParser.java:49)
    at com.ibatis.sqlmap.client.SqlMapClientBuilder.buildSqlMapClient(SqlMapClientBuilder.java:63)


” 를 " 로 바꾼다.

테이블을 수정할 수 없습니다./제한 시간이 만료되었습니다.

모'TB_TEMP' 테이블
- 테이블을 수정할 수 없습니다.
제한 시간이 만료되었습니다. 작업을 완료하기 전에 제한 시간이 경과되었거나 서버가 응답하지 않았습니다.

SQL Server에서 테이블을 수정하는데 시간이 오래 걸리더니 수정되지 않는다.
데이터가 그렇게 많지도 않았다.

- 확인
sp_lock
sp_who

- 작업모니터(관리)

- 51 번 프로세스를 kill 해도 죽지 않는다.
그냥 야간에 데이터베이스를 재기동시켰음.

Tomcat 에 Heap 메모리 할당하기

Q사 T시스템 사이트가 열리지 않는 경우가 발생

Tomcat 구동시 Heap 메모리를 증가시켰는데도 Hangup 현상이 계속 발생함.

# ps -efx | grep java //x 옵션을 사용해서 프로세스를 확인
root 10733     1  0  5월 15  ?         2:56 /opt/java1.5/bin/IA64N/java -Dserver.type=real -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -XdoCloseWithReadPending -Djava.endorsed.dirs=/opt/WS/tomcat/common/endorsed -classpath :/opt/WS/tomcat/bin/bootstrap.jar:/opt/WS/tomcat/bin/commons-logging-api.jar -Dcatalina.base=/opt/WS/tomcat -Dcatalina.home=/opt/WS/tomcat -Djava.io.tmpdir=/opt/WS/tomcat/temp org.apache.catalina.startup.Bootstrap start
oracle 12243 12238  0  2월 19  ?        94:04 /oracle/app/oracle/product/10g/db_1/jdk/bin/IA64N/java -server -Xmx256M -XX:MaxPermSize=96m -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40 -XdoCloseWithReadPending -DORACLE_HOME=/oracle/app/oracle/product/10g/db_1 -Doracle.home=/oracle/app/oracle/product/10g/db_1/oc4j -Doracle.oc4j.localhome=/oracle/app/oracle/product/10g/db_1/HOST/sysman -DEMSTATE=/oracle/app/oracle/product/10g/db_1/HOST -Doracle.j2ee.dont.use.memory.archive=true -Djava.protocol.handler.pkgs=HTTPClient -Doracle.security.jazn.config=/oracle/app/oracle/product/10g/db_1/oc4j/j2ee/OC4J_DBConsole_HOST/config/jazn.xml -Djava.security.policy=/oracle/app/oracle/product/10g/db_1/oc4j/j2ee/OC4J_DBConsole_HOST/config/java2.policy -Djava.security.properties=/oracle/app/oracle/product/10g/db_1/oc4j/j2ee/home/config/jazn.security.props -DEMDROOT=/oracle/app/oracle/product/10g/db_1/HOST -Dsysman.md5password=true -Drepapi.oracle.home=/oracle/app/oracle/product/10g/db_1 -Ddisable.checkForUpdate=true -Djava.awt.headless //이놈은 뭘까?

프로세스를 확인해보니 옵션이 적용되지 않았다.[각주:1]

catalina.sh에 CATALINA_OPTS="$CATALINA_OPTS -server -Xms1024m -Xmx2048m" 을 추가했는데도...

확인해보니 catalina.sh에서 setenv.sh을 호출하는데 거기에서 CATALINA_OPTS="-XdoCloseWithReadPending" 이러고 있다.(Tomcat 구동 쉘/배치파일 분석 참고)
윽...

setenv.sh에 설정옵션을 넣고 재구동시킴.

JAVA_OPTS="-Dserver.type=real" //real 보다는 prod가 낫지 않나?
CATALINA_OPTS="$CATALINA_OPTS -server -Xms512m -Xmx1024m -XX:MaxPermSize=256m"
umask 072 //Tomcat 루트권한으로 구동되므로 생성되는 파일을 다른 사용자도 확인가능하도록 한다.

며칠 지켜봐야 할거 같다.


  1. ps -ef 로만 확인하니깐 그렇다. 사소한 것도 확인하도록~ [본문으로]

Eclipse에서 Checkout Projects from SVN이 보이지 않는다.

New Project에서 Checkout Projects from SVN이 보이지 않는다.
왜지?
Subclipse 기능은 문제없이 사용하고 있음.

플러그인이 문제가 있나해서 플러그인을 확인해 봄.

Subclipse 는 아이콘이 깨진 형태임.
이걸 보면 플러그인에 문제가 있나 했다.
서명여부임. 바부.

SVN Repository Exploring 퍼스펙티브에서 Checkout 하면 되기는 함.

오라클 에러 모음

- ORA-12547

  • K조합 데이터베이스(9i) 에 PuTTY 로 터널링해서 TOAD 로 접속시 발생
  • PuTTY 터널링 설정이 잘못 되었음.

 

 

Javascrpt 개체 접근하기

개체가 여러개인 경우만 고려한 코딩이 많다.[각주:1]
개체가 없거나 1개인 경우도 고려해야 한다.

- 아래와 같이 호출하는 경우는 단일개체로 처리해야 한다. 배열이 아님.


  1. 항상 경계를 고려해야 함 [본문으로]

멤버변수 문제점

대충 이런 코드인데,
UnavailableException 이 발생한 뒤부터 예외가 발생하지 않아도 result 는 / 이다.
로거를 찍어봐도 예외는 발생하지 않는데 result 는 / 다.

문제는 next 변수를 잘못 사용했기 때문에 발생했다.
NoticeCommand 는 한번 생성한 뒤 계속 재사용되므로 next 변수를 변경하지 말던가 로컬변수로 돌린다.
웹 환경의 다중 스레드에 의해서 접근되는 경우 더욱 조심해야 한다.

변경 쿼리문 실행시 반드시 트랜잭션 걸 것! /////운영팁, 쿼리문에 변경할 데이터 조건에 거는거


업데이트 구문을 실행하기 전에 데이터를 확인하기 위해 위와 같이 쿼리를 사용하곤 한다.
그런데 실수로 SELECT 절의 주석을 없애고 실행시켰다.
그 결과 모든 데이터의 col1 이 test 로 되버렸다.
헉...

예전에 카드결제 데이터 몇 천건 말아먹은 적이 있는데[각주:1] 그 이후로 사소한 변경 쿼리문에서도 트랜잭션을 걸었다.
몇 년이 지나서 요즘 귀찮아서 트랜잭션을 안걸었는데 딱 걸렸다.
다행히 테스트 디비라 관계없지만 조심해야겠다.



  1. 뭔가 잘못되었다는 것을 알았을때 땀방울이 등을 타고 내렸다. [본문으로]

Eclipse 구동시 에러

- JVM Terminated. Exit code=-1
검색해 보니 여러 경우가 있는데 나는 eclipse.ini에서 -Xmx 값을 조금 낮췄다.

-XX:MaxPermSize를 조절하라고도 한다.

- Failed to create the Java Virtual Machine
javaw위치를 지정하라고 한다.
그런데 java_home도 지정되어 있음. 환경변수에

Perm 크기 조정
--launcher.XXMaxPermSize
128M //286에서
...
--launcher.XXMaxPermSize
128m

문제 해결의 시작은 에러메세지

03-03 17:26:59 ERROR xxx.sm.model.XX1234DAO.insertDetail(XX1234DAO.java:395) - com.microsoft.sqlserver.jdbc.SQLServerException: 고유 인덱스가 'PK_XX_DETAIL'인 개체 'dbo.XX_DETAIL'에 중복 키 행을 삽입할 수 없습니다.

테이블 구조를 살펴봤다.
PK 가 중복될수가 없는데...
넘어오는 데이터를 모두 비교하고 데이터베이스에 들어간 데이터를 점검해봐도 중복될 수가 없는데...
나중에는 클래스 디컴파일까지.


Unique Index 가 걸려 있었다.
에러메세지를 천천히 잘 읽어봤으면 금방 해결했을건데.
PK_XX_DETAIL 라고 하니 당연히 테이블 디자인에서 만 확인했다.

해당 테이블에서 PK 가 변경되었는데 ERWin 에서 작업하다 보니 이전 PK 가 Unique Index 로 남아 있었다.

유지보수 - 소스

- 아주 긴 클래스에서 개발자가 소스를 수정하다가 현재 작업중인 부분과 전혀 상관없는 아래 코드를 잘못 수정했다.
이런 실수를 방지할 수 있는 방법은 없을까?
- 아래와 같은 JSTL 이 지금까지 에러 안나고 있었음
이전 환경 : Tomcat 5.0 이나 Resin 3.0.25
Tomcat 6.0.18 에서 에러 발생

자바스크립트 문자열에 특수문자가 들어가서 에러가 나는 경우

\로 처리해 주면 된다.

- 파일 인코딩이 잘못된 경우에도 발생할 수 있다.