[lldb-dev] symbol lookup bug

Verena Beckham verena at codeplay.com
Wed May 13 05:16:45 PDT 2015


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



More information about the lldb-dev mailing list