During debugging instead of context menu on hover the debugger crash
jensmalmgren opened this issue · 2 comments
Hi I am using Visual Studio Code, full version see below. I am using the extension for Python version 2020.1.58038.
Expected behavior:
Not crashing when about to display a context menu in the debugger.
Actual behavior:
While hovering over a specific variable the debugger stops with an error message (full message below). Curious as I am I looked into the problem and found that there is an uncaught exception in get_names of pydevd_resolver.py.
At line 167 I found this original code:
def get_names(self, var):
used___dict__ = False
try:
names = dir(var)
except TypeError:
names = []
if not names:
if hasattr(var, '__dict__'):
names = dict_keys(var.__dict__)
used___dict__ = True
return names, used___dict__
When I change it to the following the debugger stops crashing:
def get_names(self, var):
used___dict__ = False
try:
names = dir(var)
except TypeError:
names = []
if not names:
try:
if hasattr(var, '__dict__'):
names = dict_keys(var.__dict__)
used___dict__ = True
except TypeError:
pass
return names, used___dict__
This is my version of Visual Studio Code
Version: 1.42.0 (user setup)
Commit: ae08d5460b5a45169385ff3fd44208f431992451
Date: 2020-02-06T10:51:34.058Z
Electron: 6.1.6
Chrome: 76.0.3809.146
Node.js: 12.4.0
V8: 7.6.303.31-electron.0
OS: Windows_NT x64 10.0.18363
I am creating a program converting DOCX to HTML in Python and I am using python-docx for this.
python-docx version 0.8.10
In the code at this line when hovering over child_Element the debugger crasched:
for child_Element in doc_DocX.element.body: if (child_Element.tag == '{http://schemas.openxmlformats.org/wordprocessingml/2006/main}tbl'): ...
LOGS Here is the full list of the error message:
Traceback (most recent call last):
File "c:\Users\jens\.vscode\extensions\ms-python.python-2020.1.58038\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\_pydevd_bundle\pydevd_frame.py", line 606, in trace_dispatch
self.do_wait_suspend(thread, frame, event, arg)
File "c:\Users\jens\.vscode\extensions\ms-python.python-2020.1.58038\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\_pydevd_bundle\pydevd_frame.py", line 97, in do_wait_suspend
self._args[0].do_wait_suspend(*args, **kwargs)
File "c:\Users\jens\.vscode\extensions\ms-python.python-2020.1.58038\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\pydevd.py", line 1616, in do_wait_suspend
keep_suspended = self._do_wait_suspend(thread, frame, event, arg, suspend_type, from_this_thread, frames_tracker)
File "c:\Users\jens\.vscode\extensions\ms-python.python-2020.1.58038\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\pydevd.py", line 1644, in _do_wait_suspend
self.process_internal_commands()
File "c:\Users\jens\.vscode\extensions\ms-python.python-2020.1.58038\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\pydevd.py", line 1350, in process_internal_commands
int_cmd.do_it(self)
File "c:\Users\jens\.vscode\extensions\ms-python.python-2020.1.58038\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\_pydevd_bundle\pydevd_comm.py", line 502, in do_it
self.method(dbg, *self.args, **self.kwargs)
File "c:\Users\jens\.vscode\extensions\ms-python.python-2020.1.58038\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\_pydevd_bundle\pydevd_comm.py", line 675, in internal_get_variable_json
for child_var in variable.get_children_variables(fmt=fmt):
File "c:\Users\jens\.vscode\extensions\ms-python.python-2020.1.58038\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\_pydevd_bundle\pydevd_suspended_frames.py", line 111, in get_children_variables
lst = resolver.get_contents_debug_adapter_protocol(self.value, fmt=fmt)
File "c:\Users\jens\.vscode\extensions\ms-python.python-2020.1.58038\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\_pydevd_bundle\pydevd_resolver.py", line 95, in get_contents_debug_adapter_protocol
dct, used___dict__ = self._get_py_dictionary(obj)
File "c:\Users\jens\.vscode\extensions\ms-python.python-2020.1.58038\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\_pydevd_bundle\pydevd_resolver.py", line 192, in _get_py_dictionary
names, used___dict__ = self.get_names(var)
File "c:\Users\jens\.vscode\extensions\ms-python.python-2020.1.58038\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\_pydevd_bundle\pydevd_resolver.py", line 174, in get_names
if hasattr(var, '__dict__'):
TypeError: descriptor '__dict__' for '_OxmlElementBase' objects doesn't apply to a 'CT_Tbl' object
Traceback (most recent call last):
File "c:\Users\jens\.vscode\extensions\ms-python.python-2020.1.58038\pythonFiles\ptvsd_launcher.py", line 43, in <module>
main(ptvsdArgs)
File "c:\Users\jens\.vscode\extensions\ms-python.python-2020.1.58038\pythonFiles\lib\python\old_ptvsd\ptvsd\__main__.py", line 432, in main
run()
File "c:\Users\jens\.vscode\extensions\ms-python.python-2020.1.58038\pythonFiles\lib\python\old_ptvsd\ptvsd\__main__.py", line 316, in run_file
runpy.run_path(target, run_name='__main__')
File "C:\Users\jens\AppData\Local\Programs\Python\Python38\lib\runpy.py", line 263, in run_path
return _run_module_code(code, init_globals, run_name,
File "C:\Users\jens\AppData\Local\Programs\Python\Python38\lib\runpy.py", line 96, in _run_module_code
_run_code(code, mod_globals, init_globals,
File "C:\Users\jens\AppData\Local\Programs\Python\Python38\lib\runpy.py", line 86, in _run_code
exec(code, run_globals)
File "c:\Users\jens\OneDrive\PythonPrograms\ExportDocxToHTML.py", line 376, in <module>
file.write(ProduceMarkupOfTable(table_Element))
File "c:\Users\jens\OneDrive\PythonPrograms\ExportDocxToHTML.py", line 376, in <module>
file.write(ProduceMarkupOfTable(table_Element))
File "c:\Users\jens\.vscode\extensions\ms-python.python-2020.1.58038\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\_pydevd_bundle\pydevd_frame.py", line 606, in trace_dispatch
self.do_wait_suspend(thread, frame, event, arg)
File "c:\Users\jens\.vscode\extensions\ms-python.python-2020.1.58038\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\_pydevd_bundle\pydevd_frame.py", line 97, in do_wait_suspend
self._args[0].do_wait_suspend(*args, **kwargs)
File "c:\Users\jens\.vscode\extensions\ms-python.python-2020.1.58038\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\pydevd.py", line 1616, in do_wait_suspend
keep_suspended = self._do_wait_suspend(thread, frame, event, arg, suspend_type, from_this_thread, frames_tracker)
File "c:\Users\jens\.vscode\extensions\ms-python.python-2020.1.58038\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\pydevd.py", line 1644, in _do_wait_suspend
self.process_internal_commands()
", line 1350, in process_internal_commands
int_cmd.do_it(self)
File "c:\Users\jens\.vscode\extensions\ms-python.python-2020.1.58038\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\_pydevd_bundle\pydevd_comm.py", line 502, in do_it
self.method(dbg, *self.args, **self.kwargs)
File "c:\Users\jens\.vscode\extensions\ms-python.python-2020.1.58038\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\_pydevd_bundle\pydevd_comm.py", line 675, in internal_get_variable_json
for child_var in variable.get_children_variables(fmt=fmt):
File "c:\Users\jens\.vscode\extensions\ms-python.python-2020.1.58038\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\_pydevd_bundle\pydevd_suspended_frames.py", line 111, in get_children_variables
lst = resolver.get_contents_debug_adapter_protocol(self.value, fmt=fmt)
File "c:\Users\jens\.vscode\extensions\ms-python.python-2020.1.58038\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\_pydevd_bundle\pydevd_resolver.py", line 95, in get_contents_debug_adapter_protocol
dct, used___dict__ = self._get_py_dictionary(obj)
File "c:\Users\jens\.vscode\extensions\ms-python.python-2020.1.58038\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\_pydevd_bundle\pydevd_resolver.py", line 192, in _get_py_dictionary
names, used___dict__ = self.get_names(var)
File "c:\Users\jens\.vscode\extensions\ms-python.python-2020.1.58038\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\_pydevd_bundle\pydevd_resolver.py", line 174, in get_names
if hasattr(var, '__dict__'):
TypeError: descriptor '__dict__' for '_OxmlElementBase' objects doesn't apply to a 'CT_Tbl' object
(end of error message)
If this issue was reported at the wrong place or the wrong way please bear with me because I am new to this. Have a nice day.
I never thought that hasattr()
must be guarded as well, but per its definition, that's true - it is defined as getattr()
+ except AttributeError
, so if getattr()
raises something else, it propagates. @fabioz, I guess all uses of hasattr()
in eval/children code has to be guarded.
I'll take a look at that.