(no message)

This commit is contained in:
Eugene Zhuravlev
2005-01-31 18:44:26 +03:00
parent 72b1f707c2
commit b06b7d10fc
14 changed files with 98 additions and 71 deletions

View File

@@ -1,12 +1,10 @@
package com.intellij.debugger.actions;
import com.intellij.debugger.DebuggerManager;
import com.intellij.debugger.DebuggerManagerEx;
import com.intellij.debugger.engine.SuspendContextImpl;
import com.intellij.debugger.impl.DebuggerSession;
import com.intellij.debugger.impl.DebuggerSession;
import com.intellij.debugger.impl.DebuggerContextImpl;
import com.intellij.debugger.impl.DebuggerSession;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.DataConstants;
@@ -31,8 +29,10 @@ public class StepOverAction extends AnAction {
}
final DebuggerContextImpl context = (DebuggerManagerEx.getInstanceEx(project)).getContext();
DebuggerSession debuggerSession = context.getDebuggerSession();
final boolean isPaused = debuggerSession != null && debuggerSession.isPaused();
final SuspendContextImpl suspendContext = context.getSuspendContext();
final boolean hasCurrentThread = suspendContext != null && suspendContext.getThread() != null;
presentation.setEnabled(isPaused && hasCurrentThread);
}

View File

