LLDB mainline
MinidumpFileBuilder Class Reference

Minidump writer for Linux. More...

#include <MinidumpFileBuilder.h>

Public Member Functions

 MinidumpFileBuilder (lldb::FileUP &&core_file, const lldb::ProcessSP &process_sp, lldb_private::SaveCoreOptions &save_core_options)
 MinidumpFileBuilder (const MinidumpFileBuilder &)=delete
MinidumpFileBuilderoperator= (const MinidumpFileBuilder &)=delete
 MinidumpFileBuilder (MinidumpFileBuilder &&other)=default
MinidumpFileBuilderoperator= (MinidumpFileBuilder &&other)=default
 ~MinidumpFileBuilder ()=default
lldb_private::Status AddHeaderAndCalculateDirectories ()
lldb_private::Status AddSystemInfo ()
lldb_private::Status AddModuleList ()
lldb_private::Status AddThreadList ()
lldb_private::Status AddExceptions ()
lldb_private::Status AddMemoryList ()
lldb_private::Status AddMiscInfo ()
lldb_private::Status AddLinuxFileStreams ()
lldb_private::Status DumpFile ()
void DeleteFile () noexcept

Private Member Functions

lldb_private::Status AddLLDBGeneratedStream ()
lldb_private::Status AddData (const void *data, uint64_t size)
lldb_private::Status AddMemoryList_64 (std::vector< lldb_private::CoreFileMemoryRange > &ranges, lldb_private::Progress &progress)
lldb_private::Status AddMemoryList_32 (std::vector< lldb_private::CoreFileMemoryRange > &ranges, lldb_private::Progress &progress)
lldb_private::Status FixThreadStacks ()
lldb_private::Status FlushBufferToDisk ()
lldb_private::Status DumpHeader () const
lldb_private::Status DumpDirectories () const
lldb_private::Status AddDirectory (llvm::minidump::StreamType type, uint64_t stream_size)
lldb::offset_t GetCurrentDataEndOffset () const
lldb_private::Status ReadWriteMemoryInChunks (lldb_private::DataBufferHeap &data_buffer, const lldb_private::CoreFileMemoryRange &range, uint64_t &bytes_read)

Private Attributes

std::vector< llvm::minidump::Directory > m_directories
std::unordered_map< lldb::addr_t, llvm::minidump::Thread > m_thread_by_range_end
lldb_private::DataBufferHeap m_data
lldb::ProcessSP m_process_sp
size_t m_expected_directories = 0
uint64_t m_saved_data_size = 0
lldb::offset_t m_thread_list_start = 0
std::unordered_map< lldb::tid_t, llvm::minidump::LocationDescriptor > m_tid_to_reg_ctx
lldb::FileUP m_core_file
lldb_private::SaveCoreOptions m_save_core_options

Static Private Attributes

static constexpr uint64_t MAX_WRITE_CHUNK_SIZE = (1024 * 1024 * 128)
static constexpr size_t HEADER_SIZE = sizeof(llvm::minidump::Header)
static constexpr size_t DIRECTORY_SIZE = sizeof(llvm::minidump::Directory)

Detailed Description

Minidump writer for Linux.

This class provides a Minidump writer that is able to snapshot the current process state.

Minidumps are a Microsoft format for dumping process state. This class constructs the minidump on disk starting with Headers and Directories are written at the top of the file, with the amount of bytes being precalculates before any writing takes place Then the smaller data sections are written SystemInfo, ModuleList, Misc Info. Then Threads are emitted, threads are the first section that needs to be 'fixed up' this happens when later we emit the memory stream, we identify if that stream is the expected stack, and if so we update the stack with the current RVA. Lastly the Memory lists are added. For Memory List, this will contain everything that can fit within 4.2gb. MemoryList has it's descriptors written at the end so it cannot be allowed to overflow.

Memory64List is a special case where it has to be begin before 4.2gb but can expand forever The difference in Memory64List is there are no RVA's and all the addresses are figured out by starting at the base RVA, and adding the antecedent memory sections.

Because Memory64List can be arbitrarily large, this class has to write chunks to disk this means we have to precalculate the descriptors and write them first, and if we encounter any error, or are unable to read the same number of bytes we have to go back and update them on disk.

And as the last step, after all the directories have been added, we go back to the top of the file to fill in the header and the redirectory sections that we preallocated.

Definition at line 77 of file MinidumpFileBuilder.h.

Constructor & Destructor Documentation

◆ MinidumpFileBuilder() [1/3]

MinidumpFileBuilder::MinidumpFileBuilder ( lldb::FileUP && core_file,
const lldb::ProcessSP & process_sp,
lldb_private::SaveCoreOptions & save_core_options )
inline

◆ MinidumpFileBuilder() [2/3]

