Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Tobias Hunger
qt-creator
Commits
6d6c8e46
Commit
6d6c8e46
authored
Jun 10, 2010
by
hjk
Browse files
debugger: cache results of gdb.lookup_type
parent
1cf7fbb6
Changes
2
Hide whitespace changes
Inline
Side-by-side
share/qtcreator/gdbmacros/dumper.py
View file @
6d6c8e46
...
...
@@ -88,12 +88,22 @@ def isGoodGdb():
# and gdb.VERSION != "6.8.50.20090630-cvs"
return
'parse_and_eval'
in
__builtin__
.
dir
(
gdb
)
typeCache
=
{}
def
lookupType
(
typestring
):
type
=
typeCache
.
get
(
typestring
)
#warn("LOOKUP: %s -> %s" % (typestring, type))
if
type
is
None
:
type
=
gdb
.
lookup_type
(
typestring
)
typeCache
[
typestring
]
=
type
return
type
def
cleanAddress
(
addr
):
if
addr
is
None
:
return
"<no address>"
# We cannot use str(addr) as it yields rubbish for char pointers
# that might trigger Unicode encoding errors.
return
addr
.
cast
(
gdb
.
lookup
_t
ype
(
"void"
).
pointer
())
return
addr
.
cast
(
lookup
T
ype
(
"void"
).
pointer
())
# Workaround for gdb < 7.1
def
numericTemplateArgument
(
type
,
position
):
...
...
@@ -535,7 +545,7 @@ def checkRef(ref):
check
(
count
<
1000000
)
# assume there aren't a million references to any object
#def couldBePointer(p, align):
# type =
gdb.
lookup
_t
ype("unsigned int")
# type = lookup
T
ype("unsigned int")
# ptr = gdb.Value(p).cast(type)
# d = int(str(ptr))
# warn("CHECKING : %s %d " % (p, ((d & 3) == 0 and (d > 1000 or d == 0))))
...
...
@@ -559,7 +569,7 @@ def isNull(p):
# for invalid char *, as their "contents" is being examined
#s = str(p)
#return s == "0x0" or s.startswith("0x0 ")
return
p
.
cast
(
gdb
.
lookup
_t
ype
(
"void"
).
pointer
())
==
0
return
p
.
cast
(
lookup
T
ype
(
"void"
).
pointer
())
==
0
movableTypes
=
set
([
"QBrush"
,
"QBitArray"
,
"QByteArray"
,
...
...
@@ -648,7 +658,7 @@ def findFirstZero(p, max):
def
extractCharArray
(
p
,
maxsize
):
t
=
gdb
.
lookup
_t
ype
(
"unsigned char"
).
pointer
()
t
=
lookup
T
ype
(
"unsigned char"
).
pointer
()
p
=
p
.
cast
(
t
)
i
=
findFirstZero
(
p
,
maxsize
)
limit
=
select
(
i
<
0
,
maxsize
,
i
)
...
...
@@ -673,7 +683,7 @@ def extractByteArray(value):
return
extractCharArray
(
data
,
100
)
def
encodeCharArray
(
p
,
maxsize
,
size
=
-
1
):
t
=
gdb
.
lookup
_t
ype
(
"unsigned char"
).
pointer
()
t
=
lookup
T
ype
(
"unsigned char"
).
pointer
()
p
=
p
.
cast
(
t
)
if
size
==
-
1
:
i
=
findFirstZero
(
p
,
maxsize
)
...
...
@@ -689,7 +699,7 @@ def encodeCharArray(p, maxsize, size = -1):
return
s
def
encodeChar2Array
(
p
,
maxsize
):
t
=
gdb
.
lookup
_t
ype
(
"unsigned short"
).
pointer
()
t
=
lookup
T
ype
(
"unsigned short"
).
pointer
()
p
=
p
.
cast
(
t
)
i
=
findFirstZero
(
p
,
maxsize
)
limit
=
select
(
i
<
0
,
maxsize
,
i
)
...
...
@@ -702,7 +712,7 @@ def encodeChar2Array(p, maxsize):
return
s
def
encodeChar4Array
(
p
,
maxsize
):
t
=
gdb
.
lookup
_t
ype
(
"unsigned int"
).
pointer
()
t
=
lookup
T
ype
(
"unsigned int"
).
pointer
()
p
=
p
.
cast
(
t
)
i
=
findFirstZero
(
p
,
maxsize
)
limit
=
select
(
i
<
0
,
maxsize
,
i
)
...
...
@@ -774,7 +784,7 @@ class FrameCommand(gdb.Command):
super
(
FrameCommand
,
self
).
__init__
(
"bb"
,
gdb
.
COMMAND_OBSCURE
)
def
invoke
(
self
,
args
,
from_tty
):
if
Tru
e
:
if
Fals
e
:
bb
(
args
)
else
:
import
cProfile
...
...
@@ -1097,7 +1107,7 @@ class Dumper:
def
putPointerValue
(
self
,
value
):
# Use a lower priority
self
.
putValue
(
"0x%x"
%
value
.
dereference
().
cast
(
gdb
.
lookup
_t
ype
(
"unsigned long"
)),
None
,
-
1
)
lookup
T
ype
(
"unsigned long"
)),
None
,
-
1
)
def
putStringValue
(
self
,
value
):
if
value
is
None
:
...
...
@@ -1381,7 +1391,7 @@ class Dumper:
if
self
.
isExpanded
(
item
):
if
value
.
type
.
code
==
gdb
.
TYPE_CODE_ARRAY
:
baseptr
=
value
.
cast
(
value
.
type
.
target
().
pointer
())
charptr
=
gdb
.
lookup
_t
ype
(
"unsigned char"
).
pointer
()
charptr
=
lookup
T
ype
(
"unsigned char"
).
pointer
()
addr1
=
(
baseptr
+
1
).
cast
(
charptr
)
addr0
=
baseptr
.
cast
(
charptr
)
self
.
putField
(
"addrbase"
,
cleanAddress
(
addr0
))
...
...
share/qtcreator/gdbmacros/gdbmacros.py
View file @
6d6c8e46
...
...
@@ -27,7 +27,7 @@ def qdump__QByteArray(d, item):
d
.
putNumChild
(
size
)
if
d
.
isExpanded
(
item
):
innerType
=
gdb
.
lookup
_t
ype
(
"char"
)
innerType
=
lookup
T
ype
(
"char"
)
with
Children
(
d
,
[
size
,
1000
],
innerType
):
data
=
d_ptr
[
'data'
]
p
=
gdb
.
Value
(
data
.
cast
(
innerType
.
pointer
()))
...
...
@@ -57,7 +57,7 @@ def qdump__QAbstractItem(d, item):
d
.
putNumChild
(
rowCount
*
columnCount
)
if
d
.
isExpanded
(
item
):
with
Children
(
d
):
innerType
=
gdb
.
lookup
_t
ype
(
d
.
ns
+
"QAbstractItem"
)
innerType
=
lookup
T
ype
(
d
.
ns
+
"QAbstractItem"
)
for
row
in
xrange
(
rowCount
):
for
column
in
xrange
(
columnCount
):
with
SubItem
(
d
):
...
...
@@ -202,7 +202,7 @@ def qdump__QFileInfo(d, item):
d
.
putStringValue
(
call
(
item
.
value
,
"filePath()"
))
d
.
putNumChild
(
3
)
if
d
.
isExpanded
(
item
):
with
Children
(
d
,
10
,
gdb
.
lookup
_t
ype
(
d
.
ns
+
"QString"
)):
with
Children
(
d
,
10
,
lookup
T
ype
(
d
.
ns
+
"QString"
)):
d
.
putCallItem
(
"absolutePath"
,
item
,
"absolutePath()"
)
d
.
putCallItem
(
"absoluteFilePath"
,
item
,
"absoluteFilePath()"
)
d
.
putCallItem
(
"canonicalPath"
,
item
,
"canonicalPath()"
)
...
...
@@ -406,7 +406,7 @@ def qdump__QList(d, item):
# in the frontend.
# So as first approximation only do the 'isLarge' check:
isInternal
=
innerSize
<=
d_ptr
.
type
.
sizeof
and
d
.
isMovableType
(
innerType
)
dummyType
=
gdb
.
lookup
_t
ype
(
"void"
).
pointer
().
pointer
()
dummyType
=
lookup
T
ype
(
"void"
).
pointer
().
pointer
()
innerTypePointer
=
innerType
.
pointer
()
p
=
gdb
.
Value
(
array
).
cast
(
dummyType
)
+
begin
if
innerTypeIsPointer
:
...
...
@@ -458,7 +458,7 @@ def qdump__QImage(d, item):
d
.
put
(
"%08x"
%
int
(
d_ptr
[
"width"
]))
d
.
put
(
"%08x"
%
int
(
d_ptr
[
"height"
]))
d
.
put
(
"%08x"
%
int
(
d_ptr
[
"format"
]))
p
=
bits
.
cast
(
gdb
.
lookup
_t
ype
(
"unsigned int"
).
pointer
())
p
=
bits
.
cast
(
lookup
T
ype
(
"unsigned int"
).
pointer
())
for
i
in
xrange
(
nbytes
/
4
):
d
.
put
(
"%08x"
%
int
(
p
.
dereference
()))
p
+=
1
...
...
@@ -467,7 +467,7 @@ def qdump__QImage(d, item):
# Write to an external file. Much faster ;-(
file
=
tempfile
.
mkstemp
(
prefix
=
"gdbpy_"
)
filename
=
file
[
1
].
replace
(
"
\\
"
,
"
\\\\
"
)
p
=
bits
.
cast
(
gdb
.
lookup
_t
ype
(
"unsigned char"
).
pointer
())
p
=
bits
.
cast
(
lookup
T
ype
(
"unsigned char"
).
pointer
())
gdb
.
execute
(
"dump binary memory %s %s %s"
%
(
filename
,
cleanAddress
(
p
),
cleanAddress
(
p
+
nbytes
)))
d
.
putDisplay
(
DisplayImage
,
" %d %d %d %s"
...
...
@@ -494,7 +494,7 @@ def qdump__QLocale(d, item):
d
.
putStringValue
(
call
(
item
.
value
,
"name()"
))
d
.
putNumChild
(
8
)
if
d
.
isExpanded
(
item
):
with
Children
(
d
,
1
,
gdb
.
lookup
_t
ype
(
d
.
ns
+
"QChar"
),
0
):
with
Children
(
d
,
1
,
lookup
T
ype
(
d
.
ns
+
"QChar"
),
0
):
d
.
putCallItem
(
"country"
,
item
,
"country()"
)
d
.
putCallItem
(
"language"
,
item
,
"language()"
)
d
.
putCallItem
(
"measurementSystem"
,
item
,
"measurementSystem()"
)
...
...
@@ -548,9 +548,9 @@ def qdump__QMap(d, item):
# QMapPayloadNode is QMapNode except for the 'forward' member, so
# its size is most likely the offset of the 'forward' member therein.
# Or possibly 2 * sizeof(void *)
nodeType
=
gdb
.
lookup
_t
ype
(
d
.
ns
+
"QMapNode<%s, %s>"
%
(
keyType
,
valueType
))
payloadSize
=
nodeType
.
sizeof
-
2
*
gdb
.
lookup
_t
ype
(
"void"
).
pointer
().
sizeof
charPtr
=
gdb
.
lookup
_t
ype
(
"char"
).
pointer
()
nodeType
=
lookup
T
ype
(
d
.
ns
+
"QMapNode<%s, %s>"
%
(
keyType
,
valueType
))
payloadSize
=
nodeType
.
sizeof
-
2
*
lookup
T
ype
(
"void"
).
pointer
().
sizeof
charPtr
=
lookup
T
ype
(
"char"
).
pointer
()
innerType
=
select
(
isSimpleKey
and
isSimpleValue
,
valueType
,
nodeType
)
...
...
@@ -601,7 +601,7 @@ def qdump__QObject(d, item):
# superData = superData.dereference()["d"]["superdata"]
# warn("SUPERDATA: %s" % superData)
privateType
=
gdb
.
lookup
_t
ype
(
d
.
ns
+
"QObjectPrivate"
).
pointer
()
privateType
=
lookup
T
ype
(
d
.
ns
+
"QObjectPrivate"
).
pointer
()
d_ptr
=
item
.
value
[
"d_ptr"
][
"d"
].
cast
(
privateType
).
dereference
()
#warn("D_PTR: %s " % d_ptr)
objectName
=
d_ptr
[
"objectName"
]
...
...
@@ -638,7 +638,7 @@ def qdump__QObject(d, item):
if
isNull
(
extraData
):
dynamicPropertyCount
=
0
else
:
extraDataType
=
gdb
.
lookup
_t
ype
(
extraDataType
=
lookup
T
ype
(
d
.
ns
+
"QObjectPrivate::ExtraData"
).
pointer
()
extraData
=
extraData
.
cast
(
extraDataType
)
ed
=
extraData
.
dereference
()
...
...
@@ -664,12 +664,12 @@ def qdump__QObject(d, item):
if
d
.
isExpandedIName
(
item
.
iname
+
".properties"
):
with
Children
(
d
,
[
propertyCount
,
500
]):
# Dynamic properties.
dummyType
=
gdb
.
lookup
_t
ype
(
"void"
).
pointer
().
pointer
()
namesType
=
gdb
.
lookup
_t
ype
(
d
.
ns
+
"QByteArray"
)
dummyType
=
lookup
T
ype
(
"void"
).
pointer
().
pointer
()
namesType
=
lookup
T
ype
(
d
.
ns
+
"QByteArray"
)
valuesBegin
=
values
[
"d"
][
"begin"
]
valuesEnd
=
values
[
"d"
][
"end"
]
valuesArray
=
values
[
"d"
][
"array"
]
valuesType
=
gdb
.
lookup
_t
ype
(
d
.
ns
+
"QVariant"
)
valuesType
=
lookup
T
ype
(
d
.
ns
+
"QVariant"
)
p
=
namesArray
.
cast
(
dummyType
)
+
namesBegin
q
=
valuesArray
.
cast
(
dummyType
)
+
valuesBegin
for
i
in
xrange
(
dynamicPropertyCount
):
...
...
@@ -720,7 +720,7 @@ def qdump__QObject(d, item):
# type = type[type.find('"') + 1 : type.rfind('"')]
# type = type.replace("Q", d.ns + "Q") # HACK!
# data = call(item.value, "constData()")
# tdata = data.cast(
gdb.
lookup
_t
ype(type).pointer()).dereference()
# tdata = data.cast(lookup
T
ype(type).pointer()).dereference()
# d.putValue("(%s)" % tdata.type)
# d.putType(tdata.type)
# d.putNumChild(1)
...
...
@@ -1485,7 +1485,7 @@ def qdump__QStringList(d, item):
d
.
putItemCount
(
size
)
d
.
putNumChild
(
size
)
if
d
.
isExpanded
(
item
):
innerType
=
gdb
.
lookup
_t
ype
(
d
.
ns
+
"QString"
)
innerType
=
lookup
T
ype
(
d
.
ns
+
"QString"
)
ptr
=
gdb
.
Value
(
d_ptr
[
"array"
]).
cast
(
innerType
.
pointer
())
ptr
+=
d_ptr
[
"begin"
]
with
Children
(
d
,
[
size
,
1000
],
innerType
):
...
...
@@ -1645,11 +1645,11 @@ def qdumpHelper__QVariant(d, value):
inner
=
d
.
ns
+
"QQuadernion"
if
len
(
inner
):
innerType
=
gdb
.
lookup
_t
ype
(
inner
)
sizePD
=
gdb
.
lookup
_t
ype
(
d
.
ns
+
'QVariant::Private::Data'
).
sizeof
innerType
=
lookup
T
ype
(
inner
)
sizePD
=
lookup
T
ype
(
d
.
ns
+
'QVariant::Private::Data'
).
sizeof
if
innerType
.
sizeof
>
sizePD
:
sizePS
=
gdb
.
lookup
_t
ype
(
d
.
ns
+
'QVariant::PrivateShared'
).
sizeof
val
=
(
sizePS
+
data
.
cast
(
gdb
.
lookup
_t
ype
(
'char'
).
pointer
()))
\
sizePS
=
lookup
T
ype
(
d
.
ns
+
'QVariant::PrivateShared'
).
sizeof
val
=
(
sizePS
+
data
.
cast
(
lookup
T
ype
(
'char'
).
pointer
()))
\
.
cast
(
innerType
.
pointer
()).
dereference
()
else
:
val
=
data
.
cast
(
innerType
)
...
...
@@ -1665,7 +1665,7 @@ def qdump__QVariant(d, item):
#warn("VARIANT DATA: '%s' '%s' '%s': " % (val, inner, innert))
if
len
(
inner
):
innerType
=
gdb
.
lookup
_t
ype
(
inner
)
innerType
=
lookup
T
ype
(
inner
)
# FIXME: Why "shared"?
if
innerType
.
sizeof
>
item
.
value
[
"d"
][
"data"
].
type
.
sizeof
:
v
=
item
.
value
[
"d"
][
"data"
][
"shared"
][
"ptr"
]
\
...
...
@@ -1683,7 +1683,7 @@ def qdump__QVariant(d, item):
type
=
type
[
type
.
find
(
'"'
)
+
1
:
type
.
rfind
(
'"'
)]
type
=
type
.
replace
(
"Q"
,
d
.
ns
+
"Q"
)
# HACK!
data
=
call
(
item
.
value
,
"constData()"
)
tdata
=
data
.
cast
(
gdb
.
lookup
_t
ype
(
type
).
pointer
()).
dereference
()
tdata
=
data
.
cast
(
lookup
T
ype
(
type
).
pointer
()).
dereference
()
d
.
putType
(
"%sQVariant (%s)"
%
(
d
.
ns
,
tdata
.
type
))
d
.
putNumChild
(
1
)
if
d
.
isExpanded
(
item
):
...
...
@@ -1879,7 +1879,7 @@ def qdump__std__string(d, item):
data
=
item
.
value
[
"_M_dataplus"
][
"_M_p"
]
baseType
=
item
.
value
.
type
.
unqualified
().
strip_typedefs
()
charType
=
baseType
.
template_argument
(
0
)
repType
=
gdb
.
lookup
_t
ype
(
"%s::_Rep"
%
baseType
).
pointer
()
repType
=
lookup
T
ype
(
"%s::_Rep"
%
baseType
).
pointer
()
rep
=
(
data
.
cast
(
repType
)
-
1
).
dereference
()
size
=
rep
[
'_M_length'
]
alloc
=
rep
[
'_M_capacity'
]
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new 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