[lldb-dev] sharing code between lldb and AddressSanitizer

Kostya Serebryany kcc at google.com
Wed Nov 30 20:47:11 PST 2011


Very nice, thank you!
Let us try to use it.

--kcc

On Wed, Nov 30, 2011 at 7:48 PM, Greg Clayton <gclayton at apple.com> wrote:

>
> On Nov 30, 2011, at 5:42 PM, Kostya Serebryany wrote:
>
> >
> > So if 0x402661 is an address that is already in terms of the virtual
> addresses in the a.out file itself, you can use example code from main.cpp
> mentioned below.
> >
> > You could compile the main.cpp into "loopup" and run the result:
> >
> > lookup /home/kcc/llvm/build/a.out 0x402661
> >
> > And it should do the lookup you want.
> >
> > Yes, this is what we already get from addr2line.
> > Can this be used inside the process?
>
> Yes.
>
> > And can it translate real address to the offset in the library
> (currently, we use code from google perf tools to achieve that).
>
> LLDB can't currently observer a process, it must debug it, but you can
> tell the target where each section of a shared library is loaded (a.out has
> ".text" is at 0x1000, a.out has ".data" at 0x2000). Then you can lookup
> using "Load" addresses.
>
> You first need to create a target:
>
> // Init LLDB
> SBDebugger::Initialize();
>
> // Create a debugger so we can make a target in it
> SBDebugger debugger (SBDebugger::Create());
>
> // Create a target and don't let it add all dependent shared libraries, we
> will add those manually
> const bool add_dependent_files = false;
> const char *triple = "i386-apple-darwin";
> SBError error;
> SBTarget target(debugger.CreateTarget ("/tmp/a.out", triple, NULL,
> add_dependent_files, error));
>
> // Now add all of the shared libraries you want by repeating this loop
> for (...)
> {
>        SBModule module = target.AddModule ("/tmp/libfoo.so", triple, NULL);
>        target.SetSectionLoadAddress (module.FindSection ("__TEXT"),
> 0x1000);
>        target.SetSectionLoadAddress (module.FindSection ("__DATA"),
> 0x2000);
> }
>
> Now you have a target that has all of the sections for all of your modules
> loaded at the addresses at which you want to do the lookups. To do a lookup
> you can now:
>
> lldb::addr_t load_addr = ...; // The address to lookup
>
> // Resolve a load address into a section + offset addresss within a module
> SBAddress addr (target.ResolveLoadAddress (load_addr));
> if (addr.IsValid())
> {
>    // Resolve the address into all of the symbol information
>    SBSymbolContext symbol_ctx
> (addr.GetSymbolContext(eSymbolContextEverything));
>
>    // symbol_ctx now contains the symbol context (module, compile unit,
> function,
>    // block, line table entry and symbol for the address). Now you should
> dump the
>    // information that you want out of the symbol context....
>    DumpSymbolContext (symbol_ctx, addr);
>
>    // This might represent a an inline function within a concrete
> function, so you
>    // can also dump all of the parent functions above the current inline
> function.
>    // An invalid symbol context will be returned when there are no more
>    while (1)
>    {
>        SBAddress parent_addr; // The address in the parent function for
> the inline function
>        SBSymbolContext parent_symbol_ctx =
> symbol_ctx.GetParentOfInlinedScope (addr, parent_addr);
>        if (!parent_symbol_ctx.IsValid())
>            break;
>        DumpSymbolContext (parent_symbol_ctx, parent_addr);
>        addr = parent_addr;
>        symbol_ctx = parent_symbol_ctx;
>    }
> }
>
>
> So we can do a very good job at symbolicating inlined functions within
> concrete functions, all from just a single address.
>
> > Will this work on both linux and mac?
>
> Yep.
>
>
> >
> > Thanks,
> >
> > --kcc
> >
> >
> > Let me know if you have any questions about how and what the example
> code in main.cpp is doing.
> >
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-dev/attachments/20111130/5ea15a7e/attachment.html>


More information about the lldb-dev mailing list