MinidumpFileBuilder::MinidumpFileBuilder ( const MinidumpFileBuilder & )
delete

References MinidumpFileBuilder().

◆ MinidumpFileBuilder() [3/3]

MinidumpFileBuilder::MinidumpFileBuilder ( MinidumpFileBuilder && other)
default

References MinidumpFileBuilder().

◆ ~MinidumpFileBuilder()

Member Function Documentation

◆ AddData()

Status MinidumpFileBuilder::AddData ( const void * data,
uint64_t size )
private

◆ AddDirectory()

◆ AddExceptions()

◆ AddHeaderAndCalculateDirectories()

◆ AddLinuxFileStreams()

◆ AddLLDBGeneratedStream()

Status MinidumpFileBuilder::AddLLDBGeneratedStream ( )
private

Definition at line 133 of file MinidumpFileBuilder.cpp.

References AddDirectory(), and error().

Referenced by AddHeaderAndCalculateDirectories(), and ~MinidumpFileBuilder().

◆ AddMemoryList()

◆ AddMemoryList_32()

◆ AddMemoryList_64()

◆ AddMiscInfo()

◆ AddModuleList()

◆ AddSystemInfo()

◆ AddThreadList()

◆ DeleteFile()

void MinidumpFileBuilder::DeleteFile ( )
noexcept

◆ DumpDirectories()

Status MinidumpFileBuilder::DumpDirectories ( ) const
private

◆ DumpFile()

Status MinidumpFileBuilder::DumpFile ( )

◆ DumpHeader()

Status MinidumpFileBuilder::DumpHeader ( ) const
private

◆ FixThreadStacks()

Status MinidumpFileBuilder::FixThreadStacks ( )
private

◆ FlushBufferToDisk()

Status MinidumpFileBuilder::FlushBufferToDisk ( )
private

◆ GetCurrentDataEndOffset()

offset_t MinidumpFileBuilder::GetCurrentDataEndOffset ( ) const
private

◆ operator=() [1/2]

MinidumpFileBuilder & MinidumpFileBuilder::operator= ( const MinidumpFileBuilder & )
delete

References MinidumpFileBuilder().

◆ operator=() [2/2]

MinidumpFileBuilder & MinidumpFileBuilder::operator= ( MinidumpFileBuilder && other)
default

References MinidumpFileBuilder().

◆ ReadWriteMemoryInChunks()

Member Data Documentation

◆ DIRECTORY_SIZE

size_t MinidumpFileBuilder::DIRECTORY_SIZE = sizeof(llvm::minidump::Directory)
staticconstexprprivate

Definition at line 177 of file MinidumpFileBuilder.h.

Referenced by DumpDirectories().

◆ HEADER_SIZE

size_t MinidumpFileBuilder::HEADER_SIZE = sizeof(llvm::minidump::Header)
staticconstexprprivate

◆ m_core_file

◆ m_data

◆ m_directories

std::vector<llvm::minidump::Directory> MinidumpFileBuilder::m_directories
private

Definition at line 154 of file MinidumpFileBuilder.h.

Referenced by AddDirectory(), DumpDirectories(), and DumpHeader().

◆ m_expected_directories

size_t MinidumpFileBuilder::m_expected_directories = 0
private

Definition at line 167 of file MinidumpFileBuilder.h.

Referenced by AddDirectory(), and AddHeaderAndCalculateDirectories().

◆ m_process_sp

◆ m_save_core_options

lldb_private::SaveCoreOptions MinidumpFileBuilder::m_save_core_options
private

◆ m_saved_data_size

uint64_t MinidumpFileBuilder::m_saved_data_size = 0
private

◆ m_thread_by_range_end

std::unordered_map<lldb::addr_t, llvm::minidump::Thread> MinidumpFileBuilder::m_thread_by_range_end
private

◆ m_thread_list_start

lldb::offset_t MinidumpFileBuilder::m_thread_list_start = 0
private

Definition at line 169 of file MinidumpFileBuilder.h.

Referenced by AddThreadList(), and FixThreadStacks().

◆ m_tid_to_reg_ctx

std::unordered_map<lldb::tid_t, llvm::minidump::LocationDescriptor> MinidumpFileBuilder::m_tid_to_reg_ctx
private

Definition at line 183 of file MinidumpFileBuilder.h.

Referenced by AddExceptions(), and AddThreadList().

◆ MAX_WRITE_CHUNK_SIZE

uint64_t MinidumpFileBuilder::MAX_WRITE_CHUNK_SIZE = (1024 * 1024 * 128)
staticconstexprprivate

Definition at line 174 of file MinidumpFileBuilder.h.

Referenced by AddData(), AddMemoryList_32(), and AddMemoryList_64().


The documentation for this class was generated from the following files: