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/SBBlock.h" 14 #include "LLDB/SBCompileUnit.h" 15 #include "LLDB/SBDebugger.h" 16 #include "LLDB/SBFunction.h" 17 #include "LLDB/SBModule.h" 18 #include "LLDB/SBSymbol.h" 19 #include "LLDB/SBTarget.h" 20 #include "LLDB/SBThread.h" 21 #include "LLDB/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 // To build the program, type (while in this directory): 34 // 35 // $ make 36 // 37 // then (for example): 38 // 39 // $ DYLD_FRAMEWORK_PATH=/Volumes/data/lldb/svn/ToT/build/Debug ./a.out executable_path file_address 40 //---------------------------------------------------------------------- 41 class LLDBSentry 42 { 43 public: 44 LLDBSentry() { 45 // Initialize LLDB 46 SBDebugger::Initialize(); 47 } 48 ~LLDBSentry() { 49 // Terminate LLDB 50 SBDebugger::Terminate(); 51 } 52 }; 53 int 54 main (int argc, char const *argv[]) 55 { 56 // Use a sentry object to properly initialize/terminate LLDB. 57 LLDBSentry sentry; 58 59 if (argc < 3) 60 exit (1); 61 62 // The first argument is the file path we want to look something up in 63 const char *exe_file_path = argv[1]; 64 // The second argument in the address that we want to lookup 65 lldb::addr_t file_addr = strtoull (argv[2], NULL, 0); 66 67 // Create a debugger instance so we can create a target 68 SBDebugger debugger (SBDebugger::Create()); 69 70 if (debugger.IsValid()) 71 { 72 // Create a target using the executable. 73 SBTarget target (debugger.CreateTargetWithFileAndArch (exe_file_path, "i386")); 74 if (target.IsValid()) 75 { 76 // Find the executable module so we can do a lookup inside it 77 SBFileSpec exe_file_spec (exe_file_path, true); 78 SBModule module (target.FindModule (exe_file_spec)); 79 80 // Take a file virtual address and resolve it to a section offset 81 // address that can be used to do a symbol lookup by address 82 SBAddress addr = module.ResolveFileAddress (file_addr); 83 if (addr.IsValid()) 84 85 { 86 // We can resolve a section offset address in the module 87 // and only ask for what we need. You can logical or together 88 // bits from the SymbolContextItem enumeration found in 89 // lldb-enumeration.h to request only what you want. Here we 90 // are asking for everything. 91 // 92 // NOTE: the less you ask for, the less LLDB will parse as 93 // LLDB does partial parsing on just about everything. 94 SBSymbolContext symbol_context (module.ResolveSymbolContextForAddress (addr, eSymbolContextEverything)); 95 96 SBCompileUnit comp_unit (symbol_context.GetCompileUnit()); 97 if (comp_unit.IsValid()) 98 { 99 } 100 SBFunction function (symbol_context.GetFunction()); 101 if (function.IsValid()) 102 { 103 } 104 SBBlock block (symbol_context.GetBlock()); 105 if (block.IsValid()) 106 { 107 } 108 SBLineEntry line_entry (symbol_context.GetLineEntry()); 109 if (line_entry.IsValid()) 110 { 111 } 112 SBSymbol symbol (symbol_context.GetSymbol()); 113 if (symbol.IsValid()) 114 { 115 } 116 } 117 } 118 } 119 120 return 0; 121 } 122 123