naver / scavenger

A runtime dead code analysis tool
Apache License 2.0
400 stars 43 forks source link

no methods are found #108

Open NineTIN opened 10 months ago

NineTIN commented 10 months ago

안녕하세요. Scavenger 도입을 검토 중인데, Spring Boot 애플리케이션에 Scavenger Agent를 적용했을 때 아래와 같은 메시지가 나타나며 메소드들을 찾을 수 없다고 합니다.

[0.004s][warning][arguments] -XX:+TraceClassUnloading is deprecated. Will use -Xlog:class+unload=info instead.
Nov 27, 2023 6:59:35 PM com.navercorp.scavenger.javaagent.ScavengerAgent premain
INFO: [scavenger] scavenger agent version 1.1.0 is starting...
Nov 27, 2023 6:59:35 PM com.navercorp.scavenger.javaagent.util.ConfigUtils locateConfigFile
INFO: [scavenger] config file found explicitly: /home/user/config/scavenger/scavenger.conf

███████╗ ██████╗ █████╗ ██╗   ██╗███████╗███╗   ██╗ ██████╗ ███████╗██████╗
██╔════╝██╔════╝██╔══██╗██║   ██║██╔════╝████╗  ██║██╔════╝ ██╔════╝██╔══██╗
███████╗██║     ███████║██║   ██║█████╗  ██╔██╗ ██║██║  ███╗█████╗  ██████╔╝
╚════██║██║     ██╔══██║╚██╗ ██╔╝██╔══╝  ██║╚██╗██║██║   ██║██╔══╝  ██╔══██╗
███████║╚██████╗██║  ██║ ╚████╔╝ ███████╗██║ ╚████║╚██████╔╝███████╗██║  ██║
╚══════╝ ╚═════╝╚═╝  ╚═╝  ╚═══╝  ╚══════╝╚═╝  ╚═══╝ ╚═════╝ ╚══════╝╚═╝  ╚═╝

                 agent version :: 1.1.0
               config location :: /home/user/config/scavenger/scavenger.conf
                       api key :: dd64eb04-21ad-46c6-880d-387c74bd5611
                    server url :: http://api server IP:8080
                      app name :: example
                   app version :: 1.0.0
                   environment :: dev
                       package :: com.example.application
             method visibility :: protected
          exclude constructors :: true
      exclude setters, getters :: true
                      hostname :: api-server1-dev
     async code base scan mode :: false
     legacy compatibility mode :: false

Nov 27, 2023 6:59:35 PM com.navercorp.scavenger.javaagent.collecting.CodeBaseScanner scan
INFO: [scavenger] codebase(735365b464581d476999a11693aa774b7e6bc7eb80917673f2b97b36b839c6dd) scanned in 7 ms: 0 methods
Nov 27, 2023 6:59:35 PM com.navercorp.scavenger.javaagent.ScavengerAgent scanCodeBase
SEVERE: [scavenger] no methods are found
Nov 27, 2023 6:59:35 PM com.navercorp.scavenger.javaagent.ScavengerAgent premain
WARNING: [scavenger] scavenger is disabled

package명이나 jar 파일의 위치, conf 파일 설정 등을 확인해보았지만, 이렇다 할 문제는 발견되지 않았습니다. 어떤 상황에서 메소드 스캔이 이루어지지 않는지와 이를 해결할 수 있는 방법에 대해 알려주실 수 있나요? 감사합니다.

sohyun-ku commented 10 months ago

@NineTIN

안녕하세요. codeBase 위치가 잘못되었을 경우 메소드 스캔이 이루어지지 않을 수 있습니다. 참고하시면 좋을만한 Configuration 가이드 전달드립니다.

해당 설정 확인 후에도 정상적으로 동작하지 않는다면 scavenger.conf 파일 공유 부탁드리겠습니다.

NineTIN commented 10 months ago

@sohyun-ku 안녕하세요 답변 감사드립니다. Configuration 가이드를 참고하여 codeBase를 설정 해보았으나 해결이 되지않아 scavenger.conf를 첨부 드립니다.

scavenger.conf.zip

번거롭게 합니다만 확인 부탁드리겠습니다. 감사합니다.

taeyeon-Kim commented 10 months ago

@NineTIN 안녕하세요. ( ) 공유주신 설정과 로그상으로는 정보가 너무 제한적이라 확인이 어렵긴합니다...
로그상으로는 설정파일은 잘읽었으나 에이전트가 bootJar를 탐색할 때 com.example.application 패키지에 위치한 클래스(메소드)를 읽지 못했다로 보이긴합니다..

혹시 재현가능한 환경(jar와 사용하시는 jdk버전)을 공유주시기는 어려우실까요??

NineTIN commented 10 months ago

@taeyeon-Kim 안녕하세요, 더 자세한 정보를 제공하지 못해 죄송합니다. 문제가 재현되는 프로젝트를 아래 리포지토리에 업로드해두었습니다. 확인해주시면 감사하겠습니다.

JDK : 11 https://github.com/NineTIN/scavenger-test

그런데 여러 가지를 시도해본 결과, gradle의 bootJar 설정을 제거하니 정상적으로 스캔되는 현상을 발견해서 추가로 알려드립니다. 🤔

https://github.com/NineTIN/scavenger-test/blob/f8f97608fcd0b36bd4750c2349f805ebfda6185b/application/build.gradle.kts#L40-L44

taeyeon-Kim commented 10 months ago

@NineTIN 넵 확인했습니다. 혹시 bootJar task에 launchScript()를 추가하셔야하는 이유가 있을까요?? jar파일을 직접 실행하고 있지않고 java -jar로 수행하고 계시다면 해당 설정은 필요없어 보여 제거하면 될 것 같습니다.

NineTIN commented 10 months ago

@taeyeon-Kim 특별한 이유는 없이, 스프링 애플리케이션을 데몬 서비스로 등록하여 사용할 수 있게 하는 옵션 정도로 생각하고 자연스럽게 추가했던 것 같습니다. 말씀하신 대로 java -jar로 애플리케이션을 실행하고 있으니 launchScript()는 제거하도록 하겠습니다. 확인해주셔서 감사합니다.

그런데 한 가지 마음에 걸리는 점이 있습니다. launchScript()는 데몬 서비스 사용을 강제하는 옵션이 아니라고 알고 있는데, 이 설정이 Scavenger에 어떤 영향을 끼쳤다는 말씀이실까요?

sohyun-ku commented 10 months ago

@NineTIN

launchScript() 추가 시 agent의 codeBase 탐색과정에서 클래스 파일 정보를 가져오지 못하는 이슈가 있는 것으로 확인했습니다. 해당 옵션이 꼭 필요한 케이스가 아니라면 우선 제외 후 사용 부탁드립니다. ( )

kojandy commented 10 months ago

@NineTIN 안녕하세요. 해당 설정이 어떠한 영향을 끼쳤는지 간략하게 설명 드리자면, launchScript()를 추가하신 뒤에 생성된 jar를 보시면 일반적인 jar가 아니고 셸 스크립트가 앞부분에 추가되어 있는 형태인 것을 확인하실 수 있습니다. 이는 systemd 등에 데몬 서비스로 등록할 때 자바의 경로를 찾는 등의 수고를 덜기 위해 직접 실행 가능하도록 해당 과정이 포함된 셸 스크립트가 생성되는 것인데요.

Scavenger는 탐색 과정에서 확장자가 jar인 파일을 마주치게 되면 해당 파일을 압축 파일로 취급하여 클래스 파일들을 추출하려는 시도를 하게 되는데, 이 과정에서 정상적인 압축 파일이 아니라 판단하여 해당 파일을 무시하게 됩니다.

launchScript() 설정을 사용하여 생성된 jar가 몇몇 툴들과 호환되지 않을 수 있다는 내용은 Spring Boot의 문서에도 간략하게 언급되어 있습니다.