Warning, /sdk/kde-dev-scripts/kde-devel-gdb is written in an unsupported language. File is not indexed.
0001 # This file defines handy gdb macros for printing out Qt types
0002 # To use it, add this line to your ~/.gdbinit :
0003 # source /path/to/kde/sources/kdesdk/scripts/kde-devel-gdb
0004
0005 # Please don't use tabs in this file. When pasting a
0006 # macro definition to gdb, tabs are interpreted as completion.
0007
0008 # Note for macro development: when working a macro,
0009 # disable the confirmation before gdb allows to redefine a macro, using "set confirm 0".
0010
0011 # Disable printing of static members. Qt has too many, it clutters the output
0012 set print static-members off
0013
0014 # Remember history over restarts
0015 set history save
0016 set history filename ~/.gdb_history
0017
0018 # Show the real classname of object instances - e.g. (Kded *) 0x8073440 instead of (class QObject *) 0x8073440
0019 set print object
0020
0021 define printq4string
0022 printq4stringdata ($arg0).d
0023 end
0024 document printq4string
0025 Prints the contents of a Qt4 QString
0026 end
0027 define printq5string
0028 printq5stringdata ($arg0).d
0029 end
0030 document printq5string
0031 Prints the contents of a Qt5 QString
0032 end
0033
0034 define printq4stringdata
0035 set $d = ('QString::Data'*) $arg0
0036 set $i = 0
0037 # abort after a '-1' character, to avoid going on forever when printing a garbage string
0038 while $i < $d->size && ($i == 0 || (char)$d->data[$i-1] != -1)
0039 printf "%c", (char)($d->data[$i++] & 0xff)
0040 end
0041 printf "\n"
0042 end
0043 document printq4stringdata
0044 Prints the contents of a Qt4 QString::Data
0045 This is useful when the output of another command (e.g. printqmap)
0046 shows {d = 0xdeadbeef} for a QString, i.e. the qstringdata address
0047 instead of the QString object itself.
0048 printq4string $s and printq4stringdata $s.d are equivalent.
0049 end
0050
0051 define printq5stringdata
0052 set $d = ('QString::Data'*) $arg0
0053 set $data_char = (char*)$d + $d->offset
0054 set $data = (unsigned short*) $data_char
0055 set $size = $d->size
0056 set $i = 0
0057 while $i < $size
0058 set $c = (char)($data[$i++] & 0xff)
0059 printf "%c", $c
0060 # abort after a '-1' character, to avoid going on forever when printing a garbage string
0061 if $i != 0 && $c == -1
0062 printf "\n<output terminated: junk data?>"
0063 loop_break
0064 end
0065 end
0066 printf "\n"
0067 end
0068 document printq5stringdata
0069 Prints the contents of a Qt5 QString::Data
0070 This is useful when the output of another command (e.g. printqmap)
0071 shows {d = 0xdeadbeef} for a QString, i.e. the qstringdata address
0072 instead of the QString object itself.
0073 printq5string $s and printq5stringdata $s.d are equivalent.
0074 end
0075
0076 define print_utf8_char
0077 set $uc = $arg0
0078 if ( $uc < 0x80 )
0079 printf "%c", (unsigned char)($uc & 0x7f)
0080 else
0081 if ( $uc < 0x0800 )
0082 printf "%c", (unsigned char)(0xc0 | ($uc >> 6))
0083 else
0084 printf "%c", (unsigned char)(0xe0 | ($uc >> 12)
0085 printf "%c", (unsigned char)(0x80 | (($uc > 6) &0x3f)
0086 end
0087 printf "%c", (unsigned char)(0x80 | ((uchar) $uc & 0x3f))
0088 end
0089 end
0090 document print_utf8_char
0091 Prints a unicode value (stored as an unsigned short) as UTF-8.
0092 end
0093
0094 define printq4string_utf8
0095 set $i=0
0096 set $s = $arg0
0097 while $i < $s.d->size
0098 set $uc = (unsigned short) $s.d->data[$i++]
0099 print_utf8_char $uc
0100 end
0101 printf "\n"
0102 end
0103 document printq4string_utf8
0104 Prints the contents of a Qt4 QString encoded in utf8.
0105 Nice if you run your debug session in a utf8 enabled terminal.
0106 end
0107
0108 define printq5string_utf8
0109 set $i=0
0110 set $s = $arg0
0111 set $d = $s.d
0112 set $data_char = (char*)$d + $d->offset
0113 set $data = (unsigned short*) $data_char
0114 set $size = $d->size
0115 while $i < $size
0116 print_utf8_char $data[$i++]
0117 end
0118 printf "\n"
0119 end
0120 document printq5string_utf8
0121 Prints the contents of a Qt5 QString encoded in utf8.
0122 Nice if you run your debug session in a utf8 enabled terminal.
0123 end
0124
0125 define printqcstring
0126 print ($arg0).shd.data
0127 print ($arg0).shd.len
0128 end
0129 document printqcstring
0130 Prints the contents of a QCString (char * data, then length)
0131 end
0132
0133 define printq4bytearray
0134 print ($arg0)->d->data
0135 end
0136 document printq4bytearray
0137 Prints the contents of a Qt4 QByteArray (when it contains a string)
0138 end
0139
0140 define printqfont
0141 print *($arg0).d
0142 printqstring ($arg0).d->request.family
0143 print ($arg0).d->request.pointSize
0144 end
0145 document printqfont
0146 Prints the main attributes from a QFont, in particular the requested
0147 family and point size
0148 end
0149
0150 define printqcolor
0151 printf "(%d,%d,%d)\n", ($arg0).red(), ($arg0).green(), ($arg0).blue()
0152 end
0153 document printqcolor
0154 Prints a QColor as (R,G,B).
0155 Usage: 'printqcolor <QColor col>
0156 end
0157
0158 define printqmemarray
0159 # Maybe we could find it out the type by parsing "whatis $arg0"?
0160 set $arr = $arg0
0161 set $sz = sizeof($arg1)
0162 set $len = $arr->shd->len / $sz
0163 output $len
0164 printf " items in the array\n"
0165 set $i = 0
0166 while $i < $len
0167 # print "%s[%d] = %s\n", $arr, $i, *($arg1 *)(($arr->vec)[$i])
0168 print *($arg1 *)(($arr->shd->data) + ($i * $sz))
0169 set $i++
0170 end
0171 end
0172 document printqmemarray
0173 Prints the contents of a QMemArray. Pass the type as second argument.
0174 end
0175
0176 define printqptrvector
0177 # Maybe we could find it out the type by parsing "whatis $arg0"?
0178 set $arr = $arg0
0179 set $len = $arr->len
0180 output $len
0181 printf " items in the vector\n"
0182 set $i = 0
0183 while $i < $len
0184 # print "%s[%d] = %s\n", $arr, $i, *($arg1 *)(($arr->vec)[$i])
0185 print *($arg1 *)(($arr->vec)[$i])
0186 set $i++
0187 end
0188 end
0189 document printqptrvector
0190 Prints the contents of a QPtrVector. Pass the type as second argument.
0191 end
0192
0193 define printqptrvectoritem
0194 set $arr = $arg0
0195 set $i = $arg2
0196 print ($arg1 *)(($arr->vec)[$i])
0197 print *($arg1 *)(($arr->vec)[$i])
0198 end
0199 document printqptrvectoritem
0200 Print one item of a QPtrVector
0201 Usage: printqptrvectoritem vector type index
0202 end
0203
0204 define printq4map
0205 set $map = $arg0
0206 set $len = $map.d->size
0207 output $len
0208 printf " items in the map\n"
0209 set $it = $map.e->forward[0]
0210 set $_qmap_end = $map.e
0211 ## Requires a process...
0212 set $_qmap_payload = $map->payload()
0213 while $it != $map.e
0214 set $_qmap_nodeaddress = (char*)($it) - $_qmap_payload
0215 set $_qmap_node = ('QMap<$arg1,$arg2>::Node' *)($_qmap_nodeaddress)
0216 printf " key="
0217 output $_qmap_node->key
0218 printf " value="
0219 output $_qmap_node->value
0220 printf "\n"
0221 # just in case the key and/or the value is a qstring, try printq4string on it
0222 # (if this is too noisy with other types, remove it, and use
0223 # printq4stringdata on the shown d pointers instead, by hand)
0224 printq4string $_qmap_node->key
0225 printq4string $_qmap_node->value
0226 set $it = $it->forward[0]
0227 end
0228 end
0229 document printq4map
0230 Prints the full contents of a Qt 4 QMap
0231 Usage: 'printq4map map keytype valuetype'
0232 end
0233
0234 define printqptrlist
0235 set $list = $arg0
0236 set $len = $list.numNodes
0237 output $len
0238 printf " items in the list\n"
0239 set $it = $list.firstNode
0240 while $it != 0
0241 output $it->data
0242 printf "\n"
0243 set $it = $it->next
0244 end
0245 end
0246 document printqptrlist
0247 Prints the contents of a QPtrList.
0248 Usage: printqptrlist mylist
0249 end
0250
0251 define printqvaluelist
0252 set $list = $arg0
0253 set $len = $list.sh->nodes
0254 output $len
0255 printf " items in the list\n"
0256 set $it = $list.sh->node->next
0257 set $end = $list.sh->node
0258 while $it != $end
0259 output $it->data
0260 printf "\n"
0261 set $it = $it->next
0262 end
0263 end
0264 document printqvaluelist
0265 Prints the contents of a QValueList.
0266 Usage: printqvaluelist mylist
0267 end
0268
0269 define printqstringlist
0270 set $list = $arg0
0271 set $len = $list.sh->nodes
0272 output $len
0273 printf " items in the list\n"
0274 set $it = $list.sh->node->next
0275 set $end = $list.sh->node
0276 while $it != $end
0277 printqstring $it->data
0278 set $it = $it->next
0279 end
0280 end
0281 document printqstringlist
0282 Prints the contents of a QStringList.
0283 Usage: printqstringlist mylist
0284 end
0285
0286 define printqregion
0287 printqmemarray ($arg0).rects() QRect
0288 end
0289 document printqregion
0290 Prints the rectangles that make up a QRegion. Needs a running process.
0291 Usage: printqregion myregion
0292 end
0293
0294 # Bad implementation, requires a running process.
0295 # Needs to be refined, i.e. figuring out the right void* pointers casts.
0296 # Simon says: each Node contains the d pointer of the QString.
0297 define printq4stringlist
0298 # This is ugly, but we need to avoid conflicts with printq4string's own vars...
0299 set $q4sl_i = 0
0300 set $q4sl_d = & $arg0
0301 set $q4sl_sz = $q4sl_d->size()
0302 while $q4sl_i < $q4sl_sz
0303 output $q4sl_i
0304 printf " "
0305 printq4string $q4sl_d->at($q4sl_i++)
0306 end
0307 end
0308 document printq4stringlist
0309 Prints the contents of a Qt4 QStringList.
0310 Usage: printq4stringlist mylist
0311 end
0312
0313 define identifyq4object
0314 set $obj=$arg0
0315 set $objectName=((QObjectPrivate *)($obj->d_ptr))->objectName
0316 printf " name:"
0317 printq4string $objectName
0318 printf " class:"
0319 # this requires a process, though
0320 print $obj->metaObject()->className()
0321 end
0322
0323 # You print QString's too often to type the long name :-)
0324 # Change when Qt6 is the default
0325 define qs
0326 printq5string $arg0
0327 end
0328
0329 define qs5
0330 printq5string $arg0
0331 end
0332
0333 define qs4
0334 printq4string $arg0
0335 end
0336
0337 define printqdatetime
0338 printqdate ($arg0).d
0339 printqtime ($arg0).t
0340 end
0341 document printqdatetime
0342 Prints a QDateTime
0343 Usage: printqdatetime myqdt
0344 end
0345 define printqdate
0346 printf "(Y:%d M:%d D:%d)\n", ($arg0).year(), ($arg0).month(), ($arg0).day()
0347 end
0348 document printqdate
0349 Prints a QDate
0350 Usage: printqdate mydate
0351 end
0352 define printqtime
0353 printf "(H:%d M:%d S:%d)\n", ($arg0).hour(), ($arg0).minute(), ($arg0).second()
0354 end
0355 document printqtime
0356 Prints a QTime
0357 Usage: printqtime mytime
0358 end
0359
0360 # You are at f(g(h(i(), j(k(l())...) and you want to enter f: type fs <enter> <enter> <enter>
0361 # fs=finish+step
0362 define fs
0363 finish
0364 step
0365 end