मैंने नहीं किया कि हालांकि अभी तक, लेकिन एक समाधान है, यदि आप उत्पादन envirionment पर फेंका अपवाद का पता लगाने की जरूरत नहीं है, अपने जावा अनुप्रयोग है कि जब भी एक अपवाद उठाया है शुरू किया जा सकता एक कस्टम डिबगर को संलग्न करने के लिए है के बारे में ।
इसे कैसे करना के बारे में यह फ्रेंच ब्लॉग लेख बात: Xdebug -Xrunjdwp: परिवहन = dt_socket, पता = 8000, सर्वर = y
डिबग के साथ रन: http://blog.xebia.fr/2011/12/12/legacy-code-gestion-des-exceptions-avec-jpda/
यहाँ कोड है , = n
कनेक्ट निलंबित JVM करने के लिए:
public static VirtualMachine connect(String port) throws IOException, IllegalConnectorArgumentsException {
AttachingConnector connector = null;
VirtualMachineManager vmManager = Bootstrap.virtualMachineManager();
for (Connector aconnector : vmManager.allConnectors()) {
if ("com.sun.jdi.SocketAttach".equals(aconnector.name())) {
connector = (AttachingConnector) aconnector;
break;
}
}
Map<String, Connector.Argument> args = connector.defaultArguments();
Connector.Argument pidArgument = args.get("port");
pidArgument.setValue(port);
return connector.attach(args);
}
अपने breakpoints बनाएँ। उदाहरण के लिए:
public static void createExceptionBreakPoint(VirtualMachine vm) {
EventRequestManager erm = vm.eventRequestManager();
List<ReferenceType> referenceTypes = vm.classesByName("java.lang.Throwable");
for (ReferenceType refType : referenceTypes){
ExceptionRequest exceptionRequest = erm.createExceptionRequest(refType, true, true);
exceptionRequest.setEnabled(true);
}
}
और फिर अपवाद संभाल:
public static void handleExceptionEvent(ExceptionEvent exceptionEvent) throws Exception {
ObjectReference remoteException = exceptionEvent.exception();
ThreadReference thread = exceptionEvent.thread();
List<Value> paramList = new ArrayList<Value>(1);
paramList.add(dumpFileName);
//crer un printStream dans la JVM cible
ObjectReference printStreamRef = printStreamClassType.newInstance(thread, printStreamConstructor, paramList,
ObjectReference.INVOKE_SINGLE_THREADED);
ReferenceType remoteType = remoteException.referenceType();
Method printStackTrace = (Method) remoteType.methodsByName("printStackTrace").get(1);
paramList.clear();
paramList.add(printStreamRef);
remoteException.invokeMethod(thread, printStackTrace, paramList, ObjectReference.INVOKE_SINGLE_THREADED);
Scanner scanner = new Scanner(new File(dumpFileName.value()));
while (scanner.hasNextLine()){
System.out.println(scanner.nextLine());
}
}
थोड़ा भारी है, लेकिन यह काम करता है, अब कैसे अपवाद लॉग इन कर रहे है कि और दूसरों को पकड़ने के लिए?
अरे कोई नहीं जानता? :) –
क्या आपके पास अच्छी कोड कवरेज के साथ यूनिट परीक्षण हैं? – pstanton