1 //===-- main.cpp ------------------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include <stdint.h> 11 #include <stdlib.h> 12 13 #include "lldb/API/SBBlock.h" 14 #include "lldb/API/SBCompileUnit.h" 15 #include "lldb/API/SBDebugger.h" 16 #include "lldb/API/SBFunction.h" 17 #include "lldb/API/SBModule.h" 18 #include "lldb/API/SBSymbol.h" 19 #include "lldb/API/SBTarget.h" 20 #include "lldb/API/SBThread.h" 21 #include "lldb/API/SBProcess.h" 22 23 using namespace lldb; 24 25 //---------------------------------------------------------------------- 26 // This quick sample code shows how to create a debugger instance and 27 // create an "i386" executable target. Then we can lookup the executable 28 // module and resolve a file address into a section offset address, 29 // and find all symbol context objects (if any) for that address: 30 // compile unit, function, deepest block, line table entry and the 31 // symbol. 32 //---------------------------------------------------------------------- 33 int 34 main (int argc, char const *argv[]) 35 { 36 // Initialize LLDB 37 SBDebugger::Initialize(); 38 39 if (argc < 3) 40 exit (1); 41 42 // The first argument is the file path we want to look something up in 43 const char *exe_file_path = argv[1]; 44 // The second argument in the address that we want to lookup 45 lldb::addr_t file_addr = strtoull (argv[2], NULL, 0); 46 47 // Make a file spec out of our executable path 48 SBFileSpec exe_file_spec (exe_file_path); 49 50 // Create a debugger instance so we can create a target 51 SBDebugger debugger (SBDebugger::Create()); 52 53 if (debugger.IsValid()) 54 { 55 // Create a target using the executable. 56 SBTarget target (debugger.CreateTargetWithFileAndArch (exe_file_path, "i386")); 57 if (target.IsValid()) 58 { 59 // Find the executable module so we can do a lookup inside it 60 SBModule module (target.FindModule (exe_file_spec)); 61 SBAddress addr; 62 63 // Take a file virtual address and resolve it to a section offset 64 // address that can be used to do a symbol lookup by address 65 if (module.ResolveFileAddress (file_addr, addr)) 66 { 67 // We can resolve a section offset address in the module 68 // and only ask for what we need. You can logical or together 69 // bits from the SymbolContextItem enumeration found in 70 // lldb-enumeration.h to request only what you want. Here we 71 // are asking for everything. 72 // 73 // NOTE: the less you ask for, the less LLDB will parse as 74 // LLDB does partial parsing on just about everything. 75 SBSymbolContext symbol_context (module.ResolveSymbolContextForAddress (addr, eSymbolContextEverything)); 76 77 SBCompileUnit comp_unit (symbol_context.GetCompileUnit()); 78 if (comp_unit.IsValid()) 79 { 80 } 81 SBFunction function (symbol_context.GetFunction()); 82 if (function.IsValid()) 83 { 84 } 85 SBBlock block (symbol_context.GetBlock()); 86 if (block.IsValid()) 87 { 88 } 89 SBLineEntry line_entry (symbol_context.GetLineEntry()); 90 if (line_entry.IsValid()) 91 { 92 } 93 SBSymbol symbol (symbol_context.GetSymbol()); 94 if (symbol.IsValid()) 95 { 96 } 97 } 98 } 99 } 100 101 // Terminate LLDB 102 SBDebugger::Terminate(); 103 return 0; 104 } 105 106