summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xlldb/www/projects.html379
-rw-r--r--lldb/www/sidebar.incl1
2 files changed, 380 insertions, 0 deletions
diff --git a/lldb/www/projects.html b/lldb/www/projects.html
new file mode 100755
index 00000000000..8551dac80ea
--- /dev/null
+++ b/lldb/www/projects.html
@@ -0,0 +1,379 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+<link href="style.css" rel="stylesheet" type="text/css" />
+<title>LLDB Projects</title>
+</head>
+
+<body>
+ <div class="www_title">
+ Project ideas for the <strong>LLDB</strong> Debugger
+ </div>
+
+<div id="container">
+ <div id="content">
+ <!--#include virtual="sidebar.incl"-->
+ <div id="middle">
+ <div class="post">
+ <h1 class ="postheader">Goals</h1>
+ <div class="postcontent">
+
+ <p>The following is a mostly unordered set of the ideas for improvements
+ to the LLDB debugger. Some are fairly deep, some would require less
+ effort.
+ </p>
+
+ <ol>
+ <li>
+ Speed up type realization in lldb.  
+ <p>
+ The type of problem I'm addressing here is the situation where you are
+ debugging a large program (lldb built with debug clang/swift will do)
+ and you go to print a simple expression, and lldb goes away for 30 seconds.
+ When you sample it, it is always busily churning through all the CU's in the
+ world looking for something.  The problem isn't that looking for something in
+ particular is slow, but rather that we somehow turned an bounded search
+ (maybe a subtype of "std::string" into an unbounded search (all things with the
+ name of that subtype.)  Or didn't stop when we got a reasonable answer
+ proximate to the context of the search, but let the search leak out globally.
+ And quite likely there are other issues that I haven't guessed yet.
+ But if you end up churning though 3 or 4 Gig of debug info, that's going to be slow
+ no matter how well written your debug reader is...
+ </p>
+ <p>
+ My guess is the work will be more in the general symbol lookup than in the DWARF
+ parser in particular, but it may be a combination of both.
+ </p>
+ <p>
+ As a user debugging a largish program, this is the most obvious lameness of lldb.
+ </p>
+ </li>
+
+ <li>
+ Symbol name completion in the expression parser.
+ <p>
+ This is the other obvious lameness of lldb.  You can do:
+ </p>
+<code><pre><tt>
+(lldb) frame var foo.b<TAB>
+</tt></pre></code>
+ <p>
+ and we will tell you it is "foo.bar". But you can't do that in the expression parser.
+ This will require collaboration with the clang/swift folks to get the right extension
+ points in the compiler. And whatever they are, lldb will need use them to tell the
+ compiler about what names are available. It will be important to avoid the pitfalls
+ of #1 where we wander into the entire DWARF world.
+ </p>
+
+ </li>
+ <li>
+ Make a high speed asynchronous communication channel to replace the gdb-remote protocol.
+ <p>
+ All lldb debugging nowadays is done by talking to a debug agent. We used the
+ gdb-remote protocol because that is universal, and good enough, and you have
+ to support it anyway since so many little devices & JTAG's and VM's etc
+ support it. But it is really old, not terribly high performance, and
+ can't really handle sending or receiving messages while the process is
+ supposedly running. It should have compression built in, remove the hand-built
+ checksums and rely on the robust communication protocols we always have nowadays,
+ allow for out-of-order requests/replies, allow for reconnecting to a temporarily
+ disconnected debug session, regularize all of the packet formatting into JSON or
+ BSON or whatever while including a way to do large binary transfers. It must be
+ possible to come up with something faster, and better tunable for the many
+ communications pathways we end up supporting.
+ </p>
+ </li>
+
+ <li>
+ Fix the event handling/process control machinery to support calling SB & Commands
+ everywhere, and to support non-stop debugging
+ <p>
+ There is a fairly ad-hoc system to handle when it is safe to run SB API's and
+ command line commands. This is actually a bit of a tricky problem, since we
+ allow access to the command line and SB API from some funky places in lldb.
+ The Operating System plugins are the most obvious instance, since they get
+ run right after lldb is told by debugserver that the process has stopped, but
+ before it has finished collating the information from the stop for presentation
+ to the higher levels. But breakpoint callbacks have some of the same problems,
+ and other things like the scripted stepping operations and any fancier extension
+ points we want to add to the debugger are going to be hard to implement robustly
+ till we work on a finer-grained and more explicit control over who gets to control
+ the process state.
+ <p>
+ We also won't have any chance of supporting non-stop debugging - which is a useful
+ mode for programs that have a lot of high-priority or real-time worker threads -
+ until we get this sorted out.
+ </p>
+ </li>
+
+ <li>
+ Finish the language abstraction and remove all the unnecessary C++/clang-based API's
+ <p>
+ An important part of making lldb a more useful "debugger toolkit" as opposed to a
+ C/C++/ObjC/Swift debugger is to have a clean abstraction for language support.
+ We did most, but not all, of the physical separation.  We need to finish that.
+ And then by force of necessity the API's really look like the interface to a C++
+ type system with a few swift bits added on.  How you would go about adding a new
+ language is unclear and much more trouble than it is worth at present. But if
+ we made this nice, we could add a lot of value to other language projects.
+ </p>
+ </li>
+
+ <li>
+ Add some syntax to generate data formatters from type definitions
+ <p>
+ Uses of the data formatters fall into two types. There are data formatters for
+ types where the structure elements pretty much tell you how to present the data,
+ you just need a little expression language to express how to turn them into what
+ the user expects to see. Then there are the ones (like pretty much all our
+ Foundation/AppKit/UIKit formatters) that use deep magic to figure out how the type
+ is actually laid out. The latter are pretty much always going to have to be done by hand.
+ </p>
+ <p>
+ But for the ones where the information is expressed in the fields, it would be great
+ to have a way to express the instructions to produce summaries and children in some
+ form you could embed next to the types and have the compiler produce a byte code
+ form of the instructions and then make that available to lldb along with the library.
+ This isn't as simple as having clang run over the headers and produce something from the
+ types directly. After all, clang has no way of knowing that the interesting thing about
+ a std::vector is the elements that you get by calling size (for the summary) and [] for
+ the elements. But it shouldn't be hard to come up with a generic markup to express this.
+ </p>
+ </li>
+
+ <li>
+ Allow the expression parser to access dynamic type/data formatter information
+ <p>
+ This seems like a smaller one. The symptom is your object is Foo child of Bar, and in
+ the Locals view you see all the fields of Foo, but because the static type of the object
+ is Bar, you can't see any of the fields of Foo. But if you could get this working,
+ you could hijack the mechanism to make the results of the value object summaries/synthetic
+ children available to expressions. And if you can do that, you could add other properties
+ to an object externally (through Python or some other extension point) and then have
+ these also available in the expression parser. You could use this to express invariants
+ for data structures, or other more advanced uses of types in the debugger.
+ </p>
+ <p>
+ Another version of this is to allow access to synthetic children in the expression
+ parser. Otherwise you end up in situations like:
+ </p>
+<code><pre><tt>
+(lldb) print return_a_foo()
+(SomeVectorLikeType) $1 = {
+ [0] = 0
+ [1] = 1
+ [2] = 2
+ [3] = 3
+ [4] = 4
+}
+</tt></pre></code>
+
+ <p>
+ That's good but:
+ </p>
+<code><pre><tt>
+(lldb) print return_a_foo()[2]
+</tt></pre></code>
+ <p>
+ fails because the expression parser doesn't know anything about the array-like nature of
+ SomeVectorLikeType that it gets from the synthetic children.
+ </p>
+ </li>
+
+ <li>
+ Add an extension point in the breakpoint search machinery.
+ <p>
+ This would allow highly customizable, algorithmic breakpoint types, like "break on every
+ use of some particular instruction, or instruction pattern, etc."
+ </p>
+ </li>
+
+ <li>
+ Documentation and better examples
+
+ <p>
+ We need to put the lldb syntax docs in the tutorial somewhere that is more easily accessible.
+ On suggestion is to add non-command based help to the help system, and then have a "help lldb"
+ or "help syntax" type command with this info. Be nice if the non-command based help could
+ be hierarchical so you could make topics.
+ </p>
+
+ <p>
+ There's a fair bit of docs about the SB API's, but it is spotty. Some classes are
+ well documented in the Python "help (lldb.SBWhatever)" and some are not.
+ </p>
+
+
+ <p>
+ We need more conceptual docs. And we need more examples. And we could provide a
+ clean pluggable example for using LLDB standalone from Python. The process_events.py
+ is a start of this, but it just handles process events, and it is really a quick sketch
+ not a polished expandable proto-tool.
+ </p>
+
+ </li>
+
+ <li>
+ Make a more accessible plugin architecture for lldb.
+
+ <p>
+ Right now, you can only use the Python or SB API's to extend an extant lldb. You can't
+ implement any of the actual lldb Plugins as plugins. That means anybody that wants to
+ add new Object file/Process/Language etc support has to build and distribute their own
+ lldb. This is tricky because the API's the plugins use are currently not stable (and
+ recently have been changing quite a lot.) We would have to define a subset of lldb_private
+ that you could use, and some way of telling whether the plugins were compatible with
+ the lldb. But long-term, making this sort of extension possible will make lldb more
+ appealing for research and 3rd party uses.
+ </p>
+ </li>
+
+ <li>
+ Use instruction emulation to avoid the overhead of swapping trap and instruction for breakpoints
+
+ <p>
+ At present, breakpoints are implemented by inserting a trap instruction, then when the trap
+ is hit, replace the trap with the actual instruction and single step. Then swap back and
+ continue. This causes problems for read only text, and also means that no-stop debugging
+ ust either stop all threads briefly to handle this two-step or risk missing some
+ breakpoint hits. If you emulated the instruction and wrote back the results, you wouldn't
+ have these problems, and it would also save a stop per breakpoint hit. Since we use breakpoints
+ to implement stepping, this savings could be significant on slow connections.
+ </p>
+ </li>
+ <li>
+ Use the JIT to speed up conditional breakpoint evaluation
+
+ <p>
+ We already JIT and cache the conditional expressions for breakpoints for the C family of
+ languages, so we aren't re-compiling every time you hit the breakpoint. And if we couldn't
+ IR interpret the expression, we leave the JIT'ed code in place for reuse. But it would
+ be even better if we could also insert the "stop or not" decision into the code at the
+ breakpoint, so you would only actually stop the process when the condition was true.
+ Greg's idea was that if you had a conditional breakpoint set when you started the
+ debug session, Xcode could rebuild and insert enough no-ops that we could instrument
+ the breakpoint site and call the conditional expression, and only trap if the conditional was true.
+ </p>
+ </li>
+
+ <li>
+ Broaden the idea in "target stop-hook" to cover more events in the debugger
+
+ <p>
+ Shared library loads, command execution, User directed memory/register reads and writes
+ are all places where you would reasonably want to hook into the debugger.
+ </p>
+ </li>
+
+ <li>
+ Mock classes for testing
+ <p>
+ We need "ProcessMock" and "ObjectFileMock" and the like. These would be real
+ plugin implementations for their underlying lldb classes, with the addition
+ that you can prime them from some sort of text based input files. For classes
+ that manage changes over time (like process) you would need to program the state
+ at StopPoint 0, StopPoint 1, etc. These could then be used for testing reactions
+ to complex threading
+ problems & the like, and also for simulating hard-to-test environments (like bare
+ board debugging).
+ </p>
+ </li>
+
+ <li>
+ A Bug-Trapper infrastructure
+ <p>
+ We very often have bugs that can't be reproduced locally. So having a bug-report-trapper
+ that can gather enough information from the
+ surroundings of a bug so that we can replay the session locally would be a big help
+ tracking down issues in this situation. This is tricky because you
+ can't necessarily require folks to leak information about their code in order to
+ file bug reports. So not only will you have to figure out what state to gather,
+ you're also going to have to anonymize it somehow. But we very often have bugs
+ from people that can't reduce the problem to a simple test case and can't give us
+ our code, and we often just can't help them as things stand now. Note that adding
+ the ProcessMock would be a good first stage towards this, since you could make a ProcessMock
+ creator/serializer from the current lldb state.
+ </p>
+ </li>
+
+ <li>
+ Expression parser needs syntax for "{symbol,type} A in CU B.cpp" etc.
+
+ <p>
+ Sometimes you need to specify non-visible or ambiguous types to the expression parser.
+ We were planning to do $b_dot_cpp$A or something like. You might want to specify a
+ static in a function, in a source file, or in a shared library. So the syntax should
+ support all these.
+ </p>
+ </li>
+
+ <li>
+ Add a "testButDontAbort" style test to the UnitTest framework.
+
+ <p>
+ The way we use unittest now (maybe this is the only way it can work, I don't know)
+ you can't report a real failure and continue with the test. That is appropriate
+ in some cases: if I'm supposed to hit breakpoint A before I evaluate an expression,
+ and don't hit breakpoint A, the test should fail. But it means that if I want to
+ test five different expressions, I can either do it in one test, which is good
+ because it means I only have to fire up one process, attach to it, and get it to
+ a certain point. But it also means if the first test fails, the other four don't
+ even get run. So though at first we wrote a bunch of test like this, as time went
+ on we switched more to writing "one at a time" tests because they were more robust
+ against a single failure. That makes the test suite run much more slowly. It
+ would be great to add a "test_but_dont_abort" variant of the tests, then we could
+ gang tests that all drive to the same place and do similar things. As an added
+ benefit, it would allow us to be more thorough in writing tests, since each
+ test would have lower costs.
+ </p>
+ </li>
+
+ <li>
+ Unify Watchpoint's & Breakpoints.
+ <p>
+ Option handling isn't shared, and more importantly the PerformAction's have a lot
+ of duplicated common code, most of which works less well on the Watchpoint side.
+ </p>
+ </li>
+
+ <li>
+ Reverse debugging.
+ <p>
+ This is kind of a holy grail, it's hard to support for complex apps (many
+ threads, shared memory, etc.) But it would be SO nice to have...
+ </p>
+ </li>
+
+ <li>
+ Non-stop debugging.
+
+ <p>
+ By this I mean allowing some threads in the target program to run while stopping
+ other threads. This is supported in name in lldb at present, but lldb makes the
+ assumption "If I get a stop, I won't get another stop unless I actually run the
+ program." in a bunch of places so getting it to work reliably will be some a
+ good bit of work. And figuring out how to present this in the UI will also be tricky.
+ </p>
+ </li>
+
+ <li>
+ Fix and continue.
+ <p>
+ We did this in gdb without a real JIT. The implementation shouldn't be that hard,
+ especially if you can build the executable for fix and continue. The tricky part is
+ how to verify that the user can only do the kinds of fixes that are safe to do.
+ No changing object sizes is easy to detect, but there were many more subtle changes
+ (function you are fixing is on the stack...) that take more work to prevent.
+ And then you have to explain these conditions the user in some helpful way.
+ </p>
+ </li>
+ </ol>
+ </div>
+ <div class="postfooter"></div>
+ </div>
+ </div>
+ </div>
+</div>
+</body>
+</html>
diff --git a/lldb/www/sidebar.incl b/lldb/www/sidebar.incl
index 17beaaddfec..184a022790e 100644
--- a/lldb/www/sidebar.incl
+++ b/lldb/www/sidebar.incl
@@ -8,6 +8,7 @@
<li><a href="/goals.html">Goals</a></li>
<li><a href="/features.html">Features</a></li>
<li><a href="/status.html">Status</a></li>
+ <li><a href="/projects.html">Projects</a></li>
</ul>
</div>
<div class="menu">
OpenPOWER on IntegriCloud