> On May 20, 2016, at 3:15 PM, Eugene Birukov via lldb-dev 
> <lldb-dev@lists.llvm.org> wrote:
> 
> Hi,
> 
> I am looking through LLDB code... Another dangerous operation is 
> Symtab::Finalize() that just swaps the array. This is especially bad since it 
> will defeat something like quick-and-dirty hack of preallocating a huge 
> vector upfront.
> 
> My first impulse to fix that (maybe just temporary to get me unblocked) was 
> neuter that Finalize() and replace vector with dequeue. But unfortunately 
> there are places when we take address to the first element and assume the 
> rest of memory is contiguous - say, we call ::bsearch() on it. 
> 
> Apparently, allocating each symbol separately and replacing the vector of 
> elements with the vector of (smart) pointers would work, but it will hurt 
> performance and probably cause the change touching lots of code...
> 
> So, any insights how to fix it? 

You can do anything you want when constructing the symbol table on the first 
call to ObjectFile::GetSymtab(), but once you return a "Symtab *" from your 
object file you can never add or change due to exactly this issue. So the bug 
is that ObjectFileELF::ResolveSymbolForAddress() is adding a symbol on the fly 
which must be fixed and can't happen. All symbols need to be added on the first 
call to "ObjectFile::GetSymtab()".

