Bug 184013 - Add a .gdbinit containing useful debugging macros to the tree so that it is found automagically; r=jimb
authorEhsan Akhgari <ehsan@mozilla.com>
Thu, 03 May 2012 20:06:14 -0400
changeset 92921 5aa794f7d5cd76623ecfa34fc25a2a2bc31e189a
parent 92920 cc91f155491b6cf8f83713bbe414e9a023027182
child 93026 e1a40027dc7e1180ae466215ee8e91c0053d1546
push id730
push usertim.taubert@gmx.de
push dateFri, 04 May 2012 14:23:10 +0000
treeherderfx-team@b6e6a24c9e95 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjimb
bugs184013
milestone15.0a1
Bug 184013 - Add a .gdbinit containing useful debugging macros to the tree so that it is found automagically; r=jimb DONTBUILD
.gdbinit
Makefile.in
new file mode 100644
--- /dev/null
+++ b/.gdbinit
@@ -0,0 +1,175 @@
+# .gdbinit file for debugging Mozilla
+
+# Don't stop for the SIG32/33/etc signals that Flash produces
+handle SIG32 noprint nostop pass
+handle SIG33 noprint nostop pass
+handle SIGPIPE noprint nostop pass
+
+# Show the concrete types behind nsIFoo
+set print object on
+
+# run when using the auto-solib-add trick
+def prun
+        tbreak main
+        run
+	set auto-solib-add 0
+        cont
+end
+
+# run -mail, when using the auto-solib-add trick
+def pmail
+        tbreak main
+        run -mail
+	set auto-solib-add 0
+        cont
+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
+
+# 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 "pa" command to display the string value for an nsIAtom
+def pa
+  set $atom = $arg0
+  if (sizeof(*((&*$atom)->mString)) == 2)
+    pu (&*$atom)->mString
+  end
+end
+
+# define a "pxul" command to display the type of a XUL element from
+# an nsXULDocument* pointer.
+def pxul
+  set $p = $arg0
+  print $p->mNodeInfo.mRawPtr->mInner.mName->mStaticAtom->mString
+end
+
+# define a "prefcnt" command to display the refcount of an XPCOM obj
+def prefcnt
+  set $p = $arg0
+  print ((nsPurpleBufferEntry*)$p->mRefCnt.mTagged)->mRefCnt
+end
+
+# define a "ptag" command to display the tag name of a content node
+def ptag
+  set $p = $arg0
+  pa $p->mNodeInfo.mRawPtr->mInner.mName
+end
+
+##
+## nsTArray
+##
+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
+
+document ptarray
+        Prints nsTArray information.
+        Syntax: ptarray   
+        Note: idx, idx1 and idx2 must be in acceptable range [0...size()-1].
+        Examples:
+        ptarray a - Prints tarray content, size, capacity and T typedef
+        ptarray a 0 - Prints element[idx] from tarray
+        ptarray a 1 2 - Prints elements in range [idx1..idx2] from tarray
+end
+
+def js
+  call DumpJSStack()
+end
+
+def ft
+  call nsFrame::DumpFrameTree($arg0)
+end
--- a/Makefile.in
+++ b/Makefile.in
@@ -232,16 +232,20 @@ else
 maybe_clobber_profiledbuild:
 endif
 else
 maybe_clobber_profiledbuild:
 	$(RM) $(DIST)/bin/*.pgc
 	find $(DIST)/$(MOZ_APP_NAME) -name "*.pgc" -exec mv {} $(DIST)/bin \;
 endif
 
+# put in our default gdbinit so that the gdb debugging experience is happier.
+libs:: .gdbinit
+	$(INSTALL) $< $(DIST)/bin
+
 .PHONY: maybe_clobber_profiledbuild
 
 # Look for R_386_PC32 relocations in shared libs, these
 # break x86_64 builds and SELinux users.
 ifeq ($(OS_TARGET)_$(TARGET_XPCOM_ABI),Linux_x86-gcc3)
 scheck::
 	@relcount=`find $(DIST)/bin -name "*.so" | xargs objdump -R | grep R_386_PC32 | wc -l` && if test $$relcount -gt 0; then echo "FAILED: R_386_PC32 relocations detected in a shared library.  Did you use a system header without adding it to config/system-headers?"; exit 1; else echo "PASSED"; fi
 endif