summaryrefslogtreecommitdiffstats
path: root/scripts/kde-devel-gdb
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/kde-devel-gdb')
-rw-r--r--scripts/kde-devel-gdb299
1 files changed, 299 insertions, 0 deletions
diff --git a/scripts/kde-devel-gdb b/scripts/kde-devel-gdb
new file mode 100644
index 00000000..bf69d233
--- /dev/null
+++ b/scripts/kde-devel-gdb
@@ -0,0 +1,299 @@
+# 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/kdesdk/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->unicode[$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->unicode[$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
+
+