aboutsummaryrefslogtreecommitdiff
path: root/source/Plugins/Process/Windows/MiniDump/ProcessWinMiniDump.h
blob: 12864be371275ed774f5ec2d1a60e866a3a87547 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
//===-- ProcessWinMiniDump.h ------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef liblldb_ProcessWinMiniDump_h_
#define liblldb_ProcessWinMiniDump_h_

#include <list>
#include <vector>

#include "lldb/Core/ConstString.h"
#include "lldb/Core/Error.h"
#include "lldb/Target/Process.h"

#include "Plugins/Process/Windows/Common/ProcessWindows.h"

struct ThreadData;

class ProcessWinMiniDump : public lldb_private::ProcessWindows
{
  public:
    static lldb::ProcessSP
    CreateInstance (lldb::TargetSP target_sp,
                    lldb_private::Listener &listener,
                    const lldb_private::FileSpec *crash_file_path);

    static void
    Initialize();

    static void
    Terminate();

    static lldb_private::ConstString
    GetPluginNameStatic();

    static const char *
    GetPluginDescriptionStatic();

    ProcessWinMiniDump(lldb::TargetSP target_sp,
                       lldb_private::Listener &listener,
                       const lldb_private::FileSpec &core_file);

    virtual
    ~ProcessWinMiniDump();

    bool
    CanDebug(lldb::TargetSP target_sp, bool plugin_specified_by_name) override;

    lldb_private::Error
    DoLoadCore() override;

    lldb_private::DynamicLoader *
    GetDynamicLoader() override;

    lldb_private::ConstString
    GetPluginName() override;

    uint32_t
    GetPluginVersion() override;

    lldb_private::Error
    DoDestroy() override;

    void
    RefreshStateAfterStop() override;

    bool
    IsAlive() override;

    bool
    WarnBeforeDetach () const override;

    size_t
    ReadMemory(lldb::addr_t addr, void *buf, size_t size, lldb_private::Error &error) override;

    size_t
    DoReadMemory(lldb::addr_t addr, void *buf, size_t size, lldb_private::Error &error) override;

    lldb_private::ArchSpec
    GetArchitecture();

    lldb_private::Error
    GetMemoryRegionInfo(lldb::addr_t load_addr, lldb_private::MemoryRegionInfo &range_info) override;

  protected:
    void
    Clear();

    bool
    UpdateThreadList(lldb_private::ThreadList &old_thread_list,
                     lldb_private::ThreadList &new_thread_list) override;

  private:
    // Describes a range of memory captured in the mini dump.
    struct Range {
      lldb::addr_t start;  // virtual address of the beginning of the range
      size_t size;         // size of the range in bytes
      const uint8_t *ptr;  // absolute pointer to the first byte of the range
    };

    // If the mini dump has a memory range that contains the desired address, it
    // returns true with the details of the range in *range_out.  Otherwise, it
    // returns false.
    bool
    FindMemoryRange(lldb::addr_t addr, Range *range_out) const;

    lldb_private::Error
    MapMiniDumpIntoMemory(const char *file);

    lldb_private::ArchSpec
    DetermineArchitecture();

    void
    ReadExceptionRecord();

    void
    ReadMiscInfo();

    void
    ReadModuleList();

    // A thin wrapper around WinAPI's MiniDumpReadDumpStream to avoid redundant
    // checks.  If there's a failure (e.g., if the requested stream doesn't exist),
    // the function returns nullptr and sets *size_out to 0.
    void *
    FindDumpStream(unsigned stream_number, size_t *size_out) const;

    // Isolate the data to keep Windows-specific types out of this header.  Can't
    // use the typical pimpl idiom because the implementation of this class also
    // needs access to public and protected members of the base class.
    class Data;
    std::unique_ptr<Data> m_data_up;
};

#endif  // liblldb_ProcessWinMiniDump_h_