2009-10-13 5 views
11

원격으로 실행해야하는 Tomcat 인스턴스에서 Eclipse TPTP 메모리 프로파일 링을 설정하는 데 지난 4 시간을 보냈습니다 (예 : Eclipse가 아님). 이는 TPTP 및 상담원 컨트롤러 설명서에 따라 가능해야합니다.Java JVMTI가 -Xdebug -Xrunjdwp와 함께 작동하지 않습니다.

웹 사이트의 지침에 따라 에이전트 컨트롤러와 함께 Eclipse (Galileo) 워크 벤치에 TPTP 구성 요소 (4.6.0)를 설치했습니다.

-agentlib:JPIBootLoader=JPIAgent:server=enabled;HeapProf:allocsites=true 

과 PATH의 전면에 다음 디렉토리를 추가 :

D:\dev\tools\ac\plugins\org.eclipse.tptp.javaprofiler 
D:\dev\tools\ac\bin 

를 시도 에이전트를 사용하려면, 나는 톰캣 인스턴스를 시작하는 명령 라인에 다음과 같은 옵션을 추가 Tomcat을 시작 나는 일관되게 다음과 같은 오류 메시지를 받았습니다 :

ERROR: JDWP unable to get necessary JVMTI capabilities. ["debugInit.c",L279] 

나는 인터넷 검색을 많이 했어요을하지만 아무것도 releva 발견 nt; 나는 TPTP와 다양한 버전의 Agent Controller를 재설치했다.

가 결국 문제는 내가 catalina.bat는 "JPDA 제거"

-Xdebug -Xrunjdwp:transport=..... 

로 변환하는 "JPDA"옵션으로 톰캣 를 시작되었다는 것을 밝혀졌다 명령 인수는 JVMTI 시작 원인 일.

그럼 질문은 : 에 대한 검색 중에 아무 것도 발견되지 않아서 JVMTI 에이전트가 디버깅과 호환되지 않음을 나타냅니다. 누군가 무슨 일이 일어나고 있는지, 왜 JVMTI + JDWP가 설정이 유효하지 않은지 설명 할 수 있습니까?

답변

20

지금까지 답변이 정답이 아니며 언급 된 오류를 쿼리하면 Google에서 처음으로 발생하는 히트이므로 일부 설명이 필요하다고 생각합니다.

JVMTI 및 JDWP do do는 실제로 함께 사용해야합니다. 명령 행에서 -Xrunjdwp (및/또는 가능하면 -agentlib:jdwp)을 두 번 이상 지정하면 ERROR: JDWP unable to get necessary JVMTI capabilities이 표시됩니다. 문제를 해결하려면 명령 줄에 -Xrunjdwp 또는 -agentlib:jdwp 중 하나만 있어야합니다.

은 자세한 내용

JVMTI (Java 가상 머신 툴 인터페이스)

는 JVMDI의 후속 (자바 가상 머신 디버그 인터페이스) 및 JVMPI (Java 가상 머신 프로파일 링 인터페이스)입니다 ... 읽어. JVMDI와 JVMPI의 기능을 모두 갖추고 있으며, Java 5에서는 더 이상 사용되지 않으며 Java 6에서는 제거되었습니다. 디버깅 및 프로파일 링을 위해 JVM의 내부를 노출하는 API입니다.

JDWP (Java Debug Wire Protocol)는 명령과 응답을 전송하기위한 간단한 메커니즘을 설명하는 프로토콜입니다. 내가 아는 한, JVM 외부에있는 디버거가 JVMTI와 통신하고 JVMTI와 인터페이스 할 수있는 유일한 방법입니다.

JDI (Java Debugger Interface)는 JDWP를 다소 투명하게 사용하면서 JVMTI의 일부 기능을 노출하는 클라이언트 측 (디버거 측) API입니다.

Bob Dobbs의 답변에 언급 된 bug은 오해의 소지가있는 오류 메시지와 JVM이 JDWP를 명령 줄에 지정할 때마다 한 번씩로드하려고한다는 사실과 관련이 있습니다. JDWP와 JVMTI를 함께 사용할 수없는 곳은 어디에도 없습니다.

여기

더 많은 정보 : 나를 위해 http://publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/rzaha/jpdebuga.htm

+0

그래서 프로파일 링과 함께 원격 디버깅을 동시에 사용할 수 있습니까? –

+1

@michael 나는 그렇게 믿는다. 그러나 메모리 누수 나 거대한 CPU 스파이크를 재현하려는 시도에서 이상한 조건을 모방하려고하지 않는다면 나쁜 생각처럼 디버깅하는 동안 프로파일 링을하지 않겠는가? –

+0

좋은 답변입니다. 이 오류가 발생했습니다. 이전 Sun App Server에서 디버그 모드를 비활성화해야만 YourKit 프로파일 러 구성을 사용할 수있었습니다. 고맙습니다! – jlpp

3

나는 당신과 같은 문제에 부딪 쳤지 만, 문제에 대한 의견을 밝힌 JVM 버그 보고서 (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6354345)를 생각해 냈습니다. 기본적으로 Java 에이전트 라이브러리는 동일한 VM에 두 번로드되지 않습니다. 사기는하지만, 동시에 둘 다 할 수없는 에이전트 시스템의 기본 한계처럼 보입니다.

+0

정보 주셔서 감사합니다. –

1

는 그들이 -Xrunjdwp이, 두 번째 -Xrunjdwp이 변수 %JAVA_OPTIONS%에 숨겨져 등이 있었다 실현 응용 프로그램을 확인하지 않은 중복 있었다, 코드 블링 포스트와 같은 문제가 있었다 서버 시작 스크립트.