@@ -30,8 +30,12 @@ public class ContextUtil {
public static SourcePosition getSourcePosition(final StackFrameContext context) {
DebugProcessImpl debugProcess = (DebugProcessImpl)context.getDebugProcess();
if(debugProcess == null) return null;
if(context.getFrameProxy() == null) return null;
if(debugProcess == null) {
return null;
}
if(context.getFrameProxy() == null) {
return null;
}
Location location = null;
try {
location = context.getFrameProxy().location();

View File

@@ -1,5 +1,6 @@
package com.intellij.debugger.engine;
import com.intellij.debugger.DebuggerManagerEx;
import com.intellij.debugger.engine.events.DebuggerCommandImpl;
import com.intellij.debugger.engine.events.SuspendContextCommandImpl;
import com.intellij.debugger.engine.requests.LocatableEventRequestor;
@@ -8,18 +9,13 @@ import com.intellij.debugger.jdi.VirtualMachineProxyImpl;
import com.intellij.debugger.requests.Requestor;
import com.intellij.debugger.ui.breakpoints.Breakpoint;
import com.intellij.debugger.ui.breakpoints.LineBreakpoint;
import com.intellij.debugger.DebuggerManagerEx;
import com.intellij.debugger.DebuggerManagerEx;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Pair;
import com.intellij.util.concurrency.Semaphore;
import com.sun.jdi.*;
import com.sun.jdi.event.*;
import com.sun.jdi.request.EventRequest;
import javax.swing.*;
/**
* Created by IntelliJ IDEA.
* User: lex
@@ -39,10 +35,8 @@ public class DebugProcessEvents extends DebugProcessImpl {
super.commitVM(vm);
if(vm != null) {
vmAttached();
myEventThread = new DebuggerEventThread();
myEventThread.start();
}
}
@@ -177,13 +171,10 @@ public class DebugProcessEvents extends DebugProcessImpl {
EventQueue eventQueue = myVmProxy.eventQueue();
while (!isStopped()) {
try {
if (LOG.isDebugEnabled()) {
LOG.debug("Listening events");
}
final EventSet eventSet = eventQueue.remove();
if (LOG.isDebugEnabled()) {
LOG.debug("EventSet " + eventSet.toString() + ", suspendPolicy=" + eventSet.suspendPolicy() + ";size=" + eventSet.size());
LOG.debug("EVENTSET " + eventSet);
}
DebugProcessEvents.this.getManagerThread().invokeAndWait(new DebuggerCommandImpl() {
@@ -194,7 +185,7 @@ public class DebugProcessEvents extends DebugProcessImpl {
final Event event = eventIterator.nextEvent();
if (LOG.isDebugEnabled()) {
LOG.debug("Event : " + event);
LOG.debug("EVENT : " + event);
}
try {
if (event instanceof VMStartEvent) {
@@ -342,7 +333,9 @@ public class DebugProcessEvents extends DebugProcessImpl {
if (LOG.isDebugEnabled()) {
LOG.debug("STEPOUT doStep");
}
shouldResume = doStep(suspendContext.getThread(), hint.getDepth(), hint);
final ThreadReferenceProxyImpl threadProxy = suspendContext.getThread();
doStep(threadProxy, hint.getDepth(), hint);
shouldResume = true;
}
if(!shouldResume && hint.isRestoreBreakpoints()) {
@@ -352,7 +345,8 @@ public class DebugProcessEvents extends DebugProcessImpl {
if(shouldResume) {
getSuspendManager().voteResume(suspendContext);
} else {
}
else {
showStatusText("");
getSuspendManager().voteSuspend(suspendContext);
}

View File

@@ -144,9 +144,15 @@ public abstract class DebugProcessImpl implements DebugProcess {
if ("SENDS".compareToIgnoreCase(token) == 0) {
mask |= VirtualMachine.TRACE_SENDS;
}
else if ("RAW_SENDS".compareToIgnoreCase(token) == 0) {
mask |= 0x01000000;
}
else if ("RECEIVES".compareToIgnoreCase(token) == 0) {
mask |= VirtualMachine.TRACE_RECEIVES;
}
else if ("RAW_RECEIVES".compareToIgnoreCase(token) == 0) {
mask |= 0x02000000;
}
else if ("EVENTS".compareToIgnoreCase(token) == 0) {
mask |= VirtualMachine.TRACE_EVENTS;
}
@@ -212,26 +218,26 @@ public abstract class DebugProcessImpl implements DebugProcess {
/**
*
* @return
* @param stepThread
* @param depth
* @param hint may be null
*/
protected boolean doStep(ThreadReferenceProxyImpl stepThread, int depth, RequestHint hint) {
final ThreadReferenceProxyImpl currentThreadProxy = stepThread;
if (currentThreadProxy == null || !currentThreadProxy.isSuspended()) {
protected void doStep(final ThreadReferenceProxyImpl stepThread, int depth, RequestHint hint) {
/*
if (stepThread == null || !stepThread.isSuspended()) {
return false;
}
*/
if (LOG.isDebugEnabled()) {
LOG.debug("DO_STEP: creating step request for " + currentThreadProxy.getThreadReference());
LOG.debug("DO_STEP: creating step request for " + stepThread.getThreadReference());
}
deleteStepRequests(currentThreadProxy);
deleteStepRequests(stepThread);
EventRequestManager requestManager = getVirtualMachineProxy().eventRequestManager();
StepRequest stepRequest = requestManager.createStepRequest(currentThreadProxy.getThreadReference(), StepRequest.STEP_LINE, depth);
StepRequest stepRequest = requestManager.createStepRequest(stepThread.getThreadReference(), StepRequest.STEP_LINE, depth);
DebuggerSettings settings = DebuggerSettings.getInstance();
if (!(hint != null && hint.isIgnoreFilters()) && depth == StepRequest.STEP_INTO) {
if (settings.TRACING_FILTERS_ENABLED) {
String currentClassName = getCurrentClassName(currentThreadProxy);
String currentClassName = getCurrentClassName(stepThread);
if (currentClassName == null || !settings.isNameFiltered(currentClassName)) {
// add class filters
ClassFilter[] filters = settings.getFilters();
@@ -250,7 +256,6 @@ public abstract class DebugProcessImpl implements DebugProcess {
stepRequest.putProperty("hint", hint);
}
stepRequest.enable();
return true;
}
void deleteStepRequests(ThreadReferenceProxy requestsInThread) {
@@ -334,7 +339,9 @@ public abstract class DebugProcessImpl implements DebugProcess {
return connector.accept(myArguments);
}
finally {
if(myArguments != null) connector.stopListening(myArguments);
if(myArguments != null) {
connector.stopListening(myArguments);
}
}
}
else {
@@ -1172,9 +1179,10 @@ public abstract class DebugProcessImpl implements DebugProcess {
public void contextAction() {
showStatusText("Stepping into");
final SuspendContextImpl suspendContext = getSuspendContext();
RequestHint hint = new RequestHint(suspendContext, StepRequest.STEP_INTO);
final ThreadReferenceProxyImpl stepThread = suspendContext.getThread();
RequestHint hint = new RequestHint(stepThread, suspendContext, StepRequest.STEP_INTO);
hint.setIgnoreFilters(myIgnoreFilters);
doStep(suspendContext.getThread(), StepRequest.STEP_INTO, hint);
doStep(stepThread, StepRequest.STEP_INTO, hint);
super.contextAction();
}
}
@@ -1190,14 +1198,14 @@ public abstract class DebugProcessImpl implements DebugProcess {
public void contextAction() {
showStatusText("Stepping over");
final SuspendContextImpl suspendContext = getSuspendContext();
RequestHint hint = new RequestHint(suspendContext, StepRequest.STEP_OVER);
final ThreadReferenceProxyImpl steppingThread = suspendContext.getThread();
RequestHint hint = new RequestHint(steppingThread, suspendContext, StepRequest.STEP_OVER);
hint.setRestoreBreakpoints(myIsIgnoreBreakpoints);
final boolean succeeded = doStep(suspendContext.getThread(), StepRequest.STEP_OVER, hint);
if (succeeded) {
if (myIsIgnoreBreakpoints) {
DebuggerManagerEx.getInstanceEx(myProject).getBreakpointManager().disableBreakpoints(DebugProcessImpl.this);
}
doStep(steppingThread, StepRequest.STEP_OVER, hint);
if (myIsIgnoreBreakpoints) {
DebuggerManagerEx.getInstanceEx(myProject).getBreakpointManager().disableBreakpoints(DebugProcessImpl.this);
}
super.contextAction();
}
@@ -1219,7 +1227,7 @@ public abstract class DebugProcessImpl implements DebugProcess {
}
myRunToCursorBreakpoint.SUSPEND_POLICY = DebuggerSettings.SUSPEND_ALL;
myRunToCursorBreakpoint.LOG_ENABLED = false;
getRequestsManager().createRequest(myRunToCursorBreakpoint);
myRunToCursorBreakpoint.createRequest(getSuspendContext().getDebugProcess());
DebugProcessImpl.this.myRunToCursorBreakpoint = myRunToCursorBreakpoint;
super.contextAction();
}
@@ -1243,7 +1251,9 @@ public abstract class DebugProcessImpl implements DebugProcess {
}
public void action() {
if (!isAttached()) return;
if (!isAttached()) {
return;
}
logThreads();
getVirtualMachineProxy().suspend();
logThreads();

View File

@@ -7,6 +7,7 @@ package com.intellij.debugger.engine;
import com.intellij.debugger.SourcePosition;
import com.intellij.debugger.engine.evaluation.EvaluateException;
import com.intellij.debugger.engine.jdi.StackFrameProxy;
import com.intellij.debugger.impl.PositionUtil;
import com.intellij.debugger.jdi.ThreadReferenceProxyImpl;
import com.intellij.debugger.jdi.VirtualMachineProxyImpl;
@@ -33,18 +34,33 @@ class RequestHint {
private boolean myRestoreBreakpoints = false;
private boolean mySkipThisMethod = false;
public RequestHint(final SuspendContextImpl suspendContext, int depth) {
public RequestHint(final ThreadReferenceProxyImpl stepThread, final SuspendContextImpl suspendContext, int depth) {
final DebugProcessImpl debugProcess = suspendContext.getDebugProcess();
myDepth = depth;
myVirtualMachineProxy = debugProcess.getVirtualMachineProxy();
try {
final ThreadReferenceProxyImpl thread = suspendContext.getThread();
myFrameCount = thread.frameCount();
myFrameCount = stepThread.frameCount();
ApplicationManager.getApplication().runReadAction(new Runnable() {
public void run() {
myPosition = ContextUtil.getSourcePosition(suspendContext);
myPosition = ContextUtil.getSourcePosition(new StackFrameContext() {
public StackFrameProxy getFrameProxy() {
try {
return stepThread.frame(0);
}
catch (EvaluateException e) {
if (LOG.isDebugEnabled()) {
LOG.debug(e);
}
return null;
}
}
public DebugProcess getDebugProcess() {
return suspendContext.getDebugProcess();
}
});
}
});
}

View File

@@ -1,12 +1,11 @@
package com.intellij.debugger.engine;
import com.intellij.debugger.engine.events.SuspendContextCommandImpl;
import com.intellij.Patches;
import com.intellij.debugger.jdi.ThreadReferenceProxyImpl;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.Patches;
import com.sun.jdi.InternalException;
import com.sun.jdi.event.EventSet;
import com.sun.jdi.request.EventRequest;
import com.sun.jdi.InternalException;
import java.util.*;
@@ -98,7 +97,8 @@ public class SuspendManagerImpl implements SuspendManager {
LOG.debug("Start resuming eventSet " + set.toString() + " suspendPolicy = " + set.suspendPolicy() + ",size = " + set.size());
}
myDebugProcess.logThreads();
LOG.assertTrue(getThread() != null ? getThread().isSuspended() : true);
final ThreadReferenceProxyImpl thread = getThread();
LOG.assertTrue(thread != null ? thread.isSuspended() : true);
try {
set.resume();
}
@@ -142,7 +142,6 @@ public class SuspendManagerImpl implements SuspendManager {
myDebugProcess.clearCashes(suspendPolicy);
}
public void popFrame(SuspendContextImpl suspendContext) {
popContext(suspendContext);
SuspendContextImpl newSuspendContext = pushSuspendContext(suspendContext.getSuspendPolicy(), 0);
@@ -160,9 +159,9 @@ public class SuspendManagerImpl implements SuspendManager {
LOG.debug("popContext, suspends = " + suspends);
}
DebuggerManagerThreadImpl.assertIsManagerThread();
boolean removed = myEventContexts.remove(suspendContext);
if(LOG.isDebugEnabled()) {
LOG.assertTrue(removed, suspendContext.toString());
final boolean removed = myEventContexts.remove(suspendContext);
if (!removed) {
LOG.assertTrue(false, suspendContext.toString());
}
myPausedContexts.remove(suspendContext);
}
@@ -255,7 +254,8 @@ public class SuspendManagerImpl implements SuspendManager {
if(suspendContext.myVotesToVote == 0) {
if(suspendContext.myIsVotedForResume) {
resume(suspendContext);
} else {
}
else {
if (LOG.isDebugEnabled()) {
LOG.debug("vote paused");
}

View File

@@ -229,17 +229,15 @@ public class RequestManagerImpl extends DebugProcessAdapterImpl implements Reque
return req;
}
public void createRequest(Breakpoint breakpoint) {
DebuggerManagerThreadImpl.assertIsManagerThread();
if(!myDebugProcess.isAttached() || !findRequests(breakpoint).isEmpty()) return;
breakpoint.createRequest(myDebugProcess);
}
public void deleteRequest(Requestor requestor) {
DebuggerManagerThreadImpl.assertIsManagerThread();
if(!myDebugProcess.isAttached()) return;
if(!myDebugProcess.isAttached()) {
return;
}
Set<EventRequest> requests = myRequestorToBelongedRequests.get(requestor);
if(requests == null) return;
if(requests == null) {
return;
}
myRequestorToBelongedRequests.remove(requestor);
for (Iterator iterator = requests.iterator(); iterator.hasNext();) {
EventRequest eventRequest = (EventRequest) iterator.next();
@@ -335,7 +333,7 @@ public class RequestManagerImpl extends DebugProcessAdapterImpl implements Reque
for (Iterator<Breakpoint> iterator = breakpointManager.getBreakpoints().iterator(); iterator.hasNext();) {
Breakpoint breakpoint = iterator.next();
myDebugProcess.getRequestsManager().createRequest(breakpoint);
breakpoint.createRequest(myDebugProcess);
}
}
@@ -383,7 +381,7 @@ public class RequestManagerImpl extends DebugProcessAdapterImpl implements Reque
public static void createRequests(final Breakpoint breakpoint) {
invoke(breakpoint.getProject(), new AllProcessesCommand (){
public void action(DebugProcessImpl process) {
process.getRequestsManager().createRequest(breakpoint);
breakpoint.createRequest(process);
}
});
}
@@ -393,7 +391,7 @@ public class RequestManagerImpl extends DebugProcessAdapterImpl implements Reque
public void action(DebugProcessImpl process) {
process.getRequestsManager().myInvalidRequestors.remove(breakpoint);
process.getRequestsManager().deleteRequest(breakpoint);
process.getRequestsManager().createRequest(breakpoint);
breakpoint.createRequest(process);
}
});
}

View File

@@ -380,9 +380,9 @@ public class DebuggerSession {
}
/* Stepping */
private void resumeAction(final SuspendContextCommandImpl action, int event) {
private void resumeAction(final SuspendContextCommandImpl command, int event) {
getContextManager().setState(SESSION_EMPTY_CONTEXT, STATE_WAIT_EVALUATION, event, null);
myDebugProcess.getManagerThread().invokeLater(action, DebuggerManagerThreadImpl.HIGH_PRIORITY);
myDebugProcess.getManagerThread().invokeLater(command, DebuggerManagerThreadImpl.HIGH_PRIORITY);
}
public void stepOut() {

View File

@@ -9,6 +9,7 @@ import com.intellij.debugger.engine.DebugProcessImpl;
import com.intellij.debugger.engine.events.DebuggerContextCommandImpl;
import com.intellij.debugger.impl.*;
import com.intellij.debugger.jdi.StackFrameProxyImpl;
import com.intellij.debugger.jdi.ThreadReferenceProxyImpl;
import com.intellij.debugger.settings.DebuggerColors;
import com.intellij.debugger.ui.breakpoints.Breakpoint;
import com.intellij.debugger.ui.breakpoints.BreakpointWithHighlighter;
@@ -297,7 +298,8 @@ public class PositionHighlighter {
try {
StackFrameProxyImpl frameProxy = myContext.getFrameProxy();
isExecutionPoint = frameProxy.equals(getSuspendContext().getThread().frame(0));
final ThreadReferenceProxyImpl thread = getSuspendContext().getThread();
isExecutionPoint = (thread != null)? frameProxy.equals(thread.frame(0)) : false;
} catch(Throwable th) {
LOG.debug(th);
}

View File

@@ -6,6 +6,7 @@ package com.intellij.debugger.ui.breakpoints;
import com.intellij.debugger.engine.DebugProcessImpl;
import com.intellij.debugger.engine.DebugProcess;
import com.intellij.debugger.engine.DebuggerManagerThreadImpl;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.InvalidDataException;
import com.sun.jdi.ReferenceType;
@@ -22,6 +23,7 @@ public class AnyExceptionBreakpoint extends ExceptionBreakpoint {
}
public void createRequest(DebugProcessImpl debuggerProcess) {
DebuggerManagerThreadImpl.assertIsManagerThread();
if (!ENABLED || !debuggerProcess.isAttached() || !debuggerProcess.getRequestsManager().findRequests(this).isEmpty()) {
return;
}

View File

@@ -718,7 +718,7 @@ public class BreakpointManager implements JDOMExternalizable {
List<Breakpoint> breakpoints = getBreakpoints();
for (Iterator<Breakpoint> iterator = breakpoints.iterator(); iterator.hasNext();) {
Breakpoint breakpoint = iterator.next();
debugProcess.getRequestsManager().createRequest(breakpoint);
breakpoint.createRequest(debugProcess);
}
}

View File

@@ -5,6 +5,7 @@ import com.intellij.debugger.actions.ViewBreakpointsAction;
import com.intellij.debugger.engine.DebugProcess;
import com.intellij.debugger.engine.DebugProcessImpl;
import com.intellij.debugger.engine.JVMNameUtil;
import com.intellij.debugger.engine.DebuggerManagerThreadImpl;
import com.intellij.debugger.engine.events.DebuggerCommandImpl;
import com.intellij.debugger.engine.requests.RequestManagerImpl;
import com.intellij.debugger.impl.DebuggerContextImpl;
@@ -219,6 +220,7 @@ public abstract class BreakpointWithHighlighter extends Breakpoint {
}
public void createRequest(DebugProcessImpl debugProcess) {
DebuggerManagerThreadImpl.assertIsManagerThread();
// check is this breakpoint is enabled, vm reference is valid and there're no requests created yet
if (!ENABLED || !debugProcess.isAttached() || !debugProcess.getRequestsManager().findRequests(this).isEmpty()) {
return;

View File

@@ -4,12 +4,10 @@
*/
package com.intellij.debugger.ui.breakpoints;
import com.intellij.debugger.engine.DebugProcess;
import com.intellij.debugger.engine.evaluation.EvaluateException;
import com.intellij.debugger.SourcePosition;
import com.intellij.debugger.engine.DebugProcessImpl;
import com.intellij.debugger.engine.SuspendContextImpl;
import com.intellij.debugger.engine.DebugProcess;
import com.intellij.debugger.engine.*;
import com.intellij.debugger.engine.evaluation.EvaluationContextImpl;
import com.intellij.debugger.impl.DebuggerUtilsEx;
import com.intellij.openapi.diagnostic.Logger;
@@ -79,6 +77,7 @@ public class ExceptionBreakpoint extends Breakpoint {
}
public void createRequest(DebugProcessImpl debugProcess) {
DebuggerManagerThreadImpl.assertIsManagerThread();
if (!ENABLED || !debugProcess.isAttached() || !debugProcess.getRequestsManager().findRequests(this).isEmpty()) {
return;
}

View File

@@ -123,7 +123,7 @@ public abstract class FilteredRequestor implements LocatableEventRequestor, JDOM
if(COUNT_FILTER_ENABLED) {
context.getDebugProcess().getVirtualMachineProxy().suspend();
context.getDebugProcess().getRequestsManager().deleteRequest(this);
context.getDebugProcess().getRequestsManager().createRequest((Breakpoint)this);
((Breakpoint)this).createRequest(context.getDebugProcess());
context.getDebugProcess().getVirtualMachineProxy().resume();
}
if (INSTANCE_FILTERS_ENABLED) {