The ResolveSymbolForAddress doesn't seem to be in ObjectFileELF in top of tree. 
Maybe you can cherry pick the fix over to the LLDB 3.8 branch.
> 
> Thanks,
> Eugene
> 
> From: eugen...@hotmail.com
> To: lldb-dev@lists.llvm.org
> Subject: Memory corruption due to Symtab::AddSymbol growth
> Date: Fri, 20 May 2016 12:37:15 -0700
> 
> Hi,
> 
> I am running into memory corruption in LLDB 3.8 release candidate on Linux 
> Ubuntu 15.10. 
> I am trying to access stack frame and the symbol on this frame is corrupted. 
> Here is what I figured out:
> 
>       • "StackFrame" has field "m_sc" of type "SymbolContext"
>       • "SymbolContext" has field "symbol" which is "Symbol*" pointer 
> 
> Now, when AddSymbol needs to grow its storage, the std::vector allocates new 
> memory and makes  these "symbol" pointers dangling.
> Here is the call stack:
> 
> #0  0x00007ffff274188c in 
> lldb_private::SymbolContextScope::~SymbolContextScope (this=0x12b5a58, 
> __in_chrg=<optimized out>)
>     at 
> /home/eugenebi/llvm/tools/lldb/include/lldb/Symbol/SymbolContextScope.h:75
> #1  0x00007ffff289f78a in lldb_private::Symbol::~Symbol (this=0x12b5a58, 
> __in_chrg=<optimized out>)
>     at /home/eugenebi/llvm/tools/lldb/include/lldb/Symbol/Symbol.h:21
> #2  0x00007ffff28b72e8 in std::_Destroy<lldb_private::Symbol> 
> (__pointer=0x12b5a58) at /usr/include/c++/5/bits/stl_construct.h:93
> #3  0x00007ffff28b5a9d in 
> std::_Destroy_aux<false>::__destroy<lldb_private::Symbol*> 
> (__first=0x12b5a58, __last=0x12c1710)
>     at /usr/include/c++/5/bits/stl_construct.h:103
> #4  0x00007ffff28b3e41 in std::_Destroy<lldb_private::Symbol*> 
> (__first=0x12af710, __last=0x12c1710)
>     at /usr/include/c++/5/bits/stl_construct.h:126
> #5  0x00007ffff28b241b in std::_Destroy<lldb_private::Symbol*, 
> lldb_private::Symbol> (__first=0x12af710, __last=0x12c1710)
>     at /usr/include/c++/5/bits/stl_construct.h:151
> #6  0x00007ffff28b2a2f in std::vector<lldb_private::Symbol, 
> std::allocator<lldb_private::Symbol> 
> >::_M_emplace_back_aux<lldb_private::Symbol c                           
> onst&> (this=0x9f6688) at /usr/include/c++/5/bits/vector.tcc:436
> #7  0x00007ffff28b143d in std::vector<lldb_private::Symbol, 
> std::allocator<lldb_private::Symbol> >::push_back (this=0x9f6688, __x=...)
>     at /usr/include/c++/5/bits/stl_vector.h:923
> #8  0x00007ffff28ab0c0 in lldb_private::Symtab::AddSymbol (this=0x9f6680, 
> symbol=...)
>     at /home/eugenebi/llvm/tools/lldb/source/Symbol/Symtab.cpp:70
> #9  0x00007ffff2acba21 in ObjectFileELF::ResolveSymbolForAddress 
> (this=0x9f6310, so_addr=..., verify_unique=false)
>     at 
> /home/eugenebi/llvm/tools/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp:2881
> #10 0x00007ffff273cc50 in 
> lldb_private::Module::ResolveSymbolContextForAddress (this=0x9f5cb0, 
> so_addr=..., resolve_scope=72, sc=...,
>     resolve_tail_call_address=false) at 
> /home/eugenebi/llvm/tools/lldb/source/Core/Module.cpp:568
> #11 0x00007ffff2b31f04 in 
> lldb_private::RegisterContextLLDB::InitializeZerothFrame (this=0x98687c0)
>     at 
> /home/eugenebi/llvm/tools/lldb/source/Plugins/Process/Utility/RegisterContextLLDB.cpp:180
> #12 0x00007ffff2b31a34 in 
> lldb_private::RegisterContextLLDB::RegisterContextLLDB (this=0x98687c0, 
> thread=...,
>     next_frame=std::shared_ptr (empty) 0x0, sym_ctx=..., frame_number=0, 
> unwind_lldb=...)
>     at 
> /home/eugenebi/llvm/tools/lldb/source/Plugins/Process/Utility/RegisterContextLLDB.cpp:82
> #13 0x00007ffff2b2bb7a in lldb_private::UnwindLLDB::AddFirstFrame 
> (this=0x1ee82b0)
>     at 
> /home/eugenebi/llvm/tools/lldb/source/Plugins/Process/Utility/UnwindLLDB.cpp:97
> #14 0x00007ffff2b2cd01 in lldb_private::UnwindLLDB::DoGetFrameInfoAtIndex 
> (this=0x1ee82b0, idx=0, cfa=@0x7fffffffc270: 18446744073709551615,
>     pc=@0x7fffffffc268: 18446744073709551615) at 
> /home/eugenebi/llvm/tools/lldb/source/Plugins/Process/Utility/UnwindLLDB.cpp:422
> #15 0x00007ffff29ac64b in lldb_private::Unwind::GetFrameInfoAtIndex 
> (this=0x1ee82b0, frame_idx=0, cfa=@0x7fffffffc270: 18446744073709551615,
>     pc=@0x7fffffffc268: 18446744073709551615) at 
> /home/eugenebi/llvm/tools/lldb/include/lldb/Target/Unwind.h:78
> #16 0x00007ffff29aa4a9 in lldb_private::StackFrameList::GetFramesUpTo 
> (this=0x9868250, end_idx=0)
>     at /home/eugenebi/llvm/tools/lldb/source/Target/StackFrameList.cpp:308
> #17 0x00007ffff29ab150 in lldb_private::StackFrameList::GetFrameAtIndex 
> (this=0x9868250, idx=0)
>     at /home/eugenebi/llvm/tools/lldb/source/Target/StackFrameList.cpp:546
> #18 0x00007ffff29775fa in lldb_private::Thread::GetStackFrameAtIndex 
> (this=0x7ff6a805d4f0, idx=0)
>     at /home/eugenebi/llvm/tools/lldb/include/lldb/Target/Thread.h:539
> #19 0x00007ffff1032f0e in lldb::SBThread::GetFrameAtIndex 
> (this=0x7fffffffce30, idx=0)
>     at /home/eugenebi/llvm/tools/lldb/source/API/SBThread.cpp:1347
> 
> Thanks,
> Eugene
> _______________________________________________
> lldb-dev mailing list
> lldb-dev@lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev

_______________________________________________
lldb-dev mailing list
lldb-dev@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev

Reply via email to