Bug 959016 - Add lldb Python command handlers for debugging Gecko, starting with frametree and frametreelimited. (DONTBUILD) r=ehsan
--- a/.lldbinit
+++ b/.lldbinit
@@ -4,8 +4,13 @@
# single compiled file breaks lldb breakpoint setting. This works around that.
# See http://lldb.llvm.org/troubleshooting.html for more info.
settings set target.inline-breakpoint-strategy always
# Show the dynamic type of an object when using "expr". This, for example,
# will show a variable declared as "nsIFrame *" that points to an nsBlockFrame
# object as being of type "nsBlockFrame *" rather than "nsIFrame *".
settings set target.prefer-dynamic-value run-target
+
+# Import the module that defines complex Gecko debugging commands. Rather
+# than do any kind of searching, this assumes that you are running lldb from
+# the top level source directory.
+script sys.path.append('python/lldbutils'); import lldbutils; lldbutils.init()
--- a/layout/generic/nsFrame.cpp
+++ b/layout/generic/nsFrame.cpp
@@ -5370,16 +5370,22 @@ nsFrame::MakeFrameName(const nsAString&
void
nsIFrame::DumpFrameTree()
{
RootFrameList(PresContext(), stdout, 0);
}
void
+nsIFrame::DumpFrameTreeLimited()
+{
+ List(stdout, 0);
+}
+
+void
nsIFrame::RootFrameList(nsPresContext* aPresContext, FILE* out, int32_t aIndent)
{
if (!aPresContext || !out)
return;
nsIPresShell *shell = aPresContext->GetPresShell();
if (shell) {
nsIFrame* frame = shell->FrameManager()->GetRootFrame();
--- a/layout/generic/nsIFrame.h
+++ b/layout/generic/nsIFrame.h
@@ -3256,16 +3256,17 @@ public:
virtual void List(FILE* out, int32_t aIndent, uint32_t aFlags = 0) const;
/**
* lists the frames beginning from the root frame
* - calls root frame's List(...)
*/
static void RootFrameList(nsPresContext* aPresContext,
FILE* out, int32_t aIndent);
virtual void DumpFrameTree();
+ void DumpFrameTreeLimited();
NS_IMETHOD GetFrameName(nsAString& aResult) const = 0;
#endif
#ifdef DEBUG
public:
NS_IMETHOD_(nsFrameState) GetDebugStateBits() const = 0;
NS_IMETHOD DumpRegressionData(nsPresContext* aPresContext,
new file mode 100644
--- /dev/null
+++ b/python/lldbutils/README.txt
@@ -0,0 +1,12 @@
+lldb debugging functionality for Gecko
+--------------------------------------
+
+This directory contains a module, lldbutils, which is imported by the
+in-tree .lldbinit file. The lldbutil modules define some lldb commands
+that are handy for debugging Gecko.
+
+If you want to add a new command or Python-implemented type summary, either add
+it to one of the existing broad area Python files (such as lldbutils/layout.py
+for layout-related commands) or create a new file if none of the existing files
+is appropriate. If you add a new file, make sure you add it to __all__ in
+lldbutils/__init__.py.
new file mode 100644
--- /dev/null
+++ b/python/lldbutils/lldbutils/__init__.py
@@ -0,0 +1,7 @@
+import lldb
+
+__all__ = ['layout']
+
+def init():
+ for name in __all__:
+ __import__('lldbutils.' + name, globals(), locals(), ['init']).init(lldb.debugger)
new file mode 100644
--- /dev/null
+++ b/python/lldbutils/lldbutils/layout.py
@@ -0,0 +1,15 @@
+import lldb
+
+def frametree(debugger, command, result, dict):
+ """Dumps the frame tree containing the given nsIFrame*."""
+ debugger.HandleCommand('expr (' + command + ')->DumpFrameTree()')
+
+def frametreelimited(debugger, command, result, dict):
+ """Dumps the subtree of a frame tree rooted at the given nsIFrame*."""
+ debugger.HandleCommand('expr (' + command + ')->DumpFrameTreeLimited()')
+
+def init(debugger):
+ debugger.HandleCommand('command script add -f lldbutils.layout.frametree frametree')
+ debugger.HandleCommand('command script add -f lldbutils.layout.frametree frametreelimited')
+ debugger.HandleCommand('command alias ft frametree')
+ debugger.HandleCommand('command alias ftl frametree')