Difference between revisions of "Gecko:Debugging Tools"
From MozillaWiki
(→Reflow Logs) |
(→Frame Tree Dump: add link to a page with documentation on layout debugger) |
||
(10 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
+ | == .gdbinit == | ||
+ | |||
+ | [http://web.mit.edu/bzbarsky/www/gdbinit bz's gdbinit] | ||
+ | |||
+ | == GDB pretty printers == | ||
+ | |||
+ | [http://hg.mozilla.org/users/jblandy_mozilla.com/archer-mozilla/ JS-specific printers] | ||
+ | |||
+ | [http://hg.mozilla.org/users/josh_joshmatthews.net/archer-mozilla/ General gecko printers] | ||
+ | |||
+ | == Printing arrays == | ||
+ | |||
+ | define ptarray | ||
+ | if $argc == 0 | ||
+ | help ptarray | ||
+ | else | ||
+ | set $size = $arg0.mHdr->mLength | ||
+ | set $capacity = $arg0.mHdr->mCapacity | ||
+ | set $size_max = $size - 1 | ||
+ | set $elts = $arg0.Elements() | ||
+ | end | ||
+ | if $argc == 1 | ||
+ | set $i = 0 | ||
+ | while $i < $size | ||
+ | printf "elem[%u]: ", $i | ||
+ | p *($elts + $i) | ||
+ | set $i++ | ||
+ | end | ||
+ | end | ||
+ | if $argc == 2 | ||
+ | set $idx = $arg1 | ||
+ | if $idx < 0 || $idx > $size_max | ||
+ | printf "idx1, idx2 are not in acceptable range: [0..%u].\n", $size_max | ||
+ | else | ||
+ | printf "elem[%u]: ", $idx | ||
+ | p *($elts + $idx) | ||
+ | end | ||
+ | end | ||
+ | if $argc == 3 | ||
+ | set $start_idx = $arg1 | ||
+ | set $stop_idx = $arg2 | ||
+ | if $start_idx > $stop_idx | ||
+ | set $tmp_idx = $start_idx | ||
+ | set $start_idx = $stop_idx | ||
+ | set $stop_idx = $tmp_idx | ||
+ | end | ||
+ | if $start_idx < 0 || $stop_idx < 0 || $start_idx > $size_max || $stop_idx > $size_max | ||
+ | printf "idx1, idx2 are not in acceptable range: [0..%u].\n", $size_max | ||
+ | else | ||
+ | set $i = $start_idx | ||
+ | while $i <= $stop_idx | ||
+ | printf "elem[%u]: ", $i | ||
+ | p *($elts + $i) | ||
+ | set $i++ | ||
+ | end | ||
+ | end | ||
+ | end | ||
+ | if $argc > 0 | ||
+ | printf "nsTArray length = %u\n", $size | ||
+ | printf "nsTArray capacity = %u\n", $capacity | ||
+ | printf "Element " | ||
+ | whatis *$elts | ||
+ | end | ||
+ | end | ||
+ | |||
+ | [http://blog.mozilla.com/cjones/2010/04/30/print-nstarrays-in-gdb/ Chris Jones' handy ptarray command] | ||
+ | |||
== Frame Tree Dump == | == Frame Tree Dump == | ||
− | <bz> for a frame dump, you can use the layout debugger, or... if you're in a debugger and want to examine the tree, you can do | + | <bz> for a frame dump, you can use the [https://developer.mozilla.org/en-US/docs/Mozilla/Debugging/Layout_Debugger layout debugger], or... if you're in a debugger and want to examine the tree, you can do |
def frametree | def frametree | ||
− | + | call nsFrame::DumpFrameTree($arg0) | |
− | |||
− | |||
− | |||
end | end | ||
Line 13: | Line 77: | ||
<bz> That should work when called on any nsIFrame to dump the tree it belongs to | <bz> That should work when called on any nsIFrame to dump the tree it belongs to | ||
+ | == Printing nsIAtoms == | ||
+ | |||
+ | def pa | ||
+ | set $atom = $arg0 | ||
+ | if (sizeof(*((&*$atom)->mString)) == 2) | ||
+ | pu (&*$atom)->mString | ||
+ | end | ||
+ | end | ||
+ | |||
+ | == Reflow Logs == | ||
− | + | See [[http://www.mozilla.org/newlayout/doc/frame_reflow_debug.html Debugging Frame Reflow]] | |
− | + | == Printing strings == | |
− | |||
− | |||
− | + | # Define a "ps" command to display subclasses of nsAC?String. Note that | |
+ | # this assumes strings as of Gecko 1.9 (well, and probably a few | ||
+ | # releases before that as well); going back far enough will get you | ||
+ | # to string classes that this function doesn't work for. | ||
+ | def ps | ||
+ | set $str = $arg0 | ||
+ | if (sizeof(*$str.mData) == 1 && ($str.mFlags & 1) != 0) | ||
+ | print $str.mData | ||
+ | else | ||
+ | pu $str.mData $str.mLength | ||
+ | end | ||
+ | end | ||
− | < | + | # Define a "pu" command to display PRUnichar * strings (100 chars max) |
+ | # Also allows an optional argument for how many chars to print as long as | ||
+ | # it's less than 100. | ||
+ | def pu | ||
+ | set $uni = $arg0 | ||
+ | if $argc == 2 | ||
+ | set $limit = $arg1 | ||
+ | if $limit > 100 | ||
+ | set $limit = 100 | ||
+ | end | ||
+ | else | ||
+ | set $limit = 100 | ||
+ | end | ||
+ | # scratch array with space for 100 chars plus null terminator. Make | ||
+ | # sure to not use ' ' as the char so this copy/pastes well. | ||
+ | set $scratch = "____________________________________________________________________________________________________" | ||
+ | set $i = 0 | ||
+ | set $scratch_idx = 0 | ||
+ | while (*$uni && $i++ < $limit) | ||
+ | if (*$uni < 0x80) | ||
+ | set $scratch[$scratch_idx++] = *(char*)$uni++ | ||
+ | else | ||
+ | if ($scratch_idx > 0) | ||
+ | set $scratch[$scratch_idx] = '\0' | ||
+ | print $scratch | ||
+ | set $scratch_idx = 0 | ||
+ | end | ||
+ | print /x *(short*)$uni++ | ||
+ | end | ||
+ | end | ||
+ | if ($scratch_idx > 0) | ||
+ | set $scratch[$scratch_idx] = '\0' | ||
+ | print $scratch | ||
+ | end | ||
+ | end | ||
− | == | + | == Dumping the JS Stack == |
− | + | def js | |
+ | call DumpJSStack() | ||
+ | end |
Latest revision as of 20:11, 15 March 2019
Contents
.gdbinit
GDB pretty printers
Printing arrays
define ptarray if $argc == 0 help ptarray else set $size = $arg0.mHdr->mLength set $capacity = $arg0.mHdr->mCapacity set $size_max = $size - 1 set $elts = $arg0.Elements() end if $argc == 1 set $i = 0 while $i < $size printf "elem[%u]: ", $i p *($elts + $i) set $i++ end end if $argc == 2 set $idx = $arg1 if $idx < 0 || $idx > $size_max printf "idx1, idx2 are not in acceptable range: [0..%u].\n", $size_max else printf "elem[%u]: ", $idx p *($elts + $idx) end end if $argc == 3 set $start_idx = $arg1 set $stop_idx = $arg2 if $start_idx > $stop_idx set $tmp_idx = $start_idx set $start_idx = $stop_idx set $stop_idx = $tmp_idx end if $start_idx < 0 || $stop_idx < 0 || $start_idx > $size_max || $stop_idx > $size_max printf "idx1, idx2 are not in acceptable range: [0..%u].\n", $size_max else set $i = $start_idx while $i <= $stop_idx printf "elem[%u]: ", $i p *($elts + $i) set $i++ end end end if $argc > 0 printf "nsTArray length = %u\n", $size printf "nsTArray capacity = %u\n", $capacity printf "Element " whatis *$elts end end
Chris Jones' handy ptarray command
Frame Tree Dump
<bz> for a frame dump, you can use the layout debugger, or... if you're in a debugger and want to examine the tree, you can do
def frametree call nsFrame::DumpFrameTree($arg0) end
<bz> That should work when called on any nsIFrame to dump the tree it belongs to
Printing nsIAtoms
def pa set $atom = $arg0 if (sizeof(*((&*$atom)->mString)) == 2) pu (&*$atom)->mString end end
Reflow Logs
See [Debugging Frame Reflow]
Printing strings
# Define a "ps" command to display subclasses of nsAC?String. Note that # this assumes strings as of Gecko 1.9 (well, and probably a few # releases before that as well); going back far enough will get you # to string classes that this function doesn't work for. def ps set $str = $arg0 if (sizeof(*$str.mData) == 1 && ($str.mFlags & 1) != 0) print $str.mData else pu $str.mData $str.mLength end end
# Define a "pu" command to display PRUnichar * strings (100 chars max) # Also allows an optional argument for how many chars to print as long as # it's less than 100. def pu set $uni = $arg0 if $argc == 2 set $limit = $arg1 if $limit > 100 set $limit = 100 end else set $limit = 100 end # scratch array with space for 100 chars plus null terminator. Make # sure to not use ' ' as the char so this copy/pastes well. set $scratch = "____________________________________________________________________________________________________" set $i = 0 set $scratch_idx = 0 while (*$uni && $i++ < $limit) if (*$uni < 0x80) set $scratch[$scratch_idx++] = *(char*)$uni++ else if ($scratch_idx > 0)
set $scratch[$scratch_idx] = '\0' print $scratch set $scratch_idx = 0
end print /x *(short*)$uni++ end end if ($scratch_idx > 0) set $scratch[$scratch_idx] = '\0' print $scratch end end
Dumping the JS Stack
def js call DumpJSStack() end