Commit 13ad2f12 authored by Rye Mutt's avatar Rye Mutt 🍞
Browse files

sentry-native vendor source 0.4.17

parent 95747038
# Changelog
## 0.4.17
**Fixes**:
- sentry-native now successfully builds when examples aren't included. ([#702](https://github.com/getsentry/sentry-native/pull/702))
**Thank you**:
Features, fixes and improvements in this release have been contributed by:
- [@AenBleidd](https://github.com/AenBleidd)
## 0.4.16
**Features**:
- Removed the `SENTRY_PERFORMANCE_MONITORING` compile flag requirement to access performance monitoring in the Sentry SDK. Performance monitoring is now available to everybody who has opted into the experimental API.
- New API to check whether the application has crashed in the previous run: `sentry_get_crashed_last_run()` and `sentry_clear_crashed_last_run()` ([#685](https://github.com/getsentry/sentry-native/pull/685)).
- Allow overriding the SDK name at build time - set the `SENTRY_SDK_NAME` CMake cache variable.
- More aggressively prune the Crashpad database. ([#698](https://github.com/getsentry/sentry-native/pull/698))
**Internal**:
- Project IDs are now treated as opaque strings instead of integer values. ([#690](https://github.com/getsentry/sentry-native/pull/690))
- Updated Breakpad and Crashpad backends to 2022-04-12. ([#696](https://github.com/getsentry/sentry-native/pull/696))
**Fixes**:
- Updated CI as well as list of supported platforms to reflect Windows Server 2016, and therefore MSVC 2017 losing active support.
- Correctly free Windows Mutexes in Crashpad backend.
**Thank you**:
Features, fixes and improvements in this release have been contributed by:
- [@zhaowq32](https://github.com/zhaowq32)
## 0.4.15
**Fixes**:
......
......@@ -30,7 +30,7 @@ if(NOT CMAKE_C_STANDARD)
endif()
if(NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD 17)
endif()
include(GNUInstallDirs)
......@@ -151,9 +151,12 @@ if(SENTRY_BACKEND_CRASHPAD AND ANDROID)
message(FATAL_ERROR "The Crashpad backend is not currently supported on Android")
endif()
set(SENTRY_SDK_NAME "" CACHE STRING "The SDK name to report when sending events.")
message(STATUS "SENTRY_TRANSPORT=${SENTRY_TRANSPORT}")
message(STATUS "SENTRY_BACKEND=${SENTRY_BACKEND}")
message(STATUS "SENTRY_LIBRARY_TYPE=${SENTRY_LIBRARY_TYPE}")
message(STATUS "SENTRY_SDK_NAME=${SENTRY_SDK_NAME}")
if(ANDROID)
set(SENTRY_WITH_LIBUNWINDSTACK TRUE)
......@@ -221,6 +224,10 @@ target_sources(sentry PRIVATE "${PROJECT_SOURCE_DIR}/include/sentry.h")
add_library(sentry::sentry ALIAS sentry)
add_subdirectory(src)
if (NOT SENTRY_SDK_NAME STREQUAL "")
target_compile_definitions(sentry PRIVATE SENTRY_SDK_NAME="${SENTRY_SDK_NAME}")
endif()
# we do not need this on android, only linux
if(LINUX)
target_sources(sentry PRIVATE
......@@ -559,8 +566,6 @@ if(SENTRY_BUILD_EXAMPLES)
add_executable(sentry_example examples/example.c)
target_link_libraries(sentry_example PRIVATE sentry)
target_compile_definitions(sentry_example PRIVATE SENTRY_PERFORMANCE_MONITORING)
if(MSVC)
target_compile_options(sentry_example PRIVATE $<BUILD_INTERFACE:/wd5105>)
endif()
......
......@@ -12,6 +12,7 @@ Building and testing `sentry-native` currently requires the following tools:
- **CMake** and a supported C/C++ compiler, to actually build the code.
- **python** and **pytest**, to run integration tests.
- **clang-format** and **black**, to format the C/C++ and python code respectively.
- **curl** and **zlib** libraries (e.g. on Ubuntu: libcurl4-openssl-dev, libz-dev)
`pytest` and `black` are installed as virtualenv dependencies automatically.
......
......@@ -58,8 +58,8 @@ The SDK currently supports and is tested on the following OS/Compiler variations
- 64bit Linux with GCC 9
- 64bit Linux with clang 9
- 32bit Linux with GCC 7 (cross compiled from 64bit host)
- 64bit Windows with MSVC 2019
- 32bit Windows with MSVC 2017
- 32bit Windows with MSVC 2019
- 64bit Windows with MSVC 2022
- macOS Catalina with most recent Compiler toolchain
- Android API29 built by NDK21 toolchain
- Android API16 built by NDK19 toolchain
......@@ -264,13 +264,17 @@ Legend:
- `SENTRY_FOLDER` (Default: not defined):
Sets the sentry-native projects folder name for generators which support project hierarchy (like Microsoft Visual Studio).
To use this feature you need to enable hierarchy via [`USE_FOLDERS` property](https://cmake.org/cmake/help/latest/prop_gbl/USE_FOLDERS.html)
To use this feature you need to enable hierarchy via [`USE_FOLDERS` property](https://cmake.org/cmake/help/latest/prop_gbl/USE_FOLDERS.html)
- `CRASHPAD_ENABLE_STACKTRACE` (Default: OFF):
This enables client-side stackwalking when using the crashpad backend. Stack unwinding will happen on the client's machine
and the result will be submitted to Sentry attached to the generated minidump.
Note that this feature is still experimental.
- `SENTRY_SDK_NAME` (Default: sentry.native or sentry.native.android):
Sets the SDK name that should be included in the reported events. If you're overriding this, make sure to also define
the same value using `target_compile_definitions()` on your own targets that include `sentry.h`.
### Build Targets
- `sentry`: This is the main library and the only default build target.
......
......@@ -93,7 +93,6 @@ main(int argc, char **argv)
options, sentry_transport_new(print_envelope));
}
#ifdef SENTRY_PERFORMANCE_MONITORING
if (has_arg(argc, argv, "capture-transaction")) {
sentry_options_set_traces_sample_rate(options, 1.0);
}
......@@ -101,7 +100,6 @@ main(int argc, char **argv)
if (has_arg(argc, argv, "child-spans")) {
sentry_options_set_max_spans(options, 5);
}
#endif
sentry_init(options);
......@@ -218,7 +216,6 @@ main(int argc, char **argv)
sentry_capture_event(event);
}
#ifdef SENTRY_PERFORMANCE_MONITORING
if (has_arg(argc, argv, "capture-transaction")) {
sentry_transaction_context_t *tx_ctx
= sentry_transaction_context_new("little.teapot",
......@@ -253,7 +250,6 @@ main(int argc, char **argv)
sentry_transaction_finish(tx);
}
#endif
// make sure everything flushes
sentry_close();
......
......@@ -91,13 +91,13 @@ set(BREAKPAD_SOURCES_CLIENT_APPLE
breakpad/src/client/mac/handler/breakpad_nlist_64.h
breakpad/src/client/mac/handler/dynamic_images.cc
breakpad/src/client/mac/handler/dynamic_images.h
breakpad/src/client/mac/handler/exception_handler.cc
breakpad/src/client/mac/handler/exception_handler.h
breakpad/src/client/mac/handler/minidump_generator.cc
breakpad/src/client/mac/handler/minidump_generator.h
)
set(BREAKPAD_SOURCES_CLIENT_MAC
breakpad/src/client/mac/handler/exception_handler.cc
breakpad/src/client/mac/handler/exception_handler.h
breakpad/src/client/mac/crash_generation/crash_generation_client.cc
breakpad/src/client/mac/crash_generation/crash_generation_client.h
)
......
# GitHub actions workflow.
# https://docs.github.com/en/actions/learn-github-actions/workflow-syntax-for-github-actions
# https://scan.coverity.com/projects/gentoo-pax-utils
# https://scan.coverity.com/projects/google-breakpad
name: Coverity Scan
on:
......@@ -36,9 +36,8 @@ jobs:
- run: ./configure --disable-silent-rules
working-directory: src
- uses: vapier/coverity-scan-action@v0
- uses: vapier/coverity-scan-action@v1
with:
project: google%2Fbreakpad
command: make -C src -O -j$(getconf _NPROCESSORS_CONF)
email: google-breakpad-dev@googlegroups.com
email: ${{ secrets.COVERITY_SCAN_EMAIL }}
token: ${{ secrets.COVERITY_SCAN_TOKEN }}
......@@ -33,8 +33,15 @@ restrictions, these may appear in any order.
* A `FILE` record gives a source file name, and assigns it a number by which
other records can refer to it.
* An `INLINE_ORIGIN` record holds an inline function name for `INLINE` records
to refer to.
* A `FUNC` record describes a function present in the source code.
* An `INLINE` record describes the inline function's nest level, call site
line and call site source file to which the given ranges of machine code
should be attributed.
* A line record indicates to which source file and line a given range of
machine code should be attributed. The line is attributed to the function
defined by the most recent `FUNC` record.
......@@ -62,16 +69,25 @@ for _name_.
* The _operatingsystem_ field names the operating system on which the
executable or shared library was intended to run. This field should have one
of the following values: | **Value** | **Meaning** |
|:----------|:--------------------| | Linux | Linux | | mac | Macintosh OSX
| | windows | Microsoft Windows |
of the following values:
| **Value** | **Meaning** |
|:----------|:--------------------|
| Linux | Linux |
| mac | Macintosh OSX |
| windows | Microsoft Windows |
* The _architecture_ field indicates what processor architecture the
executable or shared library contains machine code for. This field should
have one of the following values: | **Value** | **Instruction Set
Architecture** | |:----------|:---------------------------------| | x86 |
Intel IA-32 | | x86\_64 | AMD64/Intel 64 | | ppc | 32-bit PowerPC | | ppc64
| 64-bit PowerPC | | unknown | unknown |
have one of the following values:
| **Value** | **Instruction Set Architecture** |
|:----------|:---------------------------------|
| x86 | Intel IA-32 |
| x86\_64 | AMD64/Intel 64 |
| ppc | 32-bit PowerPC |
| ppc64 | 64-bit PowerPC |
| unknown | unknown |
* The _id_ field is a sequence of hexadecimal digits that identifies the exact
executable or library whose contents the symbol file describes. The way in
......@@ -96,6 +112,22 @@ which other records (line records, in particular) can use to refer to that file
name. The _number_ field is a decimal number. The _name_ field is the name of
the file; it may contain spaces.
# `INLINE_ORIGIN` records
An `INLINE_ORIGIN` record holds an inline function name for `INLINE` records to
refer to. It has the form:
> `INLINE_ORIGIN` _number_ _name_
For example: `INLINE_ORIGIN 2 nsQueryInterfaceWithError::operator()(nsID const&,
void**) const
`
An `INLINE_ORIGIN` record provides the name of an inline function, and assigns
it a number which other records (`INLINE` records, in particular) can use to
refer to that function name. The _number_ field is a decimal number. The _name_
field is the name of the inline function; it may contain spaces.
# `FUNC` records
A `FUNC` record describes a source-language function. It has the form:
......@@ -127,6 +159,49 @@ The _name_ field is the name of the function. In languages that use linker
symbol name mangling like C++, this should be the source language name (the
"unmangled" form). This field may contain spaces.
# `INLINE` records
An `INLINE` record describes the inline function's nest level, call site line
and call site source file to which the given ranges of machine code should be
attributed. It has the form:
> `INLINE` _inline_nest_level_ _call_site_line_ _call_site_file_num_
> _origin_num_ [_address_ _size_]+
For example: `INLINE 0 10 3 4 d30 2a fa1 b
`
The _inline_nest_level_ field is a decimal number that means it's inlined at the
function described by a previous `INLINE` record which has _inline_nest_level_
one less than its. In the example below, first and third `INLINE` records have
_inline_nest_level_ 0, which means they are inlined inside the function
described by the `FUNC` record. The second `INLINE` record has
_inline_nest_level_ 1 means that it's inlined at the inline function described
by first `INLINE` record.
```
FUNC ...
INLINE 0 ...
INLINE 1 ...
INLINE 0 ...
```
The _call_site_line_ and _call_site_file_num_ fields are decimal numbers
indicating where this inline function being called at.
The _origin_num_ field refers to an `INLINE_ORIGIN` record that has the name
of the inline function.
The _address_ and _size_ fields are hexadecimal numbers indicating the start
address and length in bytes of the machine code. The address is relative to the
module's load address. There could be more than one [_address_ _size_] range
pair, since inline functions could have discontinuous address ranges. The ranges
of an `INLINE` record are always inside the ranges described by its parent
record (a `FUNC` record or an `INLINE` record).
The `INLINE` record is assumed to belong to the function described by the last
preceding `FUNC` record. `INLINE` records may not appear before the first `FUNC`
record.
# Line records
A line record describes the source file and line number to which a given range
......@@ -396,14 +471,14 @@ func+22: pc = *sp; sp += 4 ; pop return address and jump to it
The following table would describe the function above:
**code address** | **.cfa** | **r0 (on Google Code)** | **r1 (on Google Code)** | ... | **.ra**
:--------------- | :------- | :---------------------- | :---------------------- | :-- | :-------
func+0 | sp | | | | `cfa[0]`
func+1 | sp+16 | | | | `cfa[0]`
func+2 | sp+16 | `cfa[-4]` | | | `cfa[0]`
func+11 | sp+20 | `cfa[-4]` | | | `cfa[0]`
func+21 | sp+20 | | | | `cfa[0]`
func+22 | sp | | | | `cfa[0]`
| **code address** | **.cfa** | **r0 (on Google Code)** | **r1 (on Google Code)** | ... | **.ra** |
|:-----------------|:---------|:------------------------|:------------------------|:----|:---------|
| func+0 | sp | | | | `cfa[0]` |
| func+1 | sp+16 | | | | `cfa[0]` |
| func+2 | sp+16 | `cfa[-4]` | | | `cfa[0]` |
| func+11 | sp+20 | `cfa[-4]` | | | `cfa[0]` |
| func+21 | sp+20 | | | | `cfa[0]` |
| func+22 | sp | | | | `cfa[0]` |
Some things to note here:
......@@ -438,14 +513,14 @@ To save space, the most common type of CFI record only mentions the table
entries at which changes take place. So for the above, the CFI data would only
actually mention the non-blank entries here:
**insn** | **cfa** | **r0 (on Google Code)** | **r1 (on Google Code)** | ... | **ra**
:------- | :------ | :---------------------- | :---------------------- | :-- | :-------
func+0 | sp | | | | `cfa[0]`
func+1 | sp+16 | | | |
func+2 | | `cfa[-4]` | | |
func+11 | sp+20 | | | |
func+21 | | r0 (on Google Code) | | |
func+22 | sp | | | |
| **insn** | **cfa** | **r0 (on Google Code)** | **r1 (on Google Code)** | ... | **ra** |
|:---------|:--------|:------------------------|:------------------------|:----|:---------|
| func+0 | sp | | | | `cfa[0]` |
| func+1 | sp+16 | | | | |
| func+2 | | `cfa[-4]` | | | |
| func+11 | sp+20 | | | | |
| func+21 | | r0 (on Google Code) | | | |
| func+22 | sp | | | | |
A `STACK CFI INIT` record indicates that, at the machine instruction at
_address_, belonging to some function, the value that _register<sub>n</sub>_ had
......
......@@ -138,7 +138,7 @@ void InstallAlternateStackLocked() {
// SIGSTKSZ may be too small to prevent the signal handlers from overrunning
// the alternative stack. Ensure that the size of the alternative stack is
// large enough.
static const unsigned kSigStackSize = std::max(16384, (int)SIGSTKSZ);
const unsigned kSigStackSize = std::max<unsigned>(16384, SIGSTKSZ);
// Only set an alternative stack if there isn't already one, or if the current
// one is too small.
......
......@@ -49,8 +49,8 @@
namespace {
using google_breakpad::auto_wasteful_vector;
using google_breakpad::elf::kDefaultBuildIdSize;
using google_breakpad::ExceptionHandler;
using google_breakpad::kDefaultBuildIdSize;
using google_breakpad::LinuxDumper;
using google_breakpad::LinuxPtraceDumper;
using google_breakpad::MappingInfo;
......
......@@ -53,6 +53,8 @@
#include "google_breakpad/common/minidump_exception_linux.h"
#include "third_party/lss/linux_syscall_support.h"
using google_breakpad::elf::FileID;
#if defined(__ANDROID__)
// Android packed relocations definitions are not yet available from the
......
......@@ -63,6 +63,8 @@
#endif
using namespace google_breakpad;
using google_breakpad::elf::FileID;
using google_breakpad::elf::kDefaultBuildIdSize;
namespace {
......
......@@ -83,9 +83,9 @@ namespace {
using google_breakpad::AppMemoryList;
using google_breakpad::auto_wasteful_vector;
using google_breakpad::elf::kDefaultBuildIdSize;
using google_breakpad::ExceptionHandler;
using google_breakpad::CpuSet;
using google_breakpad::kDefaultBuildIdSize;
using google_breakpad::LineReader;
using google_breakpad::LinuxDumper;
using google_breakpad::LinuxPtraceDumper;
......
......@@ -54,6 +54,8 @@
#include "google_breakpad/processor/minidump.h"
using namespace google_breakpad;
using google_breakpad::elf::FileID;
using google_breakpad::elf::kDefaultBuildIdSize;
namespace {
......
......@@ -62,6 +62,8 @@ using MacStringUtils::IntegerValueAtIndex;
namespace google_breakpad {
using mach_o::FileID;
#if defined(__LP64__) && __LP64__
#define LC_SEGMENT_ARCH LC_SEGMENT_64
#else
......@@ -1449,7 +1451,7 @@ bool MinidumpGenerator::WriteCVRecord(MDRawModule* module, int cpu_type,
unsigned char identifier[16];
bool result = false;
if (in_memory) {
MacFileUtilities::MachoID macho(module_path,
MacFileUtilities::MachoID macho(
reinterpret_cast<void*>(module->base_of_image),
static_cast<size_t>(module->size_of_image));
result = macho.UUIDCommand(cpu_type, CPU_SUBTYPE_MULTIPLE, identifier);
......
......@@ -47,6 +47,7 @@
namespace {
using namespace google_breakpad;
using namespace google_breakpad::elf::FileID;
// Argument for the writer function.
struct WriterArgument {
......
......@@ -1793,7 +1793,7 @@ bool RangeListReader::ReadRanges(enum DwarfForm form, uint64_t data) {
}
} else if (form == DW_FORM_rnglistx) {
offset_array_ = cu_info_->ranges_base_;
uint64_t index_offset = reader_->AddressSize() * data;
uint64_t index_offset = reader_->OffsetSize() * data;
uint64_t range_list_offset =
reader_->ReadOffset(cu_info_->buffer_ + offset_array_ + index_offset);
......
......@@ -254,9 +254,6 @@ struct DwarfCUToModule::CUContext {
// A map of function pointers to the its forward specification DIE's offset.
map<Module::Function*, uint64_t> spec_function_offsets;
// From file index to vector of subprogram's offset in this CU.
map<uint64_t, vector<uint64_t>> inline_origins;
};
// Information about the context of a particular DIE. This is for
......@@ -561,7 +558,8 @@ class DwarfCUToModule::InlineHandler : public GenericDIEHandler {
DwarfForm high_pc_form_; // DW_AT_high_pc can be length or address.
DwarfForm ranges_form_; // DW_FORM_sec_offset or DW_FORM_rnglistx
uint64_t ranges_data_; // DW_AT_ranges
int call_site_line_;
int call_site_line_; // DW_AT_call_line
int call_site_file_id_; // DW_AT_call_file
int inline_nest_level_;
// A vector of inlines in the same nest level. It's owned by its parent
// function/inline. At Finish(), add this inline into the vector.
......@@ -589,6 +587,9 @@ void DwarfCUToModule::InlineHandler::ProcessAttributeUnsigned(
case DW_AT_call_line:
call_site_line_ = data;
break;
case DW_AT_call_file:
call_site_file_id_ = data;
break;
default:
GenericDIEHandler::ProcessAttributeUnsigned(attr, form, data);
break;
......@@ -652,6 +653,11 @@ void DwarfCUToModule::InlineHandler::Finish() {
}
}
// Ignore DW_TAG_inlined_subroutine with empty range.
if (ranges.empty()) {
return;
}
// Every DW_TAG_inlined_subroutine should have a DW_AT_abstract_origin.
assert(specification_offset_ != 0);
......@@ -661,8 +667,8 @@ void DwarfCUToModule::InlineHandler::Finish() {
cu_context_->file_context->module_->inline_origin_map
.GetOrCreateInlineOrigin(specification_offset_, name_);
unique_ptr<Module::Inline> in(
new Module::Inline(origin, ranges, call_site_line_, inline_nest_level_,
std::move(child_inlines_)));
new Module::Inline(origin, ranges, call_site_line_, call_site_file_id_,
inline_nest_level_, std::move(child_inlines_)));
inlines_.push_back(std::move(in));
}
......@@ -679,7 +685,6 @@ class DwarfCUToModule::FuncHandler: public GenericDIEHandler {
high_pc_form_(DW_FORM_addr),
ranges_form_(DW_FORM_sec_offset),
ranges_data_(0),
decl_file_data_(UINT64_MAX),
inline_(false),
handle_inline_(handle_inline) {}
......@@ -700,9 +705,7 @@ class DwarfCUToModule::FuncHandler: public GenericDIEHandler {
uint64_t low_pc_, high_pc_; // DW_AT_low_pc, DW_AT_high_pc
DwarfForm high_pc_form_; // DW_AT_high_pc can be length or address.
DwarfForm ranges_form_; // DW_FORM_sec_offset or DW_FORM_rnglistx
uint64_t ranges_data_; // DW_AT_ranges
// DW_AT_decl_file, value of UINT64_MAX means undefined.
uint64_t decl_file_data_;
uint64_t ranges_data_; // DW_AT_ranges
bool inline_;
vector<unique_ptr<Module::Inline>> child_inlines_;
bool handle_inline_;
......@@ -727,9 +730,6 @@ void DwarfCUToModule::FuncHandler::ProcessAttributeUnsigned(
ranges_data_ = data;
ranges_form_ = form;
break;
case DW_AT_decl_file:
decl_file_data_ = data;
break;
default:
GenericDIEHandler::ProcessAttributeUnsigned(attr, form, data);
break;
......@@ -857,8 +857,7 @@ void DwarfCUToModule::FuncHandler::Finish() {
// Only keep track of DW_TAG_subprogram which have the attributes we are
// interested.
if (handle_inline_ &&
(!empty_range || inline_ || decl_file_data_ != UINT64_MAX)) {
if (handle_inline_ && (!empty_range || inline_)) {
StringView name = name_.empty() ? name_omitted : name_;
uint64_t offset =
specification_offset_ != 0 ? specification_offset_ : offset_;
......@@ -866,8 +865,6 @@ void DwarfCUToModule::FuncHandler::Finish() {
offset);
cu_context_->file_context->module_->inline_origin_map
.GetOrCreateInlineOrigin(offset_, name);
if (decl_file_data_ != UINT64_MAX)
cu_context_->inline_origins[decl_file_data_].push_back(offset_);
}
}
......@@ -875,10 +872,12 @@ void DwarfCUToModule::FuncHandler::Finish() {
// component to their names: namespaces, classes, etc.
class DwarfCUToModule::NamedScopeHandler: public GenericDIEHandler {
public:
NamedScopeHandler(CUContext* cu_context, DIEContext* parent_context,
uint64_t offset, bool handle_inline)
: GenericDIEHandler(cu_context, parent_context, offset),
handle_inline_(handle_inline) { }
NamedScopeHandler(CUContext* cu_context,
DIEContext* parent_context,
uint64_t offset,
bool handle_inline)
: GenericDIEHandler(cu_context, parent_context, offset),
handle_inline_(handle_inline) {}
bool EndAttributes();
DIEHandler* FindChildHandler(uint64_t offset, enum DwarfTag tag);
......@@ -1450,10 +1449,12 @@ void DwarfCUToModule::AssignLinesToFunctions() {
}
void DwarfCUToModule::AssignFilesToInlines() {
for (auto iter : files_) {
cu_context_->file_context->module_->inline_origin_map
.AssignFilesToInlineOrigins(cu_context_->inline_origins[iter.first],
iter.second);
// Assign File* to Inlines inside this CU.
auto assignFile = [this](unique_ptr<Module::Inline>& in) {
in->call_site_file = files_[in->call_site_file_id];
};
for (auto func : cu_context_->functions) {
Module::Inline::InlineDFS(func->inlines, assignFile);
}
}
......
......@@ -87,11 +87,11 @@ using google_breakpad::DwarfRangeListHandler;
using google_breakpad::ElfClass;
using google_breakpad::ElfClass32;
using google_breakpad::ElfClass64;
using google_breakpad::FileID;
using google_breakpad::elf::FileID;
using google_breakpad::FindElfSectionByName;
using google_breakpad::GetOffset;
using google_breakpad::IsValidElf;
using google_breakpad::kDefaultBuildIdSize;
using google_breakpad::elf::kDefaultBuildIdSize;
using google_breakpad::Module;