Caused by: java.lang.StackOverflowError at lombok.core.AST.fieldsOf(AST.java:234) at lombok.javac.JavacAST.drill(JavacAST.java:506) 에 대한 고찰

Yunny.Log ·2023년 2월 18일
0

Debugging

목록 보기
66/69
post-thumbnail

에러 stack trace

Caused by: java.lang.StackOverflowError
at lombok.core.AST.fieldsOf(AST.java:234)
at lombok.javac.JavacAST.drill(JavacAST.java:506)
at lombok.javac.JavacAST.buildStatementOrExpression(JavacAST.java:476)
at lombok.javac.JavacAST.buildTree(JavacAST.java:285)
at lombok.javac.JavacAST.buildTree(JavacAST.java:1)
at lombok.core.AST.buildWithField0(AST.java:394)
at lombok.core.AST.buildWithField(AST.java:292)

에러가 난 상황 & 트러블 슈팅

  • docker로 배포해보고자 jar 파일이 필요한 상황이었습니다.

  • 그런데 graldew build 를 통해서 jar을 생성하려고 시도할 때마다 위와 같은 에러 상황이 발생하는 것이다.

  • IDE 인 intelliJ에서는 Setting에서
    Setting > Compiler > VM optionsXss4m 로 설정 (관련 디버깅 글)해줌으로써 스택의 사이즈를 늘려주니 IDE 상에서 BUILD 및 RUN은 수행이 됩니다.

    • 참고로 다음은 스택의 옵션입니다. Xss4m 로도 안되면 더 큰 스택 사이즈로 옵션을 지정해주면 됩니다.
  • 이를 통해 gradlew build 를 통한 빌드를 진행할 시에도 JVM Option 에 스택 사이즈 설정 옵션을 더해주면 될 것이라는 추측이 들었습니다.

시도 1 : gradlew

  • 해당 파일에 org.gradle.jvmargs=-Xss5m 을 넣었으나 적용되지 않았습니다.

시도 2 : build.gradle

  • build.gradle
  • 적용되지 않았습니다.

시도 3 : gradlew.properties

스택오버플로우 링크

  • gradlew.properties 에 아래와 같이 jvmargs 로 jvm의 argument에 스택 사이즈 증가 속성을 더해주고 graldew build를 수행하니 성공적으로 build 됐습니다.
org.gradle.jvmargs=-Xss5m
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.configureondemand=true

인텔리제이 환경이라면?

  • 이때 인텔리제이를 ide 로 사용하고 있다면 빌드 옵션을 아래와 같이 설정해줘야 합니다.

  • 이후 컴파일 옵션에서 스택 사이즈를 늘려주면 됩니다.

org.gradle.jvmargs ?

=> Specifies the JVM arguments used for the daemon process.The setting is particularly useful for tweaking memory settings.

PLUS : 대체 lombok 의 AST ?

  • 에러메시지를 보면서 감이 안잡혔던 부분은 바로 lombok에서 아래와 같은 buildTree 부분이었습니다.

  • AST 내용 / 사진 출처 : https://www.happykoo.net/@happykoo/posts/256

  • 한번도 롬복의 구현 과정을 알아본 적이 없었기에, 롬복이 트리 구조를 사용하나!? 라는 호기심에 알아보았습니다.

  • AST 는 Abstract Syntax Tree라고 합니다.

  • 프로그래밍 언어로 작성된 소스 코드를 분석하여 추상적인 노드 형태의 트리로 구성한 것이라고 합니다.

  • 프로그래밍 언어 소스는 컴파일러(자바- javac)에 의해 컴파일 과정에서 AST를 구성하게 된다고 합니다.


EXAMPLE OF AST : @Setter 구현 과정

  • 사진 출처 : https://www.happykoo.net/@happykoo/posts/256
    @Setter

  • 각 소스코드는 컴파일 과정 결국 트리 구조를 통해 구성이 된 후, 연관관계를 트리로서 수립하고 호출한다는 새로운 사실을 알게됐습니다.

REFERENCE

https://github.com/projectlombok/lombok/issues/1118

https://github.com/projectlombok/lombok/issues/2453

Lombok implementation

https://www.happykoo.net/@happykoo/posts/256

Lombok의 AST : AST(Abstract Syntax Tree)

출처 : https://www.happykoo.net/@happykoo/posts/256

AST(Abstract Syntax Tree) 란, 프로그래밍 언어로 작성된 소스 코드를 분석하여 추상적인 노드 형태의 트리로 구성한 것을 말합니다.

자바 뿐만 아니라 대부분의 프로그래밍 언어로 작성된 소스(개발자에 의해 작성된 소스)는 컴파일러(자바에서는 javac)에 의해 컴파일 과정에서 AST를 구성하게 됩니다.

AST 는 프로그램 코드(소스)의 구조를 표현하는 프로퍼티이며, 컴파일러의 구문 분석 결과물이라고 할 수 있습니다.

다만, 모든 세세한 정보를 나타내지는 않기에 (세미콜론, 괄호, 구두점, 주석 생략) AST 로부터 원래 소스로 완벽하게 복구하는 것은 거의 불가능합니다.

2개의 댓글

comment-user-thumbnail
2023년 8월 19일

오타가 있어서 정정합니다.
gradle.properties에 "org.gradle.jvmargs=-Xss25m" 이 내용을 넣는 것이 내용적으로 맞지만,
gradlew.properties 이 아니고 gradle.properties 입니다.

그리고 gradle.properties 파일은 기본으로 존재하는 파일이 아니니 project 폴더에 최상위에 만들어주시면 됩니다.

그리고 나서 gradle wrapper 를 해주시면 gradlew 로 build가 잘됩니다.

저의 경우는 윈도우여서 아래 명령어로 build 했습니다. compileTestJava 는 에러가 나더라구요 test 코드에 에러가있나봐용~~ ㅎ

./gradlew.bat clean build -x compileTestJava --stacktrace

좋은 지식 감사합니다.

1개의 답글