From 36b5bdfc516646bf81d2c376eb7f4317e9c40d3a Mon Sep 17 00:00:00 2001 From: Karthik Nadig Date: Fri, 4 May 2018 14:38:46 -0700 Subject: [PATCH] Filter ptvsd files while tracing (#408) * Implement tracing filter for ptvsd files * Tests for ptvsd file tracing * Clean up regex * Linter fixes * Addressing comments. --- ptvsd/wrapper.py | 38 ++++++++++++++++++++++++++++ tests/ptvsd/test_internals_filter.py | 20 +++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/ptvsd/wrapper.py b/ptvsd/wrapper.py index fe41997f..50df2589 100644 --- a/ptvsd/wrapper.py +++ b/ptvsd/wrapper.py @@ -36,6 +36,7 @@ pydevd_constants.MAXIMUM_VARIABLE_REPRESENTATION_SIZE = 2**32 import _pydevd_bundle.pydevd_comm as pydevd_comm # noqa import _pydevd_bundle.pydevd_extension_api as pydevd_extapi # noqa import _pydevd_bundle.pydevd_extension_utils as pydevd_extutil # noqa +import _pydevd_bundle.pydevd_frame as pydevd_frame # noqa #from _pydevd_bundle.pydevd_comm import pydevd_log import ptvsd.ipcjson as ipcjson # noqa @@ -129,6 +130,43 @@ SafeReprPresentationProvider._instance = SafeReprPresentationProvider() str_handlers = pydevd_extutil.EXTENSION_MANAGER_INSTANCE.type_to_instance.setdefault(pydevd_extapi.StrPresentationProvider, []) # noqa str_handlers.insert(0, SafeReprPresentationProvider._instance) +DONT_TRACE_FILES = set((os.path.join(*elem) for elem in [ + ('ptvsd', 'attach_server.py'), + ('ptvsd', 'daemon.py'), + ('ptvsd', 'debugger.py'), + ('ptvsd', 'futures.py'), + ('ptvsd', 'ipcjson.py'), + ('ptvsd', 'pathutils.py'), + ('ptvsd', 'pydevd_hooks.py'), + ('ptvsd', 'reraise.py'), + ('ptvsd', 'reraise2.py'), + ('ptvsd', 'reraise3.py'), + ('ptvsd', 'runner.py'), + ('ptvsd', 'safe_repr.py'), + ('ptvsd', 'socket.py'), + ('ptvsd', 'untangle.py'), + ('ptvsd', 'version.py'), + ('ptvsd', 'wrapper.py'), + ('ptvsd', '_main.py'), + ('ptvsd', '_version.py'), + ('ptvsd', '__init__.py'), + ('ptvsd', '__main__.py'), +])) + + +def filter_ptvsd_files(file_path): + """ + Returns true if the file should not be traced. + """ + ptvsd_path_re = r"(ptvsd[\\\/].*\.py)" + matches = re.finditer(ptvsd_path_re, file_path) + return any((g in DONT_TRACE_FILES + for m in matches + for g in m.groups())) + + +pydevd_frame.file_tracing_filter = filter_ptvsd_files + class UnsupportedPyDevdCommandError(Exception): diff --git a/tests/ptvsd/test_internals_filter.py b/tests/ptvsd/test_internals_filter.py index 590300a5..42b27723 100644 --- a/tests/ptvsd/test_internals_filter.py +++ b/tests/ptvsd/test_internals_filter.py @@ -3,6 +3,7 @@ import unittest import ptvsd.untangle from ptvsd.wrapper import InternalsFilter +from ptvsd.wrapper import filter_ptvsd_files class InternalsFilterTests(unittest.TestCase): @@ -29,3 +30,22 @@ class InternalsFilterTests(unittest.TestCase): ] for fp in files: self.assertFalse(int_filter.is_internal_path(fp)) + + +class PtvsdFileTraceFilter(unittest.TestCase): + def test_basic(self): + test_paths = { + os.path.join('C:', 'ptvsd', 'wrapper.py'): True, + os.path.join('C:', 'abcd', 'ptvsd', 'wrapper.py'): True, + os.path.join('usr', 'ptvsd', 'wrapper.py'): True, + os.path.join('ptvsd', 'wrapper.py'): True, + os.path.join('usr', 'abcd', 'ptvsd', 'wrapper.py'): True, + os.path.join('C:', 'ptvsd', 'wrapper1.py'): False, + os.path.join('C:', 'abcd', 'ptvsd', 'ptvsd.py'): False, + os.path.join('usr', 'ptvsd', 'w.py'): False, + os.path.join('ptvsd', 'w.py'): False, + os.path.join('usr', 'abcd', 'ptvsd', 'tangle.py'): False, + } + + for path, val in test_paths.items(): + self.assertTrue(val == filter_ptvsd_files(path))