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@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 47namespace google_breakpad { 48 49StackwalkerAddressList::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 61StackFrame* 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 71StackFrame* 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