mirror of
https://git.suyu.dev/suyu/breakpad.git
synced 2026-01-08 15:38:23 +01:00
Populate stack frames with unloaded module info.
This CL hits lots of source files because: 1. An update to the CodeModule virtual class. I added an is_loaded method to specify whether the module is loaded. There were several mocks/test classes that needed to be updated with an implementation. An alternative to this route would be to modify MinidumpUnloadedModule::code_file to prepend "Unloaded_" to the module name. 2. Added an unloaded_modules parameter to StackFrameSymbolizer::FillSourceLineInfo. BUG= Change-Id: Ic9c7f7c7b7e932a154a5d4ccf292c1527d8da09f Reviewed-on: https://chromium-review.googlesource.com/430241 Reviewed-by: Ivan Penkov <ivanpe@chromium.org>
This commit is contained in:
parent
e7dfafc16e
commit
0924d424e4
15 changed files with 161 additions and 13 deletions
|
|
@ -94,6 +94,9 @@ class CodeModule {
|
|||
// should always reflect the original values (reported in the minidump).
|
||||
virtual uint64_t shrink_down_delta() const = 0;
|
||||
virtual void SetShrinkDownDelta(uint64_t shrink_down_delta) = 0;
|
||||
|
||||
// Whether the module was unloaded from memory.
|
||||
virtual bool is_unloaded() const = 0;
|
||||
};
|
||||
|
||||
} // namespace google_breakpad
|
||||
|
|
|
|||
|
|
@ -399,6 +399,7 @@ class MinidumpModule : public MinidumpObject,
|
|||
virtual string debug_identifier() const;
|
||||
virtual string version() const;
|
||||
virtual CodeModule* Copy() const;
|
||||
virtual bool is_unloaded() const { return false; }
|
||||
|
||||
// Getter and setter for shrink_down_delta. This is used when the address
|
||||
// range for a module is shrunk down due to address range conflicts with
|
||||
|
|
@ -775,6 +776,7 @@ class MinidumpUnloadedModule : public MinidumpObject,
|
|||
string debug_identifier() const override;
|
||||
string version() const override;
|
||||
CodeModule* Copy() const override;
|
||||
bool is_unloaded() const override { return true; }
|
||||
uint64_t shrink_down_delta() const override;
|
||||
void SetShrinkDownDelta(uint64_t shrink_down_delta) override;
|
||||
|
||||
|
|
|
|||
|
|
@ -91,7 +91,7 @@ enum ExploitabilityRating {
|
|||
|
||||
class ProcessState {
|
||||
public:
|
||||
ProcessState() : modules_(NULL) { Clear(); }
|
||||
ProcessState() : modules_(NULL), unloaded_modules_(NULL) { Clear(); }
|
||||
~ProcessState();
|
||||
|
||||
// Resets the ProcessState to its default values
|
||||
|
|
@ -111,6 +111,7 @@ class ProcessState {
|
|||
}
|
||||
const SystemInfo* system_info() const { return &system_info_; }
|
||||
const CodeModules* modules() const { return modules_; }
|
||||
const CodeModules* unloaded_modules() const { return unloaded_modules_; }
|
||||
const vector<linked_ptr<const CodeModule> >* shrunk_range_modules() const {
|
||||
return &shrunk_range_modules_;
|
||||
}
|
||||
|
|
@ -177,6 +178,10 @@ class ProcessState {
|
|||
// ProcessState.
|
||||
const CodeModules *modules_;
|
||||
|
||||
// The modules that have been unloaded from the process represented by the
|
||||
// ProcessState.
|
||||
const CodeModules *unloaded_modules_;
|
||||
|
||||
// The modules which virtual address ranges were shrunk down due to
|
||||
// virtual address conflicts.
|
||||
vector<linked_ptr<const CodeModule> > shrunk_range_modules_;
|
||||
|
|
|
|||
|
|
@ -75,9 +75,11 @@ class StackFrameSymbolizer {
|
|||
|
||||
// Encapsulate the step of resolving source line info for a stack frame.
|
||||
// "frame" must not be NULL.
|
||||
virtual SymbolizerResult FillSourceLineInfo(const CodeModules* modules,
|
||||
const SystemInfo* system_info,
|
||||
StackFrame* stack_frame);
|
||||
virtual SymbolizerResult FillSourceLineInfo(
|
||||
const CodeModules* modules,
|
||||
const CodeModules* unloaded_modules,
|
||||
const SystemInfo* system_info,
|
||||
StackFrame* stack_frame);
|
||||
|
||||
virtual WindowsFrameInfo* FindWindowsFrameInfo(const StackFrame* frame);
|
||||
|
||||
|
|
|
|||
|
|
@ -89,8 +89,10 @@ class Stackwalker {
|
|||
DumpContext* context,
|
||||
MemoryRegion* memory,
|
||||
const CodeModules* modules,
|
||||
const CodeModules* unloaded_modules,
|
||||
StackFrameSymbolizer* resolver_helper);
|
||||
|
||||
|
||||
static void set_max_frames(uint32_t max_frames) {
|
||||
max_frames_ = max_frames;
|
||||
max_frames_set_ = true;
|
||||
|
|
@ -189,6 +191,11 @@ class Stackwalker {
|
|||
// This field is optional and may be NULL.
|
||||
const CodeModules* modules_;
|
||||
|
||||
// A list of unloaded modules, for populating frames which aren't matched
|
||||
// to any loaded modules.
|
||||
// This field is optional and may be NULL.
|
||||
const CodeModules* unloaded_modules_;
|
||||
|
||||
protected:
|
||||
// The StackFrameSymbolizer implementation.
|
||||
StackFrameSymbolizer* frame_symbolizer_;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue