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 93188 5aa794f7d5cd76623ecfa34fc25a2a2bc31e189a
parent 93042 cc91f155491b6cf8f83713bbe414e9a023027182
child 93189 e1a40027dc7e1180ae466215ee8e91c0053d1546
push id9028
push usereakhgari@mozilla.com
push dateFri, 04 May 2012 20:29:50 +0000
treeherdermozilla-inbound@41dc6249bd08 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjimb
bugs184013
milestone15.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
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