Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
b17d2aa5
Commit
b17d2aa5
authored
Nov 23, 2013
by
Antoine Pitrou
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Issue #19308: fix the gdb plugin on gdbs linked with Python 3
parent
c17565e4
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
70 additions
and
53 deletions
+70
-53
Lib/test/test_gdb.py
Lib/test/test_gdb.py
+1
-1
Tools/gdb/libpython.py
Tools/gdb/libpython.py
+69
-52
No files found.
Lib/test/test_gdb.py
View file @
b17d2aa5
...
...
@@ -59,7 +59,7 @@ def run_gdb(*args, **env_vars):
return
out
.
decode
(
'utf-8'
,
'replace'
),
err
.
decode
(
'utf-8'
,
'replace'
)
# Verify that "gdb" was built with the embedded python support enabled:
gdbpy_version
,
_
=
run_gdb
(
"--eval-command=python import sys; print
sys.version_info
"
)
gdbpy_version
,
_
=
run_gdb
(
"--eval-command=python import sys; print
(sys.version_info)
"
)
if
not
gdbpy_version
:
raise
unittest
.
SkipTest
(
"gdb not built with embedded python support"
)
...
...
Tools/gdb/libpython.py
View file @
b17d2aa5
...
...
@@ -40,11 +40,21 @@ the type names are known to the debugger
The module also extends gdb with some python-specific commands.
'''
from
__future__
import
with_statement
# NOTE: some gdbs are linked with Python 3, so this file should be dual-syntax
# compatible (2.6+ and 3.0+). See #19308.
from
__future__
import
print_function
,
with_statement
import
gdb
import
os
import
locale
import
sys
if
sys
.
version_info
[
0
]
>=
3
:
unichr
=
chr
xrange
=
range
long
=
int
# Look up the gdb.Type for some standard types:
_type_char_ptr
=
gdb
.
lookup_type
(
'char'
).
pointer
()
# char*
_type_unsigned_char_ptr
=
gdb
.
lookup_type
(
'unsigned char'
).
pointer
()
# unsigned char*
...
...
@@ -58,16 +68,16 @@ _is_pep393 = None
SIZEOF_VOID_P
=
_type_void_ptr
.
sizeof
Py_TPFLAGS_HEAPTYPE
=
(
1
L
<<
9
)
Py_TPFLAGS_HEAPTYPE
=
(
1
<<
9
)
Py_TPFLAGS_LONG_SUBCLASS
=
(
1
L
<<
24
)
Py_TPFLAGS_LIST_SUBCLASS
=
(
1
L
<<
25
)
Py_TPFLAGS_TUPLE_SUBCLASS
=
(
1
L
<<
26
)
Py_TPFLAGS_BYTES_SUBCLASS
=
(
1
L
<<
27
)
Py_TPFLAGS_UNICODE_SUBCLASS
=
(
1
L
<<
28
)
Py_TPFLAGS_DICT_SUBCLASS
=
(
1
L
<<
29
)
Py_TPFLAGS_BASE_EXC_SUBCLASS
=
(
1
L
<<
30
)
Py_TPFLAGS_TYPE_SUBCLASS
=
(
1
L
<<
31
)
Py_TPFLAGS_LONG_SUBCLASS
=
(
1
<<
24
)
Py_TPFLAGS_LIST_SUBCLASS
=
(
1
<<
25
)
Py_TPFLAGS_TUPLE_SUBCLASS
=
(
1
<<
26
)
Py_TPFLAGS_BYTES_SUBCLASS
=
(
1
<<
27
)
Py_TPFLAGS_UNICODE_SUBCLASS
=
(
1
<<
28
)
Py_TPFLAGS_DICT_SUBCLASS
=
(
1
<<
29
)
Py_TPFLAGS_BASE_EXC_SUBCLASS
=
(
1
<<
30
)
Py_TPFLAGS_TYPE_SUBCLASS
=
(
1
<<
31
)
MAX_OUTPUT_LEN
=
1024
...
...
@@ -90,32 +100,39 @@ def safety_limit(val):
def
safe_range
(
val
):
# As per range, but don't trust the value too much: cap it to a safety
# threshold in case the data was corrupted
return
xrange
(
safety_limit
(
val
))
def
write_unicode
(
file
,
text
):
# Write a byte or unicode string to file. Unicode strings are encoded to
# ENCODING encoding with 'backslashreplace' error handler to avoid
# UnicodeEncodeError.
if
isinstance
(
text
,
unicode
):
text
=
text
.
encode
(
ENCODING
,
'backslashreplace'
)
file
.
write
(
text
)
def
os_fsencode
(
filename
):
if
not
isinstance
(
filename
,
unicode
):
return
filename
encoding
=
sys
.
getfilesystemencoding
()
if
encoding
==
'mbcs'
:
# mbcs doesn't support surrogateescape
return
filename
.
encode
(
encoding
)
encoded
=
[]
for
char
in
filename
:
# surrogateescape error handler
if
0xDC80
<=
ord
(
char
)
<=
0xDCFF
:
byte
=
chr
(
ord
(
char
)
-
0xDC00
)
else
:
byte
=
char
.
encode
(
encoding
)
encoded
.
append
(
byte
)
return
''
.
join
(
encoded
)
return
xrange
(
safety_limit
(
int
(
val
)))
if
sys
.
version_info
[
0
]
>=
3
:
def
write_unicode
(
file
,
text
):
file
.
write
(
text
)
else
:
def
write_unicode
(
file
,
text
):
# Write a byte or unicode string to file. Unicode strings are encoded to
# ENCODING encoding with 'backslashreplace' error handler to avoid
# UnicodeEncodeError.
if
isinstance
(
text
,
unicode
):
text
=
text
.
encode
(
ENCODING
,
'backslashreplace'
)
file
.
write
(
text
)
try
:
os_fsencode
=
os
.
fsencode
except
ImportError
:
def
os_fsencode
(
filename
):
if
not
isinstance
(
filename
,
unicode
):
return
filename
encoding
=
sys
.
getfilesystemencoding
()
if
encoding
==
'mbcs'
:
# mbcs doesn't support surrogateescape
return
filename
.
encode
(
encoding
)
encoded
=
[]
for
char
in
filename
:
# surrogateescape error handler
if
0xDC80
<=
ord
(
char
)
<=
0xDCFF
:
byte
=
chr
(
ord
(
char
)
-
0xDC00
)
else
:
byte
=
char
.
encode
(
encoding
)
encoded
.
append
(
byte
)
return
''
.
join
(
encoded
)
class
StringTruncated
(
RuntimeError
):
pass
...
...
@@ -322,8 +339,8 @@ class PyObjectPtr(object):
# class
return
cls
#print
'tp_flags = 0x%08x' % tp_flags
#print
'tp_name = %r' % tp_name
#print
('tp_flags = 0x%08x' % tp_flags)
#print
('tp_name = %r' % tp_name)
name_map
=
{
'bool'
:
PyBoolObjectPtr
,
'classobj'
:
PyClassObjectPtr
,
...
...
@@ -733,14 +750,14 @@ class PyLongObjectPtr(PyObjectPtr):
'''
ob_size
=
long
(
self
.
field
(
'ob_size'
))
if
ob_size
==
0
:
return
0
L
return
0
ob_digit
=
self
.
field
(
'ob_digit'
)
if
gdb
.
lookup_type
(
'digit'
).
sizeof
==
2
:
SHIFT
=
15
L
SHIFT
=
15
else
:
SHIFT
=
30
L
SHIFT
=
30
digits
=
[
long
(
ob_digit
[
i
])
*
2
**
(
SHIFT
*
i
)
for
i
in
safe_range
(
abs
(
ob_size
))]
...
...
@@ -1595,12 +1612,12 @@ class PyList(gdb.Command):
# py-list requires an actual PyEval_EvalFrameEx frame:
frame = Frame.get_selected_bytecode_frame()
if not frame:
print
'
Unable
to
locate
gdb
frame
for
python
bytecode
interpreter
'
print
('
Unable
to
locate
gdb
frame
for
python
bytecode
interpreter
')
return
pyop = frame.get_pyop()
if not pyop or pyop.is_optimized_out():
print
'
Unable
to
read
information
on
python
frame
'
print
('
Unable
to
read
information
on
python
frame
')
return
filename = pyop.filename()
...
...
@@ -1656,9 +1673,9 @@ def move_in_stack(move_up):
frame = iter_frame
if move_up:
print
'
Unable
to
find
an
older
python
frame
'
print
('
Unable
to
find
an
older
python
frame
')
else:
print
'
Unable
to
find
a
newer
python
frame
'
print
('
Unable
to
find
a
newer
python
frame
')
class PyUp(gdb.Command):
'
Select
and
print
the
python
stack
frame
that
called
this
one
(
if
any
)
'
...
...
@@ -1740,23 +1757,23 @@ class PyPrint(gdb.Command):
frame = Frame.get_selected_python_frame()
if not frame:
print
'
Unable
to
locate
python
frame
'
print
('
Unable
to
locate
python
frame
')
return
pyop_frame = frame.get_pyop()
if not pyop_frame:
print
'
Unable
to
read
information
on
python
frame
'
print
('
Unable
to
read
information
on
python
frame
')
return
pyop_var, scope = pyop_frame.get_var_by_name(name)
if pyop_var:
print
('
%
s
%
r
=
%
s
'
print('
%
s
%
r
=
%
s
'
% (scope,
name,
pyop_var.get_truncated_repr(MAX_OUTPUT_LEN)))
else:
print
'
%
r
not
found
' % name
print
('
%
r
not
found
' % name)
PyPrint()
...
...
@@ -1774,16 +1791,16 @@ class PyLocals(gdb.Command):
frame = Frame.get_selected_python_frame()
if not frame:
print
'
Unable
to
locate
python
frame
'
print
('
Unable
to
locate
python
frame
')
return
pyop_frame = frame.get_pyop()
if not pyop_frame:
print
'
Unable
to
read
information
on
python
frame
'
print
('
Unable
to
read
information
on
python
frame
')
return
for pyop_name, pyop_value in pyop_frame.iter_locals():
print
('
%
s
=
%
s
'
print('
%
s
=
%
s
'
% (pyop_name.proxyval(set()),
pyop_value.get_truncated_repr(MAX_OUTPUT_LEN)))
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment