diff --git a/python/helpers/pydev/pydev_ipython_console.py b/python/helpers/pydev/pydev_ipython_console.py
index dca3b4dc53ee..d3d4ae8492a3 100644
--- a/python/helpers/pydev/pydev_ipython_console.py
+++ b/python/helpers/pydev/pydev_ipython_console.py
@@ -11,10 +11,10 @@ os.environ['TERM'] = 'emacs' #to use proper page_more() for paging
#raise ImportError()
try:
- from pydev_ipython_console_010 import PyDevFrontEnd
-except:
#IPython 0.11 broke compatibility...
from pydev_ipython_console_011 import PyDevFrontEnd
+except:
+ from pydev_ipython_console_010 import PyDevFrontEnd
#=======================================================================================================================
# InterpreterInterface
diff --git a/python/helpers/pydev/pydev_ipython_console_011.py b/python/helpers/pydev/pydev_ipython_console_011.py
index da08bd136ab5..a6c0d8207a04 100644
--- a/python/helpers/pydev/pydev_ipython_console_011.py
+++ b/python/helpers/pydev/pydev_ipython_console_011.py
@@ -1,4 +1,7 @@
-from IPython.frontend.terminal.interactiveshell import TerminalInteractiveShell
+try:
+ from IPython.terminal.interactiveshell import TerminalInteractiveShell
+except ImportError:
+ from IPython.frontend.terminal.interactiveshell import TerminalInteractiveShell
from IPython.utils import io
import sys
import codeop, re
diff --git a/python/helpers/pydev/pydevd.py b/python/helpers/pydev/pydevd.py
index b75d388bc80b..031d6a15b662 100644
--- a/python/helpers/pydev/pydevd.py
+++ b/python/helpers/pydev/pydevd.py
@@ -155,6 +155,13 @@ class PyDBCommandThread(PyDBDaemonThread):
#PydevdLog(0, 'Finishing debug communication...(3)')
+def killAllPydevThreads():
+ threads = threadingEnumerate()
+ for t in threads:
+ if hasattr(t, 'doKillPydevThread'):
+ t.doKillPydevThread()
+
+
#=======================================================================================================================
# PyDBCheckAliveThread
#=======================================================================================================================
@@ -174,10 +181,7 @@ class PyDBCheckAliveThread(PyDBDaemonThread):
try:
pydev_log.debug("No alive threads, finishing debug session")
self.pyDb.FinishDebuggingSession()
- threads = threadingEnumerate()
- for t in threads:
- if hasattr(t, 'doKillPydevThread'):
- t.doKillPydevThread()
+ killAllPydevThreads()
except:
traceback.print_exc()
@@ -1351,6 +1355,36 @@ def _locked_settrace(host, stdoutToServer, stderrToServer, port, suspend, trace_
if suspend:
debugger.setSuspend(t, CMD_SET_BREAK)
+def stoptrace():
+ global connected
+ if connected:
+ pydevd_tracing.RestoreSysSetTraceFunc()
+ sys.settrace(None)
+ try:
+ #not available in jython!
+ threading.settrace(None) # for all future threads
+ except:
+ pass
+
+ try:
+ thread.start_new_thread = _original_start_new_thread
+ thread.start_new = _original_start_new_thread
+ except:
+ pass
+
+ debugger = GetGlobalDebugger()
+
+ if debugger:
+ debugger.trace_dispatch = None
+
+ debugger.SetTraceForFrameAndParents(GetFrame(), False)
+
+ debugger.exiting()
+
+ killAllPydevThreads()
+
+ connected = False
+
class Dispatcher(object):
def __init__(self):
self.port = None
diff --git a/python/helpers/pydev/pydevd_xml.py b/python/helpers/pydev/pydevd_xml.py
index 9347472157c5..73258e6fcc65 100644
--- a/python/helpers/pydev/pydevd_xml.py
+++ b/python/helpers/pydev/pydevd_xml.py
@@ -171,7 +171,11 @@ def varToXML(val, name, doTrim=True):
except:
value = 'Unable to get repr for %s' % v.__class__
- xml = '_= ')), makeValidXmlValue(typeName))
+ try:
+ name = quote(name, '/>_= ') #TODO: Fix PY-5834 without using quote
+ except:
+ pass
+ xml = ' getRemotePortsFromProcess(RemoteSshProcess process) throws ExecutionException {
Scanner s = new Scanner(process.getInputStream());
+ return Pair.create(readInt(s, process), readInt(s, process));
+ }
+ private static int readInt(Scanner s, Process process) throws ExecutionException {
long started = System.currentTimeMillis();
while (System.currentTimeMillis() - started < PORTS_WAITING_TIMEOUT) {
- try {
- int port = s.nextInt();
- int port2 = s.nextInt();
-
- return Pair.create(port, port2);
- }
- catch (Exception e) {
+ if (s.hasNextLine()) {
+ String line = s.nextLine();
try {
- Thread.sleep(200);
+ return Integer.parseInt(line);
}
- catch (InterruptedException e1) {
+ catch (NumberFormatException e) {
+ continue;
}
}
+
try {
- if (process.exitValue() != 0) {
- String error;
- try {
- error = "Console process terminated with error:\n" + StreamUtil.readText(process.getErrorStream());
- }
- catch (Exception e) {
- error = "Console process terminated with exit code " + process.exitValue();
- }
- throw new ExecutionException(error);
- }
- else {
- break;
- }
+
+ Thread.sleep(200);
}
- catch (IllegalThreadStateException e) {
- //continue
+ catch (InterruptedException e1) {
+ }
+
+ if (process.exitValue() != 0) {
+ String error;
+ try {
+ error = "Console process terminated with error:\n" + StreamUtil.readText(process.getErrorStream());
+ }
+ catch (Exception e) {
+ error = "Console process terminated with exit code " + process.exitValue();
+ }
+ throw new ExecutionException(error);
+ }
+ else {
+ break;
}
}
- throw new ExecutionException("Couldn't get remote ports for console connection.");
+ throw new ExecutionException("Couldn't read integer value from stream");
}
@Override
@@ -682,7 +684,7 @@ public class PydevConsoleRunner extends AbstractConsoleRunnerWithHistory