mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Fix resume after stepping again and add test
This commit is contained in:
@@ -61,10 +61,17 @@ def handle_breakpoint(frame, info, global_debugger, breakpoint):
|
||||
return True
|
||||
|
||||
|
||||
def _get_line_for_frame(frame):
|
||||
# it's absolutely necessary to reset tracing function for frame in order to get the real line number
|
||||
tracing_func = frame.f_trace
|
||||
frame.f_trace = None
|
||||
line = frame.f_lineno
|
||||
frame.f_trace = tracing_func
|
||||
return line
|
||||
|
||||
|
||||
def _pydev_stop_at_break():
|
||||
frame = sys._getframe(1)
|
||||
# it's absolutely necessary to reset tracing function for frame in order to get the real line number
|
||||
frame.f_trace = None
|
||||
t = threading.currentThread()
|
||||
if t.additional_info.is_tracing:
|
||||
return
|
||||
@@ -81,14 +88,14 @@ def _pydev_stop_at_break():
|
||||
filename = abs_path_real_path_and_base[1]
|
||||
|
||||
breakpoints_for_file = debugger.breakpoints.get(filename)
|
||||
line = frame.f_lineno
|
||||
line = _get_line_for_frame(frame)
|
||||
try:
|
||||
breakpoint = breakpoints_for_file[line]
|
||||
except KeyError:
|
||||
pydev_log.debug("Couldn't find breakpoint in the file {} on line {}".format(frame.f_code.co_filename, frame.f_lineno))
|
||||
pydev_log.debug("Couldn't find breakpoint in the file {} on line {}".format(frame.f_code.co_filename, line))
|
||||
return
|
||||
if breakpoint and handle_breakpoint(frame, t.additional_info, debugger, breakpoint):
|
||||
pydev_log.debug("Suspending at breakpoint in file: {} on line {}".format(frame.f_code.co_filename, frame.f_lineno))
|
||||
pydev_log.debug("Suspending at breakpoint in file: {} on line {}".format(frame.f_code.co_filename, line))
|
||||
debugger.set_suspend(t, CMD_SET_BREAK)
|
||||
debugger.do_wait_suspend(t, frame, 'line', None)
|
||||
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
def foo():
|
||||
a = 1
|
||||
b = 2 # breakpoint
|
||||
c = 3
|
||||
d = 4
|
||||
e = 5 # breakpoint
|
||||
return a + b
|
||||
|
||||
|
||||
def main():
|
||||
foo()
|
||||
t = 1
|
||||
s = 12 # breakpoint
|
||||
|
||||
|
||||
main()
|
||||
@@ -4,8 +4,6 @@ import com.google.common.collect.ImmutableSet;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Sets;
|
||||
import com.intellij.openapi.util.SystemInfo;
|
||||
import com.intellij.openapi.util.io.FileUtil;
|
||||
import com.intellij.openapi.vfs.LocalFileSystem;
|
||||
import com.intellij.testFramework.UsefulTestCase;
|
||||
import com.intellij.testFramework.fixtures.IdeaProjectTestFixture;
|
||||
import com.intellij.xdebugger.XDebuggerTestUtil;
|
||||
@@ -31,7 +29,6 @@ import com.jetbrains.python.sdkTools.SdkCreationType;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
@@ -1102,6 +1099,39 @@ public class PythonDebuggerTest extends PyEnvTestCase {
|
||||
});
|
||||
}
|
||||
|
||||
@Staging
|
||||
@Test
|
||||
public void testResumeAfterStepping() throws Exception {
|
||||
// This test case is important for frame evaluation debugging, because we reuse old tracing function for stepping and there were
|
||||
// some problems with switching between frame evaluation and tracing
|
||||
runPythonTest(new PyDebuggerTask("/debug", "test_resume_after_step.py") {
|
||||
@Override
|
||||
public void before() throws Exception {
|
||||
toggleBreakpoint(getScriptName(), 2);
|
||||
toggleBreakpoint(getScriptName(), 5);
|
||||
toggleBreakpoint(getScriptName(), 12);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void testing() throws Exception {
|
||||
waitForPause();
|
||||
eval("a").hasValue("1");
|
||||
stepOver();
|
||||
waitForPause();
|
||||
stepOver();
|
||||
waitForPause();
|
||||
eval("c").hasValue("3");
|
||||
resume();
|
||||
waitForPause();
|
||||
eval("d").hasValue("4");
|
||||
resume();
|
||||
waitForPause();
|
||||
eval("t").hasValue("1");
|
||||
resume();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
//TODO: That doesn't work now: case from test_continuation.py and test_continuation2.py are treated differently by interpreter
|
||||
// (first line is executed in first case and last line in second)
|
||||
|
||||
Reference in New Issue
Block a user