You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
300 lines
7.5 KiB
300 lines
7.5 KiB
# This file defines handy gdb macros for printing out Qt types
|
|
# To use it, add this line to your ~/.gdbinit :
|
|
# source /path/to/kde/sources/tdesdk/scripts/kde-devel-gdb
|
|
|
|
# Please don't use tabs in this file. When pasting a
|
|
# macro definition to gdb, tabs are interpreted as completion.
|
|
|
|
# Disable printing of static members. Qt has too many, it clutters the output
|
|
set print static-members off
|
|
|
|
define printqstring
|
|
printqstringdata $arg0.d
|
|
end
|
|
document printqstring
|
|
Prints the contents of a QString
|
|
end
|
|
define printq4string
|
|
printq4stringdata $arg0.d
|
|
end
|
|
document printq4string
|
|
Prints the contents of a Qt QString
|
|
end
|
|
|
|
define printqstringdata
|
|
set $i=0
|
|
set $d = (QStringData *)$arg0
|
|
while $i < $d->len
|
|
printf "%c", (char)($d->tqunicode[$i++].ucs & 0xff)
|
|
end
|
|
printf "\n"
|
|
end
|
|
document printqstringdata
|
|
Prints the contents of a QStringData
|
|
This is useful when the output of another command (e.g. printqmap)
|
|
shows {d = 0xdeadbeef} for a QString, i.e. the qstringdata address
|
|
instead of the QString object itself.
|
|
printqstring $s and printqstringdata $s.d are equivalent.
|
|
end
|
|
|
|
define printq4stringdata
|
|
set $i=0
|
|
set $d = $arg0
|
|
while $i < $d->size
|
|
printf "%c", (char)($d->data[$i++] & 0xff)
|
|
end
|
|
printf "\n"
|
|
end
|
|
document printq4stringdata
|
|
Prints the contents of a Qt4 QString::Data
|
|
This is useful when the output of another command (e.g. printqmap)
|
|
shows {d = 0xdeadbeef} for a QString, i.e. the qstringdata address
|
|
instead of the QString object itself.
|
|
printq4string $s and printq4stringdata $s.d are equivalent.
|
|
end
|
|
|
|
define printqstring_utf8
|
|
set $i=0
|
|
set $s = $arg0
|
|
while $i < $s.d->len
|
|
set $uc = (unsigned short) $s.d->tqunicode[$i++].ucs
|
|
if ( $uc < 0x80 )
|
|
printf "%c", (unsigned char)($uc & 0x7f)
|
|
else
|
|
if ( $uc < 0x0800 )
|
|
printf "%c", (unsigned char)(0xc0 | ($uc >> 6))
|
|
else
|
|
printf "%c", (unsigned char)(0xe0 | ($uc >> 12)
|
|
printf "%c", (unsigned char)(0x80 | (($uc > 6) &0x3f)
|
|
end
|
|
printf "%c", (unsigned char)(0x80 | ((uchar) $uc & 0x3f))
|
|
end
|
|
end
|
|
printf "\n"
|
|
end
|
|
document printqstring_utf8
|
|
Prints the contents of a QString encoded in utf8.
|
|
Nice if you run your debug session in a utf8 enabled terminal.
|
|
end
|
|
|
|
define printqcstring
|
|
print $arg0.shd.data
|
|
print $arg0.shd.len
|
|
end
|
|
document printqcstring
|
|
Prints the contents of a QCString (char * data, then length)
|
|
end
|
|
|
|
define printq4bytearray
|
|
print $arg0->d->data
|
|
end
|
|
document printq4bytearray
|
|
Prints the contents of a Qt4 QByteArray (when it contains a string)
|
|
end
|
|
|
|
define printqfont
|
|
print *($arg0).d
|
|
printqstring ($arg0).d->request.family
|
|
print ($arg0).d->request.pointSize
|
|
end
|
|
document printqfont
|
|
Prints the main attributes from a QFont, in particular the requested
|
|
family and point size
|
|
end
|
|
|
|
define printqcolor
|
|
printf "(%d,%d,%d)\n", ($arg0).red(), ($arg0).green(), ($arg0).blue()
|
|
end
|
|
document printqcolor
|
|
Prints a QColor as (R,G,B).
|
|
Usage: 'printqcolor <QColor col>
|
|
end
|
|
|
|
define printqmemarray
|
|
# Maybe we could find it out the type by parsing "whatis $arg0"?
|
|
set $arr = $arg0
|
|
set $sz = sizeof($arg1)
|
|
set $len = $arr->shd->len / $sz
|
|
output $len
|
|
printf " items in the array\n"
|
|
set $i = 0
|
|
while $i < $len
|
|
# print "%s[%d] = %s\n", $arr, $i, *($arg1 *)(($arr->vec)[$i])
|
|
print *($arg1 *)(($arr->shd->data) + ($i * $sz))
|
|
set $i++
|
|
end
|
|
end
|
|
document printqmemarray
|
|
Prints the contents of a QMemArray. Pass the type as second argument.
|
|
end
|
|
|
|
define printqptrvector
|
|
# Maybe we could find it out the type by parsing "whatis $arg0"?
|
|
set $arr = $arg0
|
|
set $len = $arr->len
|
|
output $len
|
|
printf " items in the vector\n"
|
|
set $i = 0
|
|
while $i < $len
|
|
# print "%s[%d] = %s\n", $arr, $i, *($arg1 *)(($arr->vec)[$i])
|
|
print *($arg1 *)(($arr->vec)[$i])
|
|
set $i++
|
|
end
|
|
end
|
|
document printqptrvector
|
|
Prints the contents of a QPtrVector. Pass the type as second argument.
|
|
end
|
|
|
|
define printqptrvectoritem
|
|
set $arr = $arg0
|
|
set $i = $arg2
|
|
print ($arg1 *)(($arr->vec)[$i])
|
|
print *($arg1 *)(($arr->vec)[$i])
|
|
end
|
|
document printqptrvectoritem
|
|
Print one item of a QPtrVector
|
|
Usage: printqptrvectoritem vector type index
|
|
end
|
|
|
|
define printqmap
|
|
set $map = $arg0
|
|
set $len = $map.sh->node_count
|
|
output $len
|
|
printf " items in the map\n"
|
|
set $header = $map.sh->header
|
|
# How to parse the key and value types from whatis?
|
|
set $it = (QMapNode<$arg1,$arg2> *)($header->left)
|
|
while $it != $header
|
|
printf " key="
|
|
output $it->key
|
|
printf " value="
|
|
output $it->data
|
|
printf "\n"
|
|
_qmapiterator_inc $it
|
|
set $it = (QMapNode<$arg1,$arg2> *)($ret)
|
|
end
|
|
end
|
|
document printqmap
|
|
Prints the full contents of a QMap
|
|
Usage: 'printqmap map keytype valuetype'
|
|
end
|
|
|
|
|
|
define _qmapiterator_inc
|
|
set $ret = $arg0
|
|
if $ret->right != 0
|
|
set $ret = $ret->right
|
|
while $ret->left != 0
|
|
set $ret = $ret->left
|
|
end
|
|
else
|
|
set $y = $ret->parent
|
|
while $ret == $y->right
|
|
set $ret = $y
|
|
set $y = $y->parent
|
|
end
|
|
if $ret->right != $y
|
|
set $ret = $y
|
|
end
|
|
end
|
|
end
|
|
document _qmapiterator_inc
|
|
Increment a qmap iterator (internal method, used by printqmap)
|
|
end
|
|
|
|
define printqptrlist
|
|
set $list = $arg0
|
|
set $len = $list.numNodes
|
|
output $len
|
|
printf " items in the list\n"
|
|
set $it = $list.firstNode
|
|
while $it != 0
|
|
output $it->data
|
|
printf "\n"
|
|
set $it = $it->next
|
|
end
|
|
end
|
|
document printqptrlist
|
|
Prints the contents of a QPtrList.
|
|
Usage: printqptrlist mylist
|
|
end
|
|
|
|
define printqvaluelist
|
|
set $list = $arg0
|
|
set $len = $list.sh->nodes
|
|
output $len
|
|
printf " items in the list\n"
|
|
set $it = $list.sh->node->next
|
|
set $end = $list.sh->node
|
|
while $it != $end
|
|
output $it->data
|
|
printf "\n"
|
|
set $it = $it->next
|
|
end
|
|
end
|
|
document printqvaluelist
|
|
Prints the contents of a QValueList.
|
|
Usage: printqvaluelist mylist
|
|
end
|
|
|
|
define printqstringlist
|
|
set $list = $arg0
|
|
set $len = $list.sh->nodes
|
|
output $len
|
|
printf " items in the list\n"
|
|
set $it = $list.sh->node->next
|
|
set $end = $list.sh->node
|
|
while $it != $end
|
|
printqstring $it->data
|
|
set $it = $it->next
|
|
end
|
|
end
|
|
document printqstringlist
|
|
Prints the contents of a QStringList.
|
|
Usage: printqstringlist mylist
|
|
end
|
|
|
|
# Bad implementation, requires a running process.
|
|
# Needs to be refined, i.e. figuring out the right void* pointers casts.
|
|
# Simon says: each Node contains the d pointer of the QString.
|
|
define printq4stringlist
|
|
# This is ugly, but we need to avoid conflicts with printq4string's own vars...
|
|
set $q4sl_i = 0
|
|
set $q4sl_d = & $arg0
|
|
set $q4sl_sz = $q4sl_d->size()
|
|
while $q4sl_i < $q4sl_sz
|
|
output $q4sl_i
|
|
printf " "
|
|
printq4string $q4sl_d->at($q4sl_i++)
|
|
end
|
|
end
|
|
document printq4stringlist
|
|
Prints the contents of a Qt4 QStringList.
|
|
Usage: printq4stringlist mylist
|
|
end
|
|
|
|
define printqdatetime
|
|
printqdate ($arg0).d
|
|
printqtime ($arg0).t
|
|
end
|
|
document printqdatetime
|
|
Prints a QDateTime
|
|
Usage: printqdatetime myqdt
|
|
end
|
|
define printqdate
|
|
printf "(Y:%d M:%d D:%d)\n", ($arg0).year(), ($arg0).month(), ($arg0).day()
|
|
end
|
|
document printqdate
|
|
Prints a QDate
|
|
Usage: printqdate mydate
|
|
end
|
|
define printqtime
|
|
printf "(H:%d M:%d S:%d)\n", ($arg0).hour(), ($arg0).minute(), ($arg0).second()
|
|
end
|
|
document printqtime
|
|
Prints a QTime
|
|
Usage: printqtime mytime
|
|
end
|
|
|
|
|