diff --git a/Tools/gdb/libpython.py b/Tools/gdb/libpython.py --- a/Tools/gdb/libpython.py +++ b/Tools/gdb/libpython.py @@ -931,6 +931,15 @@ class PyFrameObjectPtr(PyObjectPtr): out.write(')') + def format_backtrace(self): + if self.is_optimized_out(): + return '(frame information optimized out)' + visited = set() + return 'File "%s", line %i, in %s' \ + % (self.co_filename.proxyval(visited), + self.current_line_num(), + self.co_name.proxyval(visited)) + class PySetObjectPtr(PyObjectPtr): _typename = 'PySetObject' @@ -1427,6 +1436,17 @@ class Frame(object): else: sys.stdout.write('#%i\n' % self.get_index()) + def format_backtrace(self): + if self.is_evalframeex(): + pyop = self.get_pyop() + if pyop: + line = pyop.format_backtrace() + else: + line = '(unable to read python frame information)' + else: + line = '(not a python frame)' + return ' ' + line + class PyList(gdb.Command): '''List the current Python source code, if any @@ -1561,10 +1581,12 @@ class PyBacktrace(gdb.Command): def invoke(self, args, from_tty): + sys.stdout.write('Traceback (most recent call first):\n') frame = Frame.get_selected_python_frame() while frame: if frame.is_evalframeex(): - frame.print_summary() + line = frame.format_backtrace() + sys.stdout.write(line + '\n') frame = frame.older() PyBacktrace()