diff options
author | Victor Stinner <vstinner@redhat.com> | 2018-06-15 17:11:45 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-06-15 17:11:45 (GMT) |
commit | ca4cb8492c643d1fcac2c5b749595ad5377673ab (patch) | |
tree | a2f098226f667d88ab3d92eb2e5389f4113416ce /Tools | |
parent | 9363235467f1321e5bd81f279bfe4bd23d5c8ff6 (diff) | |
download | cpython-ca4cb8492c643d1fcac2c5b749595ad5377673ab.zip cpython-ca4cb8492c643d1fcac2c5b749595ad5377673ab.tar.gz cpython-ca4cb8492c643d1fcac2c5b749595ad5377673ab.tar.bz2 |
[3.7] bpo-32962: Backport python-gdb.py and test_gdb.py from master (GH-7710)
* bpo-32962: python-gdb catchs ValueError on read_var() (GH-7692)
python-gdb now catchs ValueError on read_var(): when Python has no
debug symbols for example.
(cherry picked from commit 019d33b7a447e78057842332fb5d3bad01922122)
* bpo-32962: python-gdb catchs UnicodeDecodeError (GH-7693)
python-gdb now catchs UnicodeDecodeError exceptions when calling
string().
(cherry picked from commit d22fc0bc7de7882da204abe50884bbde2da4f9e7)
* bpo-32962: Fix test_gdb failure in debug build with -mcet -fcf-protection -O0 (GH-6754)
When Python is built with the intel control-flow protection flags,
-mcet -fcf-protection, gdb is not able to read the stack without
actually jumping inside the function. This means an extra
'next' command is required to make the $pc (program counter)
enter the function and make the stack of the function exposed to gdb.
(cherry picked from commit 9b7c74ca32d1bec7128d550a9ab1b2ddc7046287)
Diffstat (limited to 'Tools')
-rwxr-xr-x | Tools/gdb/libpython.py | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/Tools/gdb/libpython.py b/Tools/gdb/libpython.py index 7df7c9b..27eabcb 100755 --- a/Tools/gdb/libpython.py +++ b/Tools/gdb/libpython.py @@ -270,12 +270,13 @@ class PyObjectPtr(object): def safe_tp_name(self): try: - return self.type().field('tp_name').string() - except NullPyObjectPtr: - # NULL tp_name? - return 'unknown' - except RuntimeError: - # Can't even read the object at all? + ob_type = self.type() + tp_name = ob_type.field('tp_name') + return tp_name.string() + # NullPyObjectPtr: NULL tp_name? + # RuntimeError: Can't even read the object at all? + # UnicodeDecodeError: Failed to decode tp_name bytestring + except (NullPyObjectPtr, RuntimeError, UnicodeDecodeError): return 'unknown' def proxyval(self, visited): @@ -349,7 +350,9 @@ class PyObjectPtr(object): try: tp_name = t.field('tp_name').string() tp_flags = int(t.field('tp_flags')) - except RuntimeError: + # RuntimeError: NULL pointers + # UnicodeDecodeError: string() fails to decode the bytestring + except (RuntimeError, UnicodeDecodeError): # Handle any kind of error e.g. NULL ptrs by simply using the base # class return cls @@ -617,7 +620,10 @@ class PyCFunctionObjectPtr(PyObjectPtr): def proxyval(self, visited): m_ml = self.field('m_ml') # m_ml is a (PyMethodDef*) - ml_name = m_ml['ml_name'].string() + try: + ml_name = m_ml['ml_name'].string() + except UnicodeDecodeError: + ml_name = '<ml_name:UnicodeDecodeError>' pyop_m_self = self.pyop_field('m_self') if pyop_m_self.is_null(): @@ -1340,13 +1346,13 @@ class wrapperobject(PyObjectPtr): try: name = self.field('descr')['d_base']['name'].string() return repr(name) - except (NullPyObjectPtr, RuntimeError): + except (NullPyObjectPtr, RuntimeError, UnicodeDecodeError): return '<unknown name>' def safe_tp_name(self): try: return self.field('self')['ob_type']['tp_name'].string() - except (NullPyObjectPtr, RuntimeError): + except (NullPyObjectPtr, RuntimeError, UnicodeDecodeError): return '<unknown tp_name>' def safe_self_addresss(self): @@ -1552,15 +1558,22 @@ class Frame(object): # Use the prettyprinter for the func: func = frame.read_var(arg_name) return str(func) + except ValueError: + return ('PyCFunction invocation (unable to read %s: ' + 'missing debuginfos?)' % arg_name) except RuntimeError: return 'PyCFunction invocation (unable to read %s)' % arg_name if caller == 'wrapper_call': + arg_name = 'wp' try: - func = frame.read_var('wp') + func = frame.read_var(arg_name) return str(func) + except ValueError: + return ('<wrapper_call invocation (unable to read %s: ' + 'missing debuginfos?)>' % arg_name) except RuntimeError: - return '<wrapper_call invocation>' + return '<wrapper_call invocation (unable to read %s)>' % arg_name # This frame isn't worth reporting: return False |