반응형

com.sun.jdi.AbsentInformationException은 자바 디버거 인터페이스(Java Debug Interface, JDI)에서 발생하는 예외입니다.

이 예외는 디버깅 중에 메소드 또는 클래스에 대한 소스 코드 정보가 없을 때 발생합니다. 예를 들어, 디버깅 중에 클래스 파일이 디컴파일된 경우 또는 디버깅 정보가 포함되어 있지 않은 클래스 파일을 디버깅하려고 할 때 발생할 수 있습니다.

이 예외는 일반적으로 디버거가 소스 코드 정보를 검색하거나 표시하지 못할 때 발생합니다. 이 경우 디버거는 해당 정보가 없음을 나타내기 위해 이 예외를 발생시킵니다.

따라서 이 예외는 디버깅 프로세스를 방해할 수 있으므로 가능한 경우 소스 코드 정보가 포함된 클래스 파일을 사용하는 것이 좋습니다. 그렇지 않으면 디버깅 프로세스가 어렵고 시간이 오래 걸릴 수 있습니다.

 

com.sun.jdi.AbsentInformationException은 JDI API의 일부이며, 디버깅 중에 예외가 발생하면 JDI 클라이언트는 해당 예외를 처리해야 합니다. 예외 처리는 일반적으로 try-catch 블록을 사용하여 수행됩니다.

이 예외는 JDI에서 다음과 같은 상황에서 발생할 수 있습니다.

-소스 코드 정보가 없는 클래스 파일 디버깅
-클래스 파일에 소스 코드 정보가 있지만 디버거가 해당 정보를 검색하지 못할 때
-디버그 정보가 있는 클래스 파일이지만 디버깅 중에 로드되지 않은 경우


이 예외는 JDI의 일부이므로 일반적으로 사용자가 직접 처리하기보다는 JDI 클라이언트 라이브러리가 처리하게 됩니다. 따라서 개발자가 이 예외를 명시적으로 처리해야 할 경우, JDI 클라이언트 라이브러리의 문서를 참조하여 적절한 처리 방법을 찾아야 합니다.

 

다음은 JDI API를 사용하여 디버그 정보가 없는 클래스 파일을 디버깅할 때 com.sun.jdi.AbsentInformationException이 발생하는 예제 코드입니다.

 

import com.sun.jdi.Bootstrap;
import com.sun.jdi.ClassType;
import com.sun.jdi.VirtualMachine;
import com.sun.jdi.connect.Connector;
import com.sun.jdi.connect.AttachingConnector;
import com.sun.jdi.connect.IllegalConnectorArgumentsException;
import com.sun.jdi.connect.VMStartException;
import com.sun.jdi.event.EventSet;
import com.sun.jdi.event.MethodEntryEvent;
import com.sun.jdi.event.MethodExitEvent;
import com.sun.jdi.event.VMDisconnectEvent;
import com.sun.jdi.event.VMDeathEvent;
import com.sun.jdi.request.EventRequestManager;
import com.sun.jdi.request.MethodEntryRequest;
import com.sun.jdi.request.MethodExitRequest;

import java.io.IOException;
import java.util.List;
import java.util.Map;

public class AbsentInformationExceptionExample {

    public static void main(String[] args) throws IOException, IllegalConnectorArgumentsException, VMStartException {
        // Connect to a running VM
        AttachingConnector connector = getAttachingConnector();
        VirtualMachine vm = connector.attach(getConnectionArgs(connector));

        // Get main class
        List<ReferenceType> classes = vm.classesByName("MyClass");
        if (classes.isEmpty()) {
            System.err.println("Class not found");
            System.exit(1);
        }
        ClassType mainClass = (ClassType) classes.get(0);

        // Create method entry/exit requests for all methods in the main class
        EventRequestManager erm = vm.eventRequestManager();
        for (Method method : mainClass.allMethods()) {
            MethodEntryRequest entryReq = erm.createMethodEntryRequest();
            entryReq.setSuspendPolicy(EventRequest.SUSPEND_ALL);
            entryReq.addClassFilter(mainClass);
            entryReq.addMethodFilter(method);
            entryReq.enable();

            MethodExitRequest exitReq = erm.createMethodExitRequest();
            exitReq.setSuspendPolicy(EventRequest.SUSPEND_ALL);
            exitReq.addClassFilter(mainClass);
            exitReq.addMethodFilter(method);
            exitReq.enable();
        }

        // Listen for events and print method entry/exit
        while (true) {
            EventSet eventSet = vm.eventQueue().remove();
            for (Event event : eventSet) {
                if (event instanceof MethodEntryEvent) {
                    MethodEntryEvent entryEvent = (MethodEntryEvent) event;
                    System.out.println("Entered method: " + entryEvent.method().name());
                } else if (event instanceof MethodExitEvent) {
                    MethodExitEvent exitEvent = (MethodExitEvent) event;
                    System.out.println("Exited method: " + exitEvent.method().name());
                } else if (event instanceof VMDisconnectEvent || event instanceof VMDeathEvent) {
                    System.out.println("VM disconnected");
                    return;
                }
            }
            eventSet.resume();
        }
    }

    private static AttachingConnector getAttachingConnector() throws IOException {
        List<AttachingConnector> connectors = Bootstrap.virtualMachineManager().attachingConnectors();
        for (AttachingConnector connector : connectors) {
            if ("com.sun.jdi.SocketAttach".equals(connector.transport())) {
                return connector;
            }
        }
        throw new IOException("No suitable connector found");
    }

    private static Map<String, Connector.Argument> getConnectionArgs(AttachingConnector connector) {
        Map<String, Connector.Argument> arguments = connector.defaultArguments();
        arguments.get("hostname").setValue("localhost");
        arguments.get("port").setValue("8000");
        return arguments

 

 

 

반응형

+ Recent posts