├── windows ├── .gitattributes ├── make.bat ├── crash │ ├── main.cpp │ └── crash.vcxproj ├── BreakpadTools.sln └── dump_syms │ └── dump_syms.vcxproj ├── scripts ├── build-appveyor.bat ├── build-travis.sh └── cp-symbols.sh ├── .clang-format ├── .gitmodules ├── .gitignore ├── appveyor.yml ├── macos ├── main.cpp └── Makefile ├── linux ├── main.cpp └── Makefile ├── .travis.yml └── README.md /windows/.gitattributes: -------------------------------------------------------------------------------- 1 | * eol=crlf 2 | 3 | -------------------------------------------------------------------------------- /scripts/build-appveyor.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | pushd windows 4 | make 5 | popd 6 | -------------------------------------------------------------------------------- /.clang-format: -------------------------------------------------------------------------------- 1 | BasedOnStyle: Google 2 | --- 3 | Language: Cpp 4 | IndentWidth: 4 5 | DerivePointerAlignment: false 6 | PointerAlignment: Right 7 | AllowShortFunctionsOnASingleLine: None 8 | BinPackParameters: false 9 | --- 10 | -------------------------------------------------------------------------------- /windows/make.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | msbuild BreakpadTools.sln /p:Configuration=Release /p:Platform=x86 /t:Clean,Build 4 | 5 | pushd Release 6 | dump_syms crash.pdb > crash.sym 7 | crash 8 | ren *.dmp mini.dmp 9 | popd 10 | -------------------------------------------------------------------------------- /scripts/build-travis.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | # Run the dist build 5 | cd $PLATFORM 6 | make -j4 dist 7 | 8 | # Create a ZIP for S3 deployment 9 | cd build 10 | mkdir -p ../../dist 11 | zip -r ../../dist/breakpad-tools-$PLATFORM.zip * 12 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "deps/breakpad"] 2 | path = deps/breakpad 3 | url = https://chromium.googlesource.com/breakpad/breakpad 4 | [submodule "deps/third_party/lss"] 5 | path = deps/third_party/lss 6 | url = https://chromium.googlesource.com/linux-syscall-support 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | build/ 2 | dist/ 3 | 4 | # Visual Studio 5 | *.suo 6 | *.user 7 | *.userosscache 8 | *.sln.docstates 9 | *.filters 10 | [Dd]ebug/ 11 | [Dd]ebugPublic/ 12 | [Rr]elease/ 13 | [Rr]eleases/ 14 | x64/ 15 | x86/ 16 | bld/ 17 | [Bb]in/ 18 | [Oo]bj/ 19 | [Ll]og/ 20 | .vs/ 21 | -------------------------------------------------------------------------------- /appveyor.yml: -------------------------------------------------------------------------------- 1 | image: Visual Studio 2017 2 | skip_tags: true 3 | 4 | install: 5 | - git submodule update --init --recursive 6 | 7 | build_script: 8 | - scripts\build-appveyor 9 | 10 | artifacts: 11 | - path: 'windows\Release' 12 | name: breakpad-tools-windows 13 | type: zip 14 | 15 | deploy: 16 | provider: S3 17 | access_key_id: AKIAJKYWAF3QS7SFL75Q 18 | secret_access_key: 19 | secure: Jk6F78pedve8W++5KDviGUw07CA5mjtuAZNBbiY1zbAaDCtZhX0lZOVQLns36eRp 20 | bucket: getsentry-builds 21 | set_public: true 22 | folder: $(APPVEYOR_REPO_NAME) 23 | artifact: breakpad-tools-windows 24 | -------------------------------------------------------------------------------- /scripts/cp-symbols.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | if [[ "$#" -lt 2 ]]; then 5 | echo "Usage: $0 " 6 | echo "Moves symbols into the correct location" 7 | exit 1 8 | fi 9 | 10 | TARGET_DIR=$1 11 | mkdir -p "$TARGET_DIR" 12 | shift 13 | 14 | for SYM_FILE in "$@"; do 15 | if [ ! -f "$SYM_FILE" ]; then 16 | echo "File not found: $SYM_FILE" 17 | continue 18 | fi 19 | 20 | HEADER="$(head -1 "$SYM_FILE")" 21 | MODULE_ID=$(echo "$HEADER" | cut -d' ' -f4) 22 | MODULE_NAME="$(echo "$HEADER" | cut -d' ' -f5-)" 23 | FILE_NAME="${MODULE_NAME#*.pdb}.sym" 24 | 25 | TARGET_PATH="$TARGET_DIR/$MODULE_NAME/$MODULE_ID" 26 | TARGET_FILE="$TARGET_PATH/$MODULE_NAME.sym" 27 | mkdir -p "$TARGET_PATH" 28 | cp "$SYM_FILE" "$TARGET_FILE" 29 | done 30 | -------------------------------------------------------------------------------- /macos/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include "client/mac/handler/exception_handler.h" 3 | 4 | namespace { 5 | 6 | bool callback(const char *dump_dir, 7 | const char *minidump_id, 8 | void *context, 9 | bool succeeded) { 10 | if (succeeded) { 11 | printf("%s/%s.dmp\n", dump_dir, minidump_id); 12 | } else { 13 | printf("ERROR creating minidump\n"); 14 | } 15 | 16 | return succeeded; 17 | } 18 | 19 | void crash() { 20 | volatile int *i = reinterpret_cast(0x45); 21 | *i = 5; // crash! 22 | } 23 | 24 | void start() { 25 | crash(); // should get inlined with optimizations 26 | } 27 | 28 | } // namespace 29 | 30 | int main(int argc, char **argv) { 31 | google_breakpad::ExceptionHandler eh(".", 0, callback, 0, true, 0); 32 | start(); // should get inlined with optimizations 33 | return 0; 34 | } 35 | -------------------------------------------------------------------------------- /windows/crash/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include "client/windows/handler/exception_handler.h" 3 | 4 | namespace { 5 | 6 | bool callback(const wchar_t* dump_path, 7 | const wchar_t* minidump_id, 8 | void* context, 9 | EXCEPTION_POINTERS* exinfo, 10 | MDRawAssertionInfo* assertion, 11 | bool succeeded) { 12 | if (succeeded) { 13 | printf("%ws\\%ws.dmp\n", dump_path, minidump_id); 14 | } 15 | else { 16 | printf("ERROR creating minidump\n"); 17 | } 18 | 19 | return succeeded; 20 | } 21 | 22 | void crash() { 23 | volatile int *i = reinterpret_cast(0x45); 24 | *i = 5; // crash! 25 | } 26 | 27 | void start() { 28 | crash(); // should get inlined with optimizations 29 | } 30 | 31 | } // namespace 32 | 33 | int main(int argc, char **argv) { 34 | google_breakpad::ExceptionHandler eh(L".", 0, callback, 0, google_breakpad::ExceptionHandler::HANDLER_ALL); 35 | start(); // should get inlined with optimizations 36 | return 0; 37 | } -------------------------------------------------------------------------------- /linux/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include "client/linux/handler/exception_handler.h" 3 | 4 | namespace { 5 | 6 | bool callback(const google_breakpad::MinidumpDescriptor &descriptor, 7 | void *context, 8 | bool succeeded) { 9 | if (succeeded) { 10 | printf("%s\n", descriptor.path()); 11 | } else { 12 | printf( 13 | "ERROR creating minidump. If running in docker, pass " 14 | "--security-opt " 15 | "seccomp:unconfined"); 16 | } 17 | 18 | return succeeded; 19 | } 20 | 21 | void crash() { 22 | volatile int *i = reinterpret_cast(0x45); 23 | *i = 5; // crash! 24 | } 25 | 26 | void start() { 27 | crash(); // should get inlined with optimizations 28 | } 29 | 30 | } // namespace 31 | 32 | int main(int argc, char *argv[]) { 33 | google_breakpad::MinidumpDescriptor descriptor("."); 34 | google_breakpad::ExceptionHandler eh(descriptor, 0, callback, 0, true, -1); 35 | start(); // should get inlined with optimizations 36 | return 0; 37 | } 38 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: cpp 2 | install: make 3 | sudo: required 4 | 5 | install: skip 6 | script: scripts/build-travis.sh 7 | 8 | matrix: 9 | include: 10 | - os: linux 11 | dist: xenial 12 | env: PLATFORM=linux 13 | - os: osx 14 | env: PLATFORM=macos 15 | 16 | deploy: 17 | provider: s3 18 | access_key_id: AKIAJKYWAF3QS7SFL75Q 19 | secret_access_key: 20 | secure: wOcJ+hbnVHKWHx2yctMp5QIZA1+vxeorrldUPtnJGCLOiDsYLABeR1E2cvM04hoSvMJjR5XFhu6PZMTLTTs+15HZmA+NkSB5IIVLy1CU8D7R03xNdQquGtVj02rfCaSXbyTTPTlVL8AKHDSPdsQu8AfHpDL9Yv8y/QGrdI1aawwHsA56sQuMlKqfDlKO88hTmSxLKEqVS5LpnrJSqngTtEm193dsXjFznNtWUH6xq2jo8Aw4MGbHx9f+VbakBiWJz+gn1VHTDQnMiIHFkL73Eag42T5KOel6wEbVqtaUgBkCWOxCVGX2ov4wZZGEXe/IVVUdBXOtvHUtHgdsCvkbMpM02sNiS2Wvrj4YYMJQfflQspZUtMDIq3MGMxTQWz/NSbwu69C26RCei2/28anSiE6Smow6ESX5zLFU16r05gCG8AZrQ7LjJYwO8Sit3aC/FDrDnegelUvTim84V9bLLPKARdsIT6DqEZFmoYrNDx3MJ9YlOaylcDG9iXmapUfRNOdjom4ZC9MTof9sAkTVJBGkraVaqjLbC/6zUtO6VjeDujDFd3DzUKXc/nMx6BnYcNUarr0/Q29sil48lUWk4FbRX+6Yw8haECp4qXBMNUEgjLGbEdkkugrSu5XYcZJVRl+P5WYzEj6CCYWB74DtbnW4p7gPkJa9B/SAQbXFupw= 21 | skip_cleanup: true 22 | acl: public_read 23 | bucket: getsentry-builds 24 | upload-dir: $TRAVIS_REPO_SLUG 25 | local_dir: dist 26 | on: 27 | branch: master 28 | -------------------------------------------------------------------------------- /windows/BreakpadTools.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | VisualStudioVersion = 15.0.27309.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dump_syms", "dump_syms\dump_syms.vcxproj", "{D743E80E-5552-481B-83AC-BDEC25A54A23}" 7 | EndProject 8 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "crash", "crash\crash.vcxproj", "{3CB46ECF-54D2-4F1E-903F-BC6C30713A48}" 9 | EndProject 10 | Global 11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 12 | Debug|x64 = Debug|x64 13 | Debug|x86 = Debug|x86 14 | Release|x64 = Release|x64 15 | Release|x86 = Release|x86 16 | EndGlobalSection 17 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 18 | {D743E80E-5552-481B-83AC-BDEC25A54A23}.Debug|x64.ActiveCfg = Debug|x64 19 | {D743E80E-5552-481B-83AC-BDEC25A54A23}.Debug|x64.Build.0 = Debug|x64 20 | {D743E80E-5552-481B-83AC-BDEC25A54A23}.Debug|x86.ActiveCfg = Debug|Win32 21 | {D743E80E-5552-481B-83AC-BDEC25A54A23}.Debug|x86.Build.0 = Debug|Win32 22 | {D743E80E-5552-481B-83AC-BDEC25A54A23}.Release|x64.ActiveCfg = Release|x64 23 | {D743E80E-5552-481B-83AC-BDEC25A54A23}.Release|x64.Build.0 = Release|x64 24 | {D743E80E-5552-481B-83AC-BDEC25A54A23}.Release|x86.ActiveCfg = Release|Win32 25 | {D743E80E-5552-481B-83AC-BDEC25A54A23}.Release|x86.Build.0 = Release|Win32 26 | {3CB46ECF-54D2-4F1E-903F-BC6C30713A48}.Debug|x64.ActiveCfg = Debug|x64 27 | {3CB46ECF-54D2-4F1E-903F-BC6C30713A48}.Debug|x64.Build.0 = Debug|x64 28 | {3CB46ECF-54D2-4F1E-903F-BC6C30713A48}.Debug|x86.ActiveCfg = Debug|Win32 29 | {3CB46ECF-54D2-4F1E-903F-BC6C30713A48}.Debug|x86.Build.0 = Debug|Win32 30 | {3CB46ECF-54D2-4F1E-903F-BC6C30713A48}.Release|x64.ActiveCfg = Release|x64 31 | {3CB46ECF-54D2-4F1E-903F-BC6C30713A48}.Release|x64.Build.0 = Release|x64 32 | {3CB46ECF-54D2-4F1E-903F-BC6C30713A48}.Release|x86.ActiveCfg = Release|Win32 33 | {3CB46ECF-54D2-4F1E-903F-BC6C30713A48}.Release|x86.Build.0 = Release|Win32 34 | EndGlobalSection 35 | GlobalSection(SolutionProperties) = preSolution 36 | HideSolutionNode = FALSE 37 | EndGlobalSection 38 | GlobalSection(ExtensibilityGlobals) = postSolution 39 | SolutionGuid = {0FB0D3EB-874D-40FE-876B-335B81368D44} 40 | EndGlobalSection 41 | EndGlobal 42 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Breakpad Tools 2 | 3 | Builds Breakpad and creates artifacts on different operating systems. To use it, 4 | clone on a compatible system, go to the folder of the respective operating 5 | system, and run `make all` or run one of the targets below. 6 | 7 | ```sh 8 | git clone --recursive https://github.com/getsentry/breakpad-tools 9 | cd breakpad-tools/linux && make all 10 | ``` 11 | 12 | ## Download 13 | 14 | The latest builds can always be downloaded here: 15 | 16 | * [Download linux archive](https://s3.amazonaws.com/getsentry-builds/getsentry/breakpad-tools/breakpad-tools-linux.zip) 17 | * [Download macOS archive](https://s3.amazonaws.com/getsentry-builds/getsentry/breakpad-tools/breakpad-tools-macos.zip) 18 | * [Download windows archive](https://s3.amazonaws.com/getsentry-builds/getsentry/breakpad-tools/windows/breakpad-tools-windows.zip) 19 | 20 | ## Contents 21 | 22 | Each platform build folder contains the following artifacts: 23 | 24 | **Libraries** 25 | 26 | * `libclient.a`: Static library containing the breakpad `ExceptionHandler`
27 | _target: `make client`_ 28 | 29 | **Tools** 30 | 31 | * `dump_syms`: A tool to create breakpad symbols
32 | _target: `make dump_syms`_ 33 | * `minidump_dump`: A tool to show raw contents of minidumps
34 | _target: `make minidump_dump`_ 35 | * `minidump_stackwalk`: A tool to process minidumps
36 | _target: `make minidump_stackwalk`_ 37 | 38 | **Examples** 39 | 40 | * `crash`: A program that crashes and generates a minidump
41 | _target: `make crash`_ 42 | * `crash.sym`: Breakpad symbols for the crashing program
43 | _target: `make symbols`_ 44 | * `mini.dmp`: A crash dump of the `crash` executable
45 | _target: `make minidump`_ 46 | * `symbols/`: Symbol folder structure required by the processor
47 | _target: `make dist` (requires all other targets)_ 48 | 49 | _**Please note** that the examples are always built from scratch, so UUIDs will 50 | change!_ 51 | 52 | ## Build Process 53 | 54 | The breakpad libraries and tools are built with custom makefiles. Each OS folder 55 | contains a slightly different version customized to the platform. Breakpad has 56 | broken their own build files (especially on macOS) quite frequently, so this is 57 | the most stable approach. 58 | 59 | The Windows build uses `msbuild` instead of a makefile. It currently does not 60 | generate the client library and symbols folders. 61 | 62 | The breakpad submodule has been updated last on `2018-01-09`. Future updates 63 | might require changes to the makefiles. 64 | -------------------------------------------------------------------------------- /macos/Makefile: -------------------------------------------------------------------------------- 1 | TOP_DIR ?= .. 2 | OUT_DIR ?= build 3 | OPT_LEVEL ?= 3 4 | OMIT_FP ?= true 5 | 6 | FLAGS += \ 7 | -g \ 8 | -fPIC \ 9 | -O$(OPT_LEVEL) \ 10 | $(if $OMIT_FP, -fomit-frame-pointer) \ 11 | -DHAVE_MACH_O_NLIST_H \ 12 | -DBPLOG_MINIMUM_SEVERITY=SEVERITY_ERROR \ 13 | $(NULL) 14 | 15 | CFLAGS += \ 16 | $(FLAGS) \ 17 | $(NULL) 18 | 19 | CXXFLAGS += \ 20 | $(FLAGS) \ 21 | -std=c++11 \ 22 | -I$(TOP_DIR)/deps \ 23 | -I$(TOP_DIR)/deps/breakpad/src \ 24 | $(NULL) 25 | 26 | BINARIES = \ 27 | crash \ 28 | minidump_dump \ 29 | minidump_stackwalk \ 30 | dump_syms \ 31 | $(NULL) 32 | 33 | LIBRARIES = \ 34 | client \ 35 | disasm \ 36 | processor \ 37 | $(NULL) 38 | 39 | libdisasm_OBJ = \ 40 | deps/breakpad/src/third_party/libdisasm/ia32_implicit.o \ 41 | deps/breakpad/src/third_party/libdisasm/ia32_insn.o \ 42 | deps/breakpad/src/third_party/libdisasm/ia32_invariant.o \ 43 | deps/breakpad/src/third_party/libdisasm/ia32_modrm.o \ 44 | deps/breakpad/src/third_party/libdisasm/ia32_opcode_tables.o \ 45 | deps/breakpad/src/third_party/libdisasm/ia32_operand.o \ 46 | deps/breakpad/src/third_party/libdisasm/ia32_reg.o \ 47 | deps/breakpad/src/third_party/libdisasm/ia32_settings.o \ 48 | deps/breakpad/src/third_party/libdisasm/x86_disasm.o \ 49 | deps/breakpad/src/third_party/libdisasm/x86_format.o \ 50 | deps/breakpad/src/third_party/libdisasm/x86_imm.o \ 51 | deps/breakpad/src/third_party/libdisasm/x86_insn.o \ 52 | deps/breakpad/src/third_party/libdisasm/x86_misc.o \ 53 | deps/breakpad/src/third_party/libdisasm/x86_operand_list.o \ 54 | $(NULL) 55 | 56 | libclient_OBJ = \ 57 | deps/breakpad/src/client/minidump_file_writer.o \ 58 | deps/breakpad/src/client/mac/crash_generation/crash_generation_client.o \ 59 | deps/breakpad/src/client/mac/handler/dynamic_images.o \ 60 | deps/breakpad/src/client/mac/handler/exception_handler.o \ 61 | deps/breakpad/src/client/mac/handler/minidump_generator.o \ 62 | deps/breakpad/src/client/mac/handler/breakpad_nlist_64.o \ 63 | deps/breakpad/src/common/convert_UTF.o \ 64 | deps/breakpad/src/common/md5.o \ 65 | deps/breakpad/src/common/string_conversion.o \ 66 | deps/breakpad/src/common/mac/bootstrap_compat.o \ 67 | deps/breakpad/src/common/mac/file_id.o \ 68 | deps/breakpad/src/common/mac/macho_id.o \ 69 | deps/breakpad/src/common/mac/macho_utilities.o \ 70 | deps/breakpad/src/common/mac/macho_walker.o \ 71 | deps/breakpad/src/common/mac/string_utilities.o \ 72 | deps/breakpad/src/common/mac/MachIPC.o \ 73 | $(NULL) 74 | 75 | libprocessor_OBJ = \ 76 | deps/breakpad/src/common/path_helper.o \ 77 | deps/breakpad/src/processor/basic_code_modules.o \ 78 | deps/breakpad/src/processor/basic_source_line_resolver.o \ 79 | deps/breakpad/src/processor/call_stack.o \ 80 | deps/breakpad/src/processor/cfi_frame_info.o \ 81 | deps/breakpad/src/processor/disassembler_x86.o \ 82 | deps/breakpad/src/processor/dump_context.o \ 83 | deps/breakpad/src/processor/dump_object.o \ 84 | deps/breakpad/src/processor/logging.o \ 85 | deps/breakpad/src/processor/pathname_stripper.o \ 86 | deps/breakpad/src/processor/process_state.o \ 87 | deps/breakpad/src/processor/proc_maps_linux.o \ 88 | deps/breakpad/src/processor/simple_symbol_supplier.o \ 89 | deps/breakpad/src/processor/source_line_resolver_base.o \ 90 | deps/breakpad/src/processor/stack_frame_cpu.o \ 91 | deps/breakpad/src/processor/stack_frame_symbolizer.o \ 92 | deps/breakpad/src/processor/stackwalker.o \ 93 | deps/breakpad/src/processor/stackwalker_amd64.o \ 94 | deps/breakpad/src/processor/stackwalker_arm.o \ 95 | deps/breakpad/src/processor/stackwalker_arm64.o \ 96 | deps/breakpad/src/processor/stackwalker_mips.o \ 97 | deps/breakpad/src/processor/stackwalker_ppc.o \ 98 | deps/breakpad/src/processor/stackwalker_ppc64.o \ 99 | deps/breakpad/src/processor/stackwalker_sparc.o \ 100 | deps/breakpad/src/processor/stackwalker_x86.o \ 101 | deps/breakpad/src/processor/stackwalk_common.o \ 102 | deps/breakpad/src/processor/tokenize.o \ 103 | deps/breakpad/src/processor/exploitability.o \ 104 | deps/breakpad/src/processor/exploitability_linux.o \ 105 | deps/breakpad/src/processor/exploitability_win.o \ 106 | deps/breakpad/src/processor/minidump.o \ 107 | deps/breakpad/src/processor/minidump_processor.o \ 108 | deps/breakpad/src/processor/symbolic_constants_win.o \ 109 | $(NULL) 110 | 111 | crash_OBJ = \ 112 | libclient.a \ 113 | macos/main.o \ 114 | $(NULL) 115 | 116 | minidump_stackwalk_OBJ = \ 117 | libdisasm.a \ 118 | libprocessor.a \ 119 | deps/breakpad/src/processor/minidump_stackwalk.o \ 120 | $(NULL) 121 | 122 | minidump_dump_OBJ = \ 123 | libdisasm.a \ 124 | libprocessor.a \ 125 | deps/breakpad/src/processor/minidump_dump.o \ 126 | $(NULL) 127 | 128 | dump_syms_OBJ = \ 129 | deps/breakpad/src/common/convert_UTF.o \ 130 | deps/breakpad/src/common/dwarf/bytereader.o \ 131 | deps/breakpad/src/common/dwarf/cfi_assembler.o \ 132 | deps/breakpad/src/common/dwarf/dwarf2diehandler.o \ 133 | deps/breakpad/src/common/dwarf/dwarf2reader.o \ 134 | deps/breakpad/src/common/dwarf/elf_reader.o \ 135 | deps/breakpad/src/common/dwarf/functioninfo.o \ 136 | deps/breakpad/src/common/dwarf_cfi_to_module.o \ 137 | deps/breakpad/src/common/dwarf_cu_to_module.o \ 138 | deps/breakpad/src/common/dwarf_line_to_module.o \ 139 | deps/breakpad/src/common/language.o \ 140 | deps/breakpad/src/common/long_string_dictionary.o \ 141 | deps/breakpad/src/common/mac/arch_utilities.o \ 142 | deps/breakpad/src/common/mac/bootstrap_compat.o \ 143 | deps/breakpad/src/common/mac/dump_syms.o \ 144 | deps/breakpad/src/common/mac/file_id.o \ 145 | deps/breakpad/src/common/mac/macho_id.o \ 146 | deps/breakpad/src/common/mac/macho_reader.o \ 147 | deps/breakpad/src/common/mac/macho_utilities.o \ 148 | deps/breakpad/src/common/mac/macho_walker.o \ 149 | deps/breakpad/src/common/mac/string_utilities.o \ 150 | deps/breakpad/src/common/md5.o \ 151 | deps/breakpad/src/common/module.o \ 152 | deps/breakpad/src/common/path_helper.o \ 153 | deps/breakpad/src/common/simple_string_dictionary.o \ 154 | deps/breakpad/src/common/stabs_reader.o \ 155 | deps/breakpad/src/common/stabs_to_module.o \ 156 | deps/breakpad/src/common/string_conversion.o \ 157 | deps/breakpad/src/common/test_assembler.o \ 158 | deps/breakpad/src/tools/mac/dump_syms/dump_syms_tool.o \ 159 | $(NULL) 160 | 161 | all: minidump symbols $(BINARIES) $(LIBRARIES) 162 | 163 | minidump: $(OUT_DIR)/mini.dmp 164 | 165 | symbols: $(OUT_DIR)/crash.sym 166 | 167 | $(BINARIES): %: $(OUT_DIR)/% 168 | 169 | $(LIBRARIES): %: $(OUT_DIR)/lib%.a 170 | 171 | $(OUT_DIR)/mini.dmp: $(OUT_DIR)/crash 172 | $(RM) $(OUT_DIR)/mini.dmp 173 | -$(shell cd $(OUT_DIR) && ./crash) 174 | mv $(wildcard $(OUT_DIR)/*.dmp) $(OUT_DIR)/mini.dmp 175 | 176 | $(OUT_DIR)/crash.sym: $(OUT_DIR)/crash $(OUT_DIR)/dump_syms 177 | $(OUT_DIR)/dump_syms -g $(OUT_DIR)/crash.dSYM $(OUT_DIR)/crash > $@ 178 | 179 | .SECONDEXPANSION: 180 | $(LIBRARIES:%=$(OUT_DIR)/lib%.a): %.a: $$(addprefix $(OUT_DIR)/,$$($$(*F)_OBJ)) 181 | $(AR) $(ARFLAGS) $@ $(filter %.o,$^) 182 | 183 | .SECONDEXPANSION: 184 | $(BINARIES:%=$(OUT_DIR)/%): %: $$(addprefix $(OUT_DIR)/,$$($$(*F)_OBJ)) 185 | $(LINK.cpp) -o $@ $^ -framework CoreFoundation 186 | dsymutil $@ 187 | 188 | $(OUT_DIR)/%.o: $(TOP_DIR)/%.c 189 | @mkdir -p $(@D) 190 | $(COMPILE.c) $(OUTPUT_OPTION) $< 191 | 192 | $(OUT_DIR)/%.o: $(TOP_DIR)/%.cc 193 | @mkdir -p $(@D) 194 | $(COMPILE.cc) $(OUTPUT_OPTION) $< 195 | 196 | $(OUT_DIR)/%.o: $(TOP_DIR)/%.cpp 197 | @mkdir -p $(@D) 198 | $(COMPILE.cpp) $(OUTPUT_OPTION) $< 199 | 200 | $(OUT_DIR)/%.o: $(TOP_DIR)/%.mm 201 | @mkdir -p $(@D) 202 | $(COMPILE.cpp) $(OUTPUT_OPTION) $< 203 | 204 | dist: all 205 | $(RM) -r $(OUT_DIR)/deps $(OUT_DIR)/macos 206 | ../scripts/cp-symbols.sh $(OUT_DIR)/symbols $(OUT_DIR)/crash.sym 207 | 208 | clean: 209 | $(RM) -r $(OUT_DIR) 210 | 211 | .PHONY: all minidump symbols $(BINARIES) $(LIBRARIES) dist clean 212 | -------------------------------------------------------------------------------- /windows/dump_syms/dump_syms.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 15.0 23 | {D743E80E-5552-481B-83AC-BDEC25A54A23} 24 | dump_syms 25 | 10.0.16299.0 26 | Application 27 | Unicode 28 | 29 | 30 | 31 | true 32 | $(DefaultPlatformToolset) 33 | 34 | 35 | false 36 | $(DefaultPlatformToolset) 37 | true 38 | 39 | 40 | true 41 | $(DefaultPlatformToolset) 42 | 43 | 44 | false 45 | $(DefaultPlatformToolset) 46 | true 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | ..\..\deps\breakpad\src;$(VSInstallDir)\DIA SDK\include;$(IncludePath) 68 | 69 | 70 | ..\..\deps\breakpad\src;$(VSInstallDir)\DIA SDK\include;$(IncludePath) 71 | 72 | 73 | 74 | Level3 75 | Disabled 76 | true 77 | true 78 | 79 | 80 | imagehlp.lib;$(VSInstallDir)\DIA SDK\lib\diaguids.lib;%(AdditionalDependencies) 81 | 82 | 83 | 84 | 85 | Level3 86 | Disabled 87 | true 88 | true 89 | 90 | 91 | 92 | 93 | Level3 94 | MaxSpeed 95 | true 96 | true 97 | true 98 | true 99 | 100 | 101 | true 102 | true 103 | imagehlp.lib;$(VSInstallDir)\DIA SDK\lib\diaguids.lib;%(AdditionalDependencies) 104 | 105 | 106 | 107 | 108 | Level3 109 | MaxSpeed 110 | true 111 | true 112 | true 113 | true 114 | 115 | 116 | true 117 | true 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | -------------------------------------------------------------------------------- /linux/Makefile: -------------------------------------------------------------------------------- 1 | TOP_DIR ?= .. 2 | OUT_DIR ?= build 3 | OPT_LEVEL ?= 3 4 | OMIT_FP ?= true 5 | 6 | FLAGS += \ 7 | -g \ 8 | -fPIC \ 9 | -O$(OPT_LEVEL) \ 10 | $(if $OMIT_FP, -fomit-frame-pointer) \ 11 | -DHAVE_A_OUT_H \ 12 | -DBPLOG_MINIMUM_SEVERITY=SEVERITY_ERROR \ 13 | $(NULL) 14 | 15 | CFLAGS += \ 16 | $(FLAGS) \ 17 | $(NULL) 18 | 19 | CXXFLAGS += \ 20 | $(FLAGS) \ 21 | -std=c++11 \ 22 | -I$(TOP_DIR)/deps \ 23 | -I$(TOP_DIR)/deps/breakpad/src \ 24 | $(NULL) 25 | 26 | BINARIES = \ 27 | crash \ 28 | minidump_dump \ 29 | minidump_stackwalk \ 30 | dump_syms \ 31 | $(NULL) 32 | 33 | LIBRARIES = \ 34 | client \ 35 | disasm \ 36 | processor \ 37 | $(NULL) 38 | 39 | libdisasm_OBJ = \ 40 | deps/breakpad/src/third_party/libdisasm/ia32_implicit.o \ 41 | deps/breakpad/src/third_party/libdisasm/ia32_insn.o \ 42 | deps/breakpad/src/third_party/libdisasm/ia32_invariant.o \ 43 | deps/breakpad/src/third_party/libdisasm/ia32_modrm.o \ 44 | deps/breakpad/src/third_party/libdisasm/ia32_opcode_tables.o \ 45 | deps/breakpad/src/third_party/libdisasm/ia32_operand.o \ 46 | deps/breakpad/src/third_party/libdisasm/ia32_reg.o \ 47 | deps/breakpad/src/third_party/libdisasm/ia32_settings.o \ 48 | deps/breakpad/src/third_party/libdisasm/x86_disasm.o \ 49 | deps/breakpad/src/third_party/libdisasm/x86_format.o \ 50 | deps/breakpad/src/third_party/libdisasm/x86_imm.o \ 51 | deps/breakpad/src/third_party/libdisasm/x86_insn.o \ 52 | deps/breakpad/src/third_party/libdisasm/x86_misc.o \ 53 | deps/breakpad/src/third_party/libdisasm/x86_operand_list.o \ 54 | $(NULL) 55 | 56 | libclient_OBJ = \ 57 | deps/breakpad/src/client/linux/crash_generation/crash_generation_client.o \ 58 | deps/breakpad/src/client/linux/crash_generation/crash_generation_server.o \ 59 | deps/breakpad/src/client/linux/dump_writer_common/thread_info.o \ 60 | deps/breakpad/src/client/linux/dump_writer_common/ucontext_reader.o \ 61 | deps/breakpad/src/client/linux/handler/exception_handler.o \ 62 | deps/breakpad/src/client/linux/handler/minidump_descriptor.o \ 63 | deps/breakpad/src/client/linux/log/log.o \ 64 | deps/breakpad/src/client/linux/microdump_writer/microdump_writer.o \ 65 | deps/breakpad/src/client/linux/minidump_writer/linux_core_dumper.o \ 66 | deps/breakpad/src/client/linux/minidump_writer/linux_dumper.o \ 67 | deps/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.o \ 68 | deps/breakpad/src/client/linux/minidump_writer/minidump_writer.o \ 69 | deps/breakpad/src/client/minidump_file_writer.o \ 70 | deps/breakpad/src/common/convert_UTF.o \ 71 | deps/breakpad/src/common/md5.o \ 72 | deps/breakpad/src/common/string_conversion.o \ 73 | deps/breakpad/src/common/linux/elf_core_dump.o \ 74 | deps/breakpad/src/common/linux/elfutils.o \ 75 | deps/breakpad/src/common/linux/file_id.o \ 76 | deps/breakpad/src/common/linux/guid_creator.o \ 77 | deps/breakpad/src/common/linux/linux_libc_support.o \ 78 | deps/breakpad/src/common/linux/memory_mapped_file.o \ 79 | deps/breakpad/src/common/linux/safe_readlink.o \ 80 | $(NULL) 81 | 82 | libprocessor_OBJ = \ 83 | deps/breakpad/src/common/path_helper.o \ 84 | deps/breakpad/src/processor/basic_code_modules.o \ 85 | deps/breakpad/src/processor/basic_source_line_resolver.o \ 86 | deps/breakpad/src/processor/call_stack.o \ 87 | deps/breakpad/src/processor/cfi_frame_info.o \ 88 | deps/breakpad/src/processor/disassembler_x86.o \ 89 | deps/breakpad/src/processor/dump_context.o \ 90 | deps/breakpad/src/processor/dump_object.o \ 91 | deps/breakpad/src/processor/logging.o \ 92 | deps/breakpad/src/processor/pathname_stripper.o \ 93 | deps/breakpad/src/processor/process_state.o \ 94 | deps/breakpad/src/processor/proc_maps_linux.o \ 95 | deps/breakpad/src/processor/simple_symbol_supplier.o \ 96 | deps/breakpad/src/processor/source_line_resolver_base.o \ 97 | deps/breakpad/src/processor/stack_frame_cpu.o \ 98 | deps/breakpad/src/processor/stack_frame_symbolizer.o \ 99 | deps/breakpad/src/processor/stackwalker.o \ 100 | deps/breakpad/src/processor/stackwalker_amd64.o \ 101 | deps/breakpad/src/processor/stackwalker_arm.o \ 102 | deps/breakpad/src/processor/stackwalker_arm64.o \ 103 | deps/breakpad/src/processor/stackwalker_mips.o \ 104 | deps/breakpad/src/processor/stackwalker_ppc.o \ 105 | deps/breakpad/src/processor/stackwalker_ppc64.o \ 106 | deps/breakpad/src/processor/stackwalker_sparc.o \ 107 | deps/breakpad/src/processor/stackwalker_x86.o \ 108 | deps/breakpad/src/processor/stackwalk_common.o \ 109 | deps/breakpad/src/processor/tokenize.o \ 110 | deps/breakpad/src/processor/exploitability.o \ 111 | deps/breakpad/src/processor/exploitability_linux.o \ 112 | deps/breakpad/src/processor/exploitability_win.o \ 113 | deps/breakpad/src/processor/minidump.o \ 114 | deps/breakpad/src/processor/minidump_processor.o \ 115 | deps/breakpad/src/processor/symbolic_constants_win.o \ 116 | $(NULL) 117 | 118 | crash_OBJ = \ 119 | linux/main.o \ 120 | libclient.a \ 121 | $(NULL) 122 | 123 | minidump_stackwalk_OBJ = \ 124 | deps/breakpad/src/processor/minidump_stackwalk.o \ 125 | libprocessor.a \ 126 | libdisasm.a \ 127 | $(NULL) 128 | 129 | minidump_dump_OBJ = \ 130 | deps/breakpad/src/processor/minidump_dump.o \ 131 | libprocessor.a \ 132 | libdisasm.a \ 133 | $(NULL) 134 | 135 | dump_syms_OBJ = \ 136 | deps/breakpad/src/common/dwarf_cfi_to_module.o \ 137 | deps/breakpad/src/common/dwarf_cu_to_module.o \ 138 | deps/breakpad/src/common/dwarf_line_to_module.o \ 139 | deps/breakpad/src/common/language.o \ 140 | deps/breakpad/src/common/module.o \ 141 | deps/breakpad/src/common/path_helper.o \ 142 | deps/breakpad/src/common/stabs_reader.o \ 143 | deps/breakpad/src/common/stabs_to_module.o \ 144 | deps/breakpad/src/common/dwarf/bytereader.o \ 145 | deps/breakpad/src/common/dwarf/dwarf2diehandler.o \ 146 | deps/breakpad/src/common/dwarf/dwarf2reader.o \ 147 | deps/breakpad/src/common/dwarf/elf_reader.o \ 148 | deps/breakpad/src/common/linux/crc32.o \ 149 | deps/breakpad/src/common/linux/dump_symbols.o \ 150 | deps/breakpad/src/common/linux/elf_symbols_to_module.o \ 151 | deps/breakpad/src/common/linux/elfutils.o \ 152 | deps/breakpad/src/common/linux/file_id.o \ 153 | deps/breakpad/src/common/linux/linux_libc_support.o \ 154 | deps/breakpad/src/common/linux/memory_mapped_file.o \ 155 | deps/breakpad/src/common/linux/safe_readlink.o \ 156 | deps/breakpad/src/tools/linux/dump_syms/dump_syms.o \ 157 | $(NULL) 158 | 159 | all: minidump symbols $(BINARIES) $(LIBRARIES) 160 | 161 | minidump: $(OUT_DIR)/mini.dmp 162 | 163 | symbols: $(OUT_DIR)/crash.sym 164 | 165 | $(BINARIES): %: $(OUT_DIR)/% 166 | 167 | $(LIBRARIES): %: $(OUT_DIR)/lib%.a 168 | 169 | $(OUT_DIR)/mini.dmp: $(OUT_DIR)/crash 170 | $(RM) $(OUT_DIR)/mini.dmp 171 | -$(shell cd $(OUT_DIR) && ./crash) 172 | mv $(wildcard $(OUT_DIR)/*.dmp) $(OUT_DIR)/mini.dmp 173 | 174 | $(OUT_DIR)/crash.sym: $(OUT_DIR)/crash $(OUT_DIR)/dump_syms 175 | $(OUT_DIR)/dump_syms $(OUT_DIR)/crash > $@ 176 | 177 | .SECONDEXPANSION: 178 | $(LIBRARIES:%=$(OUT_DIR)/lib%.a): %.a: $$(addprefix $(OUT_DIR)/,$$($$(*F)_OBJ)) 179 | $(AR) $(ARFLAGS) $@ $(filter %.o,$^) 180 | 181 | .SECONDEXPANSION: 182 | $(BINARIES:%=$(OUT_DIR)/%): %: $$(addprefix $(OUT_DIR)/,$$($$(*F)_OBJ)) 183 | $(LINK.cpp) -o $@ $^ -lpthread 184 | objcopy --only-keep-debug $@ $@.debug 185 | strip -g $@ 186 | objcopy --add-gnu-debuglink=$@.debug $@ 187 | 188 | $(OUT_DIR)/%.o: $(TOP_DIR)/%.c 189 | @mkdir -p $(@D) 190 | $(COMPILE.c) $(OUTPUT_OPTION) $< 191 | 192 | $(OUT_DIR)/%.o: $(TOP_DIR)/%.cc 193 | @mkdir -p $(@D) 194 | $(COMPILE.cc) $(OUTPUT_OPTION) $< 195 | 196 | $(OUT_DIR)/%.o: $(TOP_DIR)/%.cpp 197 | @mkdir -p $(@D) 198 | $(COMPILE.cpp) $(OUTPUT_OPTION) $< 199 | 200 | $(OUT_DIR)/%.o: $(TOP_DIR)/%.mm 201 | @mkdir -p $(@D) 202 | $(COMPILE.cpp) $(OUTPUT_OPTION) $< 203 | 204 | dist: all 205 | $(RM) -r $(OUT_DIR)/deps $(OUT_DIR)/linux 206 | ../scripts/cp-symbols.sh $(OUT_DIR)/symbols $(OUT_DIR)/crash.sym 207 | 208 | clean: 209 | $(RM) -r $(OUT_DIR) 210 | 211 | .PHONY: all minidump symbols $(BINARIES) $(LIBRARIES) dist clean 212 | -------------------------------------------------------------------------------- /windows/crash/crash.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 15.0 23 | {3CB46ECF-54D2-4F1E-903F-BC6C30713A48} 24 | crash 25 | 10.0.16299.0 26 | Application 27 | Unicode 28 | 29 | 30 | 31 | true 32 | $(DefaultPlatformToolset) 33 | 34 | 35 | false 36 | $(DefaultPlatformToolset) 37 | true 38 | 39 | 40 | true 41 | $(DefaultPlatformToolset) 42 | 43 | 44 | false 45 | $(DefaultPlatformToolset) 46 | true 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | ..\..\deps\breakpad\src;$(IncludePath) 68 | 69 | 70 | ..\..\deps\breakpad\src;$(IncludePath) 71 | 72 | 73 | 74 | Level3 75 | Disabled 76 | true 77 | true 78 | 79 | 80 | 81 | 82 | Level3 83 | Disabled 84 | true 85 | true 86 | 87 | 88 | 89 | 90 | Level3 91 | MaxSpeed 92 | true 93 | true 94 | true 95 | true 96 | true 97 | 98 | 99 | true 100 | true 101 | 102 | 103 | 104 | 105 | Level3 106 | MaxSpeed 107 | true 108 | true 109 | true 110 | true 111 | 112 | 113 | true 114 | true 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 | --------------------------------------------------------------------------------