<div dir="ltr">Thanks for your answer, I understand all the steps except for how to determine slide address or load address. The docs in <a href="http://lldb.llvm.org/symbolication.html">http://lldb.llvm.org/symbolication.html</a> weren't very helpful for determining that (eg --slide 0x123000 : not sure where to determine that).<div>
<br></div><div><br><div><br><div><div><br></div></div></div></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Sep 24, 2013 at 10:10 AM, Greg Clayton <span dir="ltr"><<a href="mailto:gclayton@apple.com" target="_blank">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">In order to symbolicate here are the steps:<br>
<br>
1 - Create debugger<br>
2 - Create target with the following call:<br>
<br>
lldb::SBTarget<br>
SBDebugger::CreateTarget (const char *filename,<br>
                          const char *target_triple,<br>
                          const char *platform_name,<br>
                          bool add_dependent_modules,<br>
                          lldb::SBError& sb_error)<br>
<br>
You can specify NULL for platform if it is the local host platform, else specify a valid platform name ("remote-linux", "remote-macosx", etc).<br>
<br>
Specify "false" for "add_dependent_modules. This will make a target that _only_ loads the files you add to it.<br>
<br>
3 - Load an additional modules (shared libraries) you need to do your symbolication with:<br>
<br>
lldb::SBModule<br>
SBTarget::AddModule (const char *path,<br>
                     const char *triple,<br>
                     const char *uuid_cstr,<br>
                     const char *symfile)<br>
<br>
Lets say you have "/tmp/a.so" which doesn't contain debug symbols, but "/tmp/debug/a.so" does and is a separate stand alone debug info file, you would specify "/tmp/a.so" for "path" and "/tmp/debug/a.so" for "symfile". Specify NULL for "uuid_cstr" unless you have a crash log that has the UUID information for each module in it. Use the same "triple" as you did for the target create.<br>

<br>
4 - Specify the load locations for the sections you care about for each module<br>
<br>
First find the module:<br>
<br>
SBFileSpec module_path("/tmp/a.so");<br>
SBModule module = target.FindModule(module_path);<br>
if (module.IsValid())<br>
{<br>
<br>
Now you need to decide if you want to rigidly slide your executables, or set the load address of sections individually. If you know the slide of your library and all sections should be slid by a fixed amount, figure out the slide and slide it:<br>

<br>
    int64_t slide = ...<br>
    target.SetModuleLoadAddress (module, slide);<br>
<br>
Or, you can lookup the sections and set the load addresses individually:<br>
<br>
    lldb::addr_t text_load_address = ...;<br>
    SBSection section = module.FindSection(".text")<br>
    target.SetSectionLoadAddress(section, text_load_address);<br>
<br>
When setting the load address of sections, you don't need to compute a slide, you just need to set the actual address itself for the base of the section.<br>
<br>
Repeat this for all modules so they all have load locations and now you are ready to do lookups:<br>
<br>
    lldb::addr_t lookup_addr = ...;<br>
<br>
    lldb::SBAddress addr = target.ResolveLoadAddress (lookup_addr);<br>
    if (addr.GetSection())<br>
    {<br>
        // If we have a valid section, then we can symbolicate<br>
        SBSymbolContext sc = target.ResolveSymbolContextForAddress (addr, lldb::eSymbolContextEverything);<br>
<br>
Now you have a symbol context "sc" which has everything filled in. The symbol context has accessors for everything you need:<br>
<br>
    lldb::SBModule        GetModule ();<br>
    lldb::SBCompileUnit   GetCompileUnit ();<br>
    lldb::SBFunction      GetFunction ();<br>
    lldb::SBBlock         GetBlock ();<br>
    lldb::SBLineEntry     GetLineEntry ();<br>
    lldb::SBSymbol        GetSymbol ();<br>
<br>
Each of these objects could be valid, or could be invalid. Test each one with "IsValid()":<br>
<br>
    if (GetFunction().IsValid())<br>
    {<br>
    }<br>
    else if (GetSymbol().IsValid())<br>
    {<br>
    }<br>
<br>
<br>
Now you have the deepest most scope for the address you have looked up. You might want to figure out if there are any inlined functions. For this you can use:<br>
<br>
    SBSymbolContext<br>
    SBSymbolContext::GetParentOfInlinedScope (const SBAddress &curr_frame_pc,<br>
                                              SBAddress &parent_frame_addr) const;<br>
<br>
<br>
For example, we already have "addr" from above which is a SBAddress:<br>
<br>
    SBAddress curr_addr(addr);<br>
<br>
    while (1)<br>
    {<br>
        SBAddress parent_addr;<br>
        SBSymbolContext parent_sc = sc.GetParentOfInlinedScope(curr_addr, parent_addr);<br>
        if (!parent_sc.IsValid())<br>
            break;<br>
        // Print out frame info in "parent_addr" and "parent_sc"<br>
<br>
<br>
    }<br>
<br>
There are more basics on our website:<br>
<br>
<a href="http://lldb.llvm.org/symbolication.html" target="_blank">http://lldb.llvm.org/symbolication.html</a><br>
<div><div class="h5"><br>
<br>
On Sep 24, 2013, at 12:32 AM, Timothee Cour <<a href="mailto:timothee.cour2@gmail.com">timothee.cour2@gmail.com</a>> wrote:<br>
<br>
> I'm trying to get complete stacktraces from C/C++ (backtrace/backtrace_symbols has issues, eg line numbers are often wrong and file name omits full path), and want to use lldb for that.<br>
><br>
> from the main process A (with pidA), I tried calling lldb in a separate process that attaches to pidA and then prints the backtrace; that works but is slow.<br>
><br>
> So I'd like A to directly call lldb (via the C++ api) without having to launch a separate process, but can't make it work so far:<br>
><br>
> SBDebugger.Create (works)<br>
> CreateTargetWithFileAndArch (works)<br>
><br>
> * FindFunctions (works but then GetContextAtIndex(0).GetLineEntry is invalid)<br>
> * I also tried using ResolveFileAddress but that didn't work; not sure if it's because I need to set the load address somehow.<br>
><br>
> Note that all the above work when calling a separate process.<br>
><br>
> Is there some example code snippet for doing that?<br>
><br>
</div></div>> _______________________________________________<br>
> lldb-dev mailing list<br>
> <a href="mailto:lldb-dev@cs.uiuc.edu">lldb-dev@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev</a><br>
<br>
</blockquote></div><br></div>