Very nice, thank you! <div>Let us try to use it. </div><div><br></div><div>--kcc <br><br><div class="gmail_quote">On Wed, Nov 30, 2011 at 7:48 PM, Greg Clayton <span dir="ltr"><<a href="mailto:gclayton@apple.com">gclayton@apple.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div class="im"><br>
On Nov 30, 2011, at 5:42 PM, Kostya Serebryany wrote:<br>
<br>
><br>
> 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.<br>
><br>
> You could compile the main.cpp into "loopup" and run the result:<br>
><br>
> lookup /home/kcc/llvm/build/a.out 0x402661<br>
><br>
> And it should do the lookup you want.<br>
><br>
> Yes, this is what we already get from addr2line.<br>
> Can this be used inside the process?<br>
<br>
</div>Yes.<br>
<div class="im"><br>
> And can it translate real address to the offset in the library (currently, we use code from google perf tools to achieve that).<br>
<br>
</div>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.<br>

<br>
You first need to create a target:<br>
<br>
// Init LLDB<br>
SBDebugger::Initialize();<br>
<br>
// Create a debugger so we can make a target in it<br>
SBDebugger debugger (SBDebugger::Create());<br>
<br>
// Create a target and don't let it add all dependent shared libraries, we will add those manually<br>
const bool add_dependent_files = false;<br>
const char *triple = "i386-apple-darwin";<br>
SBError error;<br>
SBTarget target(debugger.CreateTarget ("/tmp/a.out", triple, NULL, add_dependent_files, error));<br>
<br>
// Now add all of the shared libraries you want by repeating this loop<br>
for (...)<br>
{<br>
        SBModule module = target.AddModule ("/tmp/libfoo.so", triple, NULL);<br>
        target.SetSectionLoadAddress (module.FindSection ("__TEXT"), 0x1000);<br>
        target.SetSectionLoadAddress (module.FindSection ("__DATA"), 0x2000);<br>
}<br>
<br>
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:<br>
<br>
lldb::addr_t load_addr = ...; // The address to lookup<br>
<br>
// Resolve a load address into a section + offset addresss within a module<br>
SBAddress addr (target.ResolveLoadAddress (load_addr));<br>
if (addr.IsValid())<br>
{<br>
    // Resolve the address into all of the symbol information<br>
    SBSymbolContext symbol_ctx (addr.GetSymbolContext(eSymbolContextEverything));<br>
<br>
    // symbol_ctx now contains the symbol context (module, compile unit, function,<br>
    // block, line table entry and symbol for the address). Now you should dump the<br>
    // information that you want out of the symbol context....<br>
    DumpSymbolContext (symbol_ctx, addr);<br>
<br>
    // This might represent a an inline function within a concrete function, so you<br>
    // can also dump all of the parent functions above the current inline function.<br>
    // An invalid symbol context will be returned when there are no more<br>
    while (1)<br>
    {<br>
        SBAddress parent_addr; // The address in the parent function for the inline function<br>
        SBSymbolContext parent_symbol_ctx = symbol_ctx.GetParentOfInlinedScope (addr, parent_addr);<br>
        if (!parent_symbol_ctx.IsValid())<br>
            break;<br>
        DumpSymbolContext (parent_symbol_ctx, parent_addr);<br>
        addr = parent_addr;<br>
        symbol_ctx = parent_symbol_ctx;<br>
    }<br>
}<br>
<br>
<br>
So we can do a very good job at symbolicating inlined functions within concrete functions, all from just a single address.<br>
<div class="im"><br>
> Will this work on both linux and mac?<br>
<br>
</div>Yep.<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
><br>
> Thanks,<br>
><br>
> --kcc<br>
><br>
><br>
> Let me know if you have any questions about how and what the example code in main.cpp is doing.<br>
><br>
<br>
</div></div></blockquote></div><br></div>