So symbols currently can't be resolved lazily, and if they are, then that is 
the bug. As you noticed "Symbol *" items are handed out and you can't ever 
resize the vector.

The symbol table is fetched during:


    virtual Symtab *
    ObjectFile::GetSymtab () = 0;

Each ObjectFile subclass must hand out a complete symbol table when if first 
parses and hands out a Symtab.

Please fix the plug-in that is lazily adding symbols.

Greg


> On May 13, 2015, at 5:16 AM, Verena Beckham <ver...@codeplay.com> wrote:
> 
> Hi everyone,
> 
> I found a bug in the symbol lookup in lldb, and as far as I can tell it's a 
> serious design flaw in the way symbols are handled.
> However, I can only reproduce it when debugging an Android target remotely, 
> and I don't understand the symbol lookup mechanism sufficiently to be able to 
> reproduce it on a local target. The bug relies on a certain number of symbol 
> lookups and then another symbol lookup in very specific circumstances.
> I am hoping that describing the bug in detail will allow someone who knows 
> the mechanism understand the issues and create a local testcase.
> 
> Symbols are stored in a vector. Symbols are referenced and passed around as 
> pointers. When a new symbol is added it is appended to the symbol vector. If 
> the vector does not yet have enough capacity it is resized, which makes all 
> pointers to the symbols invalid.
> 
> In my example I use the "si" command to step into a function call. lldb then 
> tries to dump the assembly of the new function. During that call new symbols 
> are resolved and added, because symbols are resolved lazily, as I understand. 
> However, this happens right in the middle of Instruction::Dump (in the call 
> to CalculateMnemonicOperandsAndCommentIfNeeded), which takes in two 
> SymbolContexts which contain pointers to Symbols and passes them to 
> Debugger::FormatDisassemblerAddress. By the time this function gets called 
> the pointers to Symbols are invalid. GetName is called on them, but the name 
> is 0xfeeefeee, hence it crashes.
> 
> To check my hypothesis, I reserved a lot of space for the m_symbols vector 
> initially, and that stopped the crash from happening.
> 
> I've included below the callstacks to the place where the vector is resized, 
> as well as where it crashes.
> 
> Please let me know if you need any more information.
> Thanks very much!
> 
> symbol vector resizing:
> lldb_private::Symtab::AddSymbol
> ObjectFileELF::ResolveSymbolForAddress
> lldb_private::Module::ResolveSymbolContextForAddress
> lldb_private::Address::Dump
> DisassemblerLLVMC::SymbolLookup
> DisassemblerLLVMC::SymbolLookupCallback
> llvm::MCExternalSymbolizer::tryAddingSymbolicOperand
> llvm::MCDisassembler::tryAddingSymbolicOperand
> tryAddingSymbolicOperand
> translateImmediate
> translateOperand
> translateInstruction
> llvm::X86Disassembler::X86GenericDisassembler::getInstruction
> DisassemblerLLVMC::LLVMCDisassembler::GetMCInst
> InstructionLLVMC::CalculateMnemonicOperandsAndComment
> lldb_private::Instruction::CalculateMnemonicOperandsAndCommentIfNeeded
> lldb_private::Instruction::Dump
> lldb_private::Disassembler::PrintInstructions
> lldb_private::Disassembler::Disassemble
> 
> crash:
> lldb_private::ConstString::operator bool
> lldb_private::Mangled::GetDemangledName
> lldb_private::Mangled::GetName
> lldb_private::Symbol::GetName
> lldb_private::Debugger::FormatDisassemblerAddress
> lldb_private::Instruction::Dump
> lldb_private::Disassembler::PrintInstructions
> lldb_private::Disassembler::Disassemble
> 
> -- 
> Verena Beckham
> 
> Senior Developer
> 
> Codeplay Software Ltd
> 45 York Place, Edinburgh, EH1 3HP
> Tel: 0131 466 0503
> Fax: 0131 557 6600
> Website: http://www.codeplay.com
> 
> This email and any attachments may contain confidential and /or privileged 
> information and  is for use  by the addressee only. If you are not the 
> intended recipient, please notify Codeplay Software Ltd immediately and 
> delete the message from your computer. You may not copy or forward it,or use 
> or disclose its contents to any other person. Any views or other information 
> in this message which do not relate to our business are not authorized by 
> Codeplay software Ltd, nor does this message form part of any contract unless 
> so stated.
> As internet communications are capable of data corruption Codeplay Software 
> Ltd does not accept any responsibility for any changes made to this message 
> after it was sent. Please note that Codeplay Software Ltd does not accept any 
> liability or responsibility for viruses and it is your responsibility to scan 
> any attachments.
> Company registered in England and Wales, number: 04567874
> Registered office: 81 Linkfield Street, Redhill RH1 6BY
> _______________________________________________
> lldb-dev mailing list
> lldb-dev@cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev


_______________________________________________
lldb-dev mailing list
lldb-dev@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev

Reply via email to