1 // Copyright (c) 2013 Google Inc. 2 // All rights reserved. 3 // 4 // Redistribution and use in source and binary forms, with or without 5 // modification, are permitted provided that the following conditions are 6 // met: 7 // 8 // * Redistributions of source code must retain the above copyright 9 // notice, this list of conditions and the following disclaimer. 10 // * Redistributions in binary form must reproduce the above 11 // copyright notice, this list of conditions and the following disclaimer 12 // in the documentation and/or other materials provided with the 13 // distribution. 14 // * Neither the name of Google Inc. nor the names of its 15 // contributors may be used to endorse or promote products derived from 16 // this software without specific prior written permission. 17 // 18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 30 // stackwalker_address_list.cc: a pseudo stack walker. 31 // 32 // See stackwalker_address_list.h for documentation. 33 // 34 // Author: Chris Hamilton <chrisha (at) chromium.org> 35 36 #include <assert.h> 37 38 #include <vector> 39 40 #include "google_breakpad/processor/call_stack.h" 41 #include "google_breakpad/processor/memory_region.h" 42 #include "google_breakpad/processor/source_line_resolver_interface.h" 43 #include "google_breakpad/processor/stack_frame.h" 44 #include "processor/logging.h" 45 #include "processor/stackwalker_address_list.h" 46 47 namespace google_breakpad { 48 49 StackwalkerAddressList::StackwalkerAddressList( 50 const uint64_t* frames, 51 size_t frame_count, 52 const CodeModules* modules, 53 StackFrameSymbolizer* frame_symbolizer) 54 : Stackwalker(NULL, NULL, modules, frame_symbolizer), 55 frames_(frames), 56 frame_count_(frame_count) { 57 assert(frames); 58 assert(frame_symbolizer); 59 } 60 61 StackFrame* StackwalkerAddressList::GetContextFrame() { 62 if (frame_count_ == 0) 63 return NULL; 64 65 StackFrame* frame = new StackFrame(); 66 frame->instruction = frames_[0]; 67 frame->trust = StackFrame::FRAME_TRUST_PREWALKED; 68 return frame; 69 } 70 71 StackFrame* StackwalkerAddressList::GetCallerFrame(const CallStack* stack, 72 bool stack_scan_allowed) { 73 if (!stack) { 74 BPLOG(ERROR) << "Can't get caller frame without stack"; 75 return NULL; 76 } 77 78 size_t frame_index = stack->frames()->size(); 79 80 // There are no more frames to fetch. 81 if (frame_index >= frame_count_) 82 return NULL; 83 84 // All frames have the highest level of trust because they were 85 // explicitly provided. 86 StackFrame* frame = new StackFrame(); 87 frame->instruction = frames_[frame_index]; 88 frame->trust = StackFrame::FRAME_TRUST_PREWALKED; 89 return frame; 90 } 91 92 } // namespace google_breakpad 93