Showing preview only (7,666K chars total). Download the full file or copy to clipboard to get everything.
Repository: chromium/crashpad
Branch: main
Commit: 631b657792ed
Files: 1179
Total size: 7.1 MB
Directory structure:
gitextract_jbkjhin4/
├── .clang-format
├── .gitattributes
├── .gitignore
├── .gn
├── .style.yapf
├── .vpython3
├── AUTHORS
├── BUILD.gn
├── CONTRIBUTORS
├── DEPS
├── LICENSE
├── OWNERS
├── README.md
├── build/
│ ├── BUILD.gn
│ ├── BUILDCONFIG.gn
│ ├── config/
│ │ └── fuchsia/
│ │ └── gn_configs.gni
│ ├── crashpad_buildconfig.gni
│ ├── crashpad_fuzzer_test.gni
│ ├── fuchsia_envs.py
│ ├── install_linux_sysroot.py
│ ├── ios/
│ │ ├── Unittest-Info.plist
│ │ ├── convert_gn_xcodeproj.py
│ │ ├── setup_ios_gn.config
│ │ ├── setup_ios_gn.py
│ │ ├── xcodescheme-testable.template
│ │ └── xcodescheme.template
│ ├── run_tests.py
│ └── test.gni
├── client/
│ ├── BUILD.gn
│ ├── annotation.cc
│ ├── annotation.h
│ ├── annotation_list.cc
│ ├── annotation_list.h
│ ├── annotation_list_test.cc
│ ├── annotation_test.cc
│ ├── client_argv_handling.cc
│ ├── client_argv_handling.h
│ ├── crash_handler_base_ios.cc
│ ├── crash_handler_base_ios.h
│ ├── crash_handler_ios.cc
│ ├── crash_handler_ios.h
│ ├── crash_handler_tvos.cc
│ ├── crash_handler_tvos.h
│ ├── crash_report_database.cc
│ ├── crash_report_database.h
│ ├── crash_report_database_generic.cc
│ ├── crash_report_database_mac.mm
│ ├── crash_report_database_test.cc
│ ├── crash_report_database_win.cc
│ ├── crashpad_client.h
│ ├── crashpad_client_fuchsia.cc
│ ├── crashpad_client_ios.cc
│ ├── crashpad_client_ios_test.mm
│ ├── crashpad_client_linux.cc
│ ├── crashpad_client_linux_test.cc
│ ├── crashpad_client_mac.cc
│ ├── crashpad_client_win.cc
│ ├── crashpad_client_win_test.cc
│ ├── crashpad_info.cc
│ ├── crashpad_info.h
│ ├── crashpad_info_note.S
│ ├── crashpad_info_test.cc
│ ├── ios_handler/
│ │ ├── exception_processor.h
│ │ ├── exception_processor.mm
│ │ ├── exception_processor_test.mm
│ │ ├── in_process_handler.cc
│ │ ├── in_process_handler.h
│ │ ├── in_process_handler_test.cc
│ │ ├── in_process_intermediate_dump_handler.cc
│ │ ├── in_process_intermediate_dump_handler.h
│ │ ├── in_process_intermediate_dump_handler_test.cc
│ │ ├── prune_intermediate_dumps_and_crash_reports_thread.cc
│ │ └── prune_intermediate_dumps_and_crash_reports_thread.h
│ ├── length_delimited_ring_buffer.h
│ ├── length_delimited_ring_buffer_test.cc
│ ├── prune_crash_reports.cc
│ ├── prune_crash_reports.h
│ ├── prune_crash_reports_test.cc
│ ├── pthread_create_linux.cc
│ ├── ring_buffer_annotation.h
│ ├── ring_buffer_annotation_load_test_main.cc
│ ├── ring_buffer_annotation_test.cc
│ ├── settings.cc
│ ├── settings.h
│ ├── settings_test.cc
│ ├── simple_address_range_bag.h
│ ├── simple_address_range_bag_test.cc
│ ├── simple_string_dictionary.h
│ ├── simple_string_dictionary_test.cc
│ ├── simulate_crash.h
│ ├── simulate_crash_ios.h
│ ├── simulate_crash_linux.h
│ ├── simulate_crash_mac.cc
│ ├── simulate_crash_mac.h
│ ├── simulate_crash_mac_test.cc
│ ├── simulate_crash_win.h
│ └── upload_behavior_ios.h
├── codereview.settings
├── compat/
│ ├── BUILD.gn
│ ├── android/
│ │ ├── dlfcn_internal.cc
│ │ ├── dlfcn_internal.h
│ │ ├── elf.h
│ │ ├── linux/
│ │ │ ├── elf.h
│ │ │ ├── prctl.h
│ │ │ └── ptrace.h
│ │ ├── sched.h
│ │ └── sys/
│ │ ├── epoll.cc
│ │ ├── epoll.h
│ │ ├── mman.h
│ │ ├── mman_mmap.cc
│ │ ├── syscall.h
│ │ └── user.h
│ ├── ios/
│ │ └── mach/
│ │ ├── exc.defs
│ │ ├── mach_exc.defs
│ │ ├── mach_types.defs
│ │ ├── machine/
│ │ │ └── machine_types.defs
│ │ └── std_types.defs
│ ├── linux/
│ │ ├── signal.h
│ │ └── sys/
│ │ ├── mman.h
│ │ ├── mman_memfd_create.cc
│ │ ├── ptrace.h
│ │ └── user.h
│ ├── mac/
│ │ ├── Availability.h
│ │ ├── AvailabilityVersions.h
│ │ ├── kern/
│ │ │ └── exc_resource.h
│ │ ├── mach/
│ │ │ ├── i386/
│ │ │ │ └── thread_state.h
│ │ │ └── mach.h
│ │ ├── mach-o/
│ │ │ └── loader.h
│ │ └── sys/
│ │ └── resource.h
│ ├── non_mac/
│ │ ├── mach/
│ │ │ ├── mach.h
│ │ │ ├── machine.h
│ │ │ └── vm_prot.h
│ │ └── mach-o/
│ │ └── loader.h
│ ├── non_win/
│ │ ├── dbghelp.h
│ │ ├── minwinbase.h
│ │ ├── timezoneapi.h
│ │ ├── verrsrc.h
│ │ ├── windows.h
│ │ └── winnt.h
│ └── win/
│ ├── getopt.h
│ ├── strings.cc
│ ├── strings.h
│ ├── sys/
│ │ ├── time.h
│ │ └── types.h
│ ├── time.cc
│ ├── time.h
│ ├── winbase.h
│ ├── winnt.h
│ └── winternl.h
├── doc/
│ ├── .gitignore
│ ├── appengine/
│ │ ├── README
│ │ ├── go.mod
│ │ ├── go.sum
│ │ └── src/
│ │ └── crashpad-home/
│ │ ├── app.yaml
│ │ └── main.go
│ ├── developing.md
│ ├── ios_overview_design.md
│ ├── man.md
│ ├── overview_design.md
│ ├── status.md
│ └── support/
│ ├── compat.sh
│ ├── crashpad.doxy
│ ├── crashpad.doxy.h
│ ├── crashpad_doxygen.css
│ ├── generate.sh
│ ├── generate_doxygen.py
│ └── generate_git.sh
├── handler/
│ ├── BUILD.gn
│ ├── crash_report_upload_rate_limit.cc
│ ├── crash_report_upload_rate_limit.h
│ ├── crash_report_upload_rate_limit_test.cc
│ ├── crash_report_upload_thread.cc
│ ├── crash_report_upload_thread.h
│ ├── crashpad_handler.md
│ ├── crashpad_handler_main.cc
│ ├── crashpad_handler_test.cc
│ ├── crashpad_handler_test_extended_handler.cc
│ ├── handler_main.cc
│ ├── handler_main.h
│ ├── linux/
│ │ ├── capture_snapshot.cc
│ │ ├── capture_snapshot.h
│ │ ├── crash_report_exception_handler.cc
│ │ ├── crash_report_exception_handler.h
│ │ ├── cros_crash_report_exception_handler.cc
│ │ ├── cros_crash_report_exception_handler.h
│ │ ├── exception_handler_server.cc
│ │ ├── exception_handler_server.h
│ │ ├── exception_handler_server_test.cc
│ │ └── handler_trampoline.cc
│ ├── mac/
│ │ ├── crash_report_exception_handler.cc
│ │ ├── crash_report_exception_handler.h
│ │ ├── exception_handler_server.cc
│ │ ├── exception_handler_server.h
│ │ ├── file_limit_annotation.cc
│ │ └── file_limit_annotation.h
│ ├── main.cc
│ ├── minidump_to_upload_parameters.cc
│ ├── minidump_to_upload_parameters.h
│ ├── minidump_to_upload_parameters_test.cc
│ ├── prune_crash_reports_thread.cc
│ ├── prune_crash_reports_thread.h
│ ├── user_stream_data_source.cc
│ ├── user_stream_data_source.h
│ └── win/
│ ├── .gitattributes
│ ├── crash_other_program.cc
│ ├── crash_report_exception_handler.cc
│ ├── crash_report_exception_handler.h
│ ├── crashy_signal.cc
│ ├── crashy_test_program.cc
│ ├── crashy_test_z7_loader.cc
│ ├── fake_handler_that_crashes_at_startup.cc
│ ├── fastfail_test_program.cc
│ ├── hanging_program.cc
│ ├── heap_corrupting_program.cc
│ ├── loader_lock_dll.cc
│ ├── self_destroying_test_program.cc
│ ├── wer/
│ │ ├── BUILD.gn
│ │ ├── crashpad_wer.cc
│ │ ├── crashpad_wer.def
│ │ ├── crashpad_wer.h
│ │ ├── crashpad_wer.ver
│ │ ├── crashpad_wer_main.cc
│ │ └── crashpad_wer_module_unittest.cc
│ └── z7_test.cpp
├── infra/
│ └── config/
│ ├── PRESUBMIT.py
│ ├── generated/
│ │ ├── commit-queue.cfg
│ │ ├── cr-buildbucket.cfg
│ │ ├── luci-logdog.cfg
│ │ ├── luci-milo.cfg
│ │ ├── luci-scheduler.cfg
│ │ ├── project.cfg
│ │ └── realms.cfg
│ └── main.star
├── minidump/
│ ├── BUILD.gn
│ ├── minidump_annotation_writer.cc
│ ├── minidump_annotation_writer.h
│ ├── minidump_annotation_writer_test.cc
│ ├── minidump_byte_array_writer.cc
│ ├── minidump_byte_array_writer.h
│ ├── minidump_byte_array_writer_test.cc
│ ├── minidump_context.h
│ ├── minidump_context_writer.cc
│ ├── minidump_context_writer.h
│ ├── minidump_context_writer_test.cc
│ ├── minidump_crashpad_info_writer.cc
│ ├── minidump_crashpad_info_writer.h
│ ├── minidump_crashpad_info_writer_test.cc
│ ├── minidump_exception_writer.cc
│ ├── minidump_exception_writer.h
│ ├── minidump_exception_writer_test.cc
│ ├── minidump_extensions.cc
│ ├── minidump_extensions.h
│ ├── minidump_file_writer.cc
│ ├── minidump_file_writer.h
│ ├── minidump_file_writer_test.cc
│ ├── minidump_handle_writer.cc
│ ├── minidump_handle_writer.h
│ ├── minidump_handle_writer_test.cc
│ ├── minidump_memory_info_writer.cc
│ ├── minidump_memory_info_writer.h
│ ├── minidump_memory_info_writer_test.cc
│ ├── minidump_memory_writer.cc
│ ├── minidump_memory_writer.h
│ ├── minidump_memory_writer_test.cc
│ ├── minidump_misc_info_writer.cc
│ ├── minidump_misc_info_writer.h
│ ├── minidump_misc_info_writer_test.cc
│ ├── minidump_module_crashpad_info_writer.cc
│ ├── minidump_module_crashpad_info_writer.h
│ ├── minidump_module_crashpad_info_writer_test.cc
│ ├── minidump_module_writer.cc
│ ├── minidump_module_writer.h
│ ├── minidump_module_writer_test.cc
│ ├── minidump_rva_list_writer.cc
│ ├── minidump_rva_list_writer.h
│ ├── minidump_rva_list_writer_test.cc
│ ├── minidump_simple_string_dictionary_writer.cc
│ ├── minidump_simple_string_dictionary_writer.h
│ ├── minidump_simple_string_dictionary_writer_test.cc
│ ├── minidump_stream_writer.cc
│ ├── minidump_stream_writer.h
│ ├── minidump_string_writer.cc
│ ├── minidump_string_writer.h
│ ├── minidump_string_writer_test.cc
│ ├── minidump_system_info_writer.cc
│ ├── minidump_system_info_writer.h
│ ├── minidump_system_info_writer_test.cc
│ ├── minidump_thread_id_map.cc
│ ├── minidump_thread_id_map.h
│ ├── minidump_thread_id_map_test.cc
│ ├── minidump_thread_name_list_writer.cc
│ ├── minidump_thread_name_list_writer.h
│ ├── minidump_thread_name_list_writer_test.cc
│ ├── minidump_thread_writer.cc
│ ├── minidump_thread_writer.h
│ ├── minidump_thread_writer_test.cc
│ ├── minidump_unloaded_module_writer.cc
│ ├── minidump_unloaded_module_writer.h
│ ├── minidump_unloaded_module_writer_test.cc
│ ├── minidump_user_extension_stream_data_source.cc
│ ├── minidump_user_extension_stream_data_source.h
│ ├── minidump_user_stream_writer.cc
│ ├── minidump_user_stream_writer.h
│ ├── minidump_user_stream_writer_test.cc
│ ├── minidump_writable.cc
│ ├── minidump_writable.h
│ ├── minidump_writable_test.cc
│ ├── minidump_writer_util.cc
│ ├── minidump_writer_util.h
│ └── test/
│ ├── minidump_byte_array_writer_test_util.cc
│ ├── minidump_byte_array_writer_test_util.h
│ ├── minidump_context_test_util.cc
│ ├── minidump_context_test_util.h
│ ├── minidump_file_writer_test_util.cc
│ ├── minidump_file_writer_test_util.h
│ ├── minidump_memory_writer_test_util.cc
│ ├── minidump_memory_writer_test_util.h
│ ├── minidump_rva_list_test_util.cc
│ ├── minidump_rva_list_test_util.h
│ ├── minidump_string_writer_test_util.cc
│ ├── minidump_string_writer_test_util.h
│ ├── minidump_user_extension_stream_util.cc
│ ├── minidump_user_extension_stream_util.h
│ ├── minidump_writable_test_util.cc
│ └── minidump_writable_test_util.h
├── navbar.md
├── package.h
├── snapshot/
│ ├── BUILD.gn
│ ├── annotation_snapshot.cc
│ ├── annotation_snapshot.h
│ ├── capture_memory.cc
│ ├── capture_memory.h
│ ├── cpu_architecture.h
│ ├── cpu_context.cc
│ ├── cpu_context.h
│ ├── cpu_context_test.cc
│ ├── crashpad_info_client_options.cc
│ ├── crashpad_info_client_options.h
│ ├── crashpad_info_client_options_test.cc
│ ├── crashpad_info_client_options_test_module.cc
│ ├── crashpad_info_size_test_module.cc
│ ├── crashpad_info_size_test_note.S
│ ├── crashpad_types/
│ │ ├── crashpad_info_reader.cc
│ │ ├── crashpad_info_reader.h
│ │ ├── crashpad_info_reader_test.cc
│ │ ├── image_annotation_reader.cc
│ │ ├── image_annotation_reader.h
│ │ └── image_annotation_reader_test.cc
│ ├── elf/
│ │ ├── elf_dynamic_array_reader.cc
│ │ ├── elf_dynamic_array_reader.h
│ │ ├── elf_image_reader.cc
│ │ ├── elf_image_reader.h
│ │ ├── elf_image_reader_fuzzer.cc
│ │ ├── elf_image_reader_fuzzer_corpus/
│ │ │ ├── .gitattributes
│ │ │ └── ret42
│ │ ├── elf_image_reader_test.cc
│ │ ├── elf_image_reader_test_note.S
│ │ ├── elf_symbol_table_reader.cc
│ │ ├── elf_symbol_table_reader.h
│ │ ├── module_snapshot_elf.cc
│ │ ├── module_snapshot_elf.h
│ │ └── test_exported_symbols.sym
│ ├── exception_snapshot.h
│ ├── fuchsia/
│ │ ├── cpu_context_fuchsia.cc
│ │ ├── cpu_context_fuchsia.h
│ │ ├── exception_snapshot_fuchsia.cc
│ │ ├── exception_snapshot_fuchsia.h
│ │ ├── memory_map_fuchsia.cc
│ │ ├── memory_map_fuchsia.h
│ │ ├── memory_map_region_snapshot_fuchsia.cc
│ │ ├── memory_map_region_snapshot_fuchsia.h
│ │ ├── process_reader_fuchsia.cc
│ │ ├── process_reader_fuchsia.h
│ │ ├── process_reader_fuchsia_test.cc
│ │ ├── process_snapshot_fuchsia.cc
│ │ ├── process_snapshot_fuchsia.h
│ │ ├── process_snapshot_fuchsia_test.cc
│ │ ├── system_snapshot_fuchsia.cc
│ │ ├── system_snapshot_fuchsia.h
│ │ ├── thread_snapshot_fuchsia.cc
│ │ └── thread_snapshot_fuchsia.h
│ ├── handle_snapshot.cc
│ ├── handle_snapshot.h
│ ├── hash_types_test.cc
│ ├── ios/
│ │ ├── exception_snapshot_ios_intermediate_dump.cc
│ │ ├── exception_snapshot_ios_intermediate_dump.h
│ │ ├── intermediate_dump_reader_util.cc
│ │ ├── intermediate_dump_reader_util.h
│ │ ├── memory_snapshot_ios_intermediate_dump.cc
│ │ ├── memory_snapshot_ios_intermediate_dump.h
│ │ ├── memory_snapshot_ios_intermediate_dump_test.cc
│ │ ├── module_snapshot_ios_intermediate_dump.cc
│ │ ├── module_snapshot_ios_intermediate_dump.h
│ │ ├── process_snapshot_ios_intermediate_dump.cc
│ │ ├── process_snapshot_ios_intermediate_dump.h
│ │ ├── process_snapshot_ios_intermediate_dump_test.cc
│ │ ├── system_snapshot_ios_intermediate_dump.cc
│ │ ├── system_snapshot_ios_intermediate_dump.h
│ │ ├── testdata/
│ │ │ ├── crash-1fa088dda0adb41459d063078a0f384a0bb8eefa
│ │ │ ├── crash-5726011582644224
│ │ │ ├── crash-6605504629637120
│ │ │ └── crash-c44acfcbccd8c7a8
│ │ ├── thread_snapshot_ios_intermediate_dump.cc
│ │ └── thread_snapshot_ios_intermediate_dump.h
│ ├── linux/
│ │ ├── capture_memory_delegate_linux.cc
│ │ ├── capture_memory_delegate_linux.h
│ │ ├── cpu_context_linux.cc
│ │ ├── cpu_context_linux.h
│ │ ├── debug_rendezvous.cc
│ │ ├── debug_rendezvous.h
│ │ ├── debug_rendezvous_test.cc
│ │ ├── exception_snapshot_linux.cc
│ │ ├── exception_snapshot_linux.h
│ │ ├── exception_snapshot_linux_test.cc
│ │ ├── process_reader_linux.cc
│ │ ├── process_reader_linux.h
│ │ ├── process_reader_linux_test.cc
│ │ ├── process_snapshot_linux.cc
│ │ ├── process_snapshot_linux.h
│ │ ├── signal_context.h
│ │ ├── system_snapshot_linux.cc
│ │ ├── system_snapshot_linux.h
│ │ ├── system_snapshot_linux_test.cc
│ │ ├── test_modules.cc
│ │ ├── test_modules.h
│ │ ├── thread_snapshot_linux.cc
│ │ └── thread_snapshot_linux.h
│ ├── mac/
│ │ ├── cpu_context_mac.cc
│ │ ├── cpu_context_mac.h
│ │ ├── cpu_context_mac_test.cc
│ │ ├── exception_snapshot_mac.cc
│ │ ├── exception_snapshot_mac.h
│ │ ├── mach_o_image_annotations_reader.cc
│ │ ├── mach_o_image_annotations_reader.h
│ │ ├── mach_o_image_annotations_reader_test.cc
│ │ ├── mach_o_image_annotations_reader_test_module_crashy_initializer.cc
│ │ ├── mach_o_image_annotations_reader_test_no_op.cc
│ │ ├── mach_o_image_reader.cc
│ │ ├── mach_o_image_reader.h
│ │ ├── mach_o_image_reader_test.cc
│ │ ├── mach_o_image_segment_reader.cc
│ │ ├── mach_o_image_segment_reader.h
│ │ ├── mach_o_image_segment_reader_test.cc
│ │ ├── mach_o_image_symbol_table_reader.cc
│ │ ├── mach_o_image_symbol_table_reader.h
│ │ ├── module_snapshot_mac.cc
│ │ ├── module_snapshot_mac.h
│ │ ├── process_reader_mac.cc
│ │ ├── process_reader_mac.h
│ │ ├── process_reader_mac_test.cc
│ │ ├── process_snapshot_mac.cc
│ │ ├── process_snapshot_mac.h
│ │ ├── process_types/
│ │ │ ├── all.proctype
│ │ │ ├── annotation.proctype
│ │ │ ├── crashpad_info.proctype
│ │ │ ├── crashreporterclient.proctype
│ │ │ ├── custom.cc
│ │ │ ├── dyld_images.proctype
│ │ │ ├── flavors.h
│ │ │ ├── internal.h
│ │ │ ├── loader.proctype
│ │ │ ├── nlist.proctype
│ │ │ └── traits.h
│ │ ├── process_types.cc
│ │ ├── process_types.h
│ │ ├── process_types_test.cc
│ │ ├── system_snapshot_mac.cc
│ │ ├── system_snapshot_mac.h
│ │ ├── system_snapshot_mac_test.cc
│ │ ├── thread_snapshot_mac.cc
│ │ └── thread_snapshot_mac.h
│ ├── memory_map_region_snapshot.h
│ ├── memory_snapshot.cc
│ ├── memory_snapshot.h
│ ├── memory_snapshot_generic.h
│ ├── memory_snapshot_test.cc
│ ├── minidump/
│ │ ├── exception_snapshot_minidump.cc
│ │ ├── exception_snapshot_minidump.h
│ │ ├── memory_snapshot_minidump.cc
│ │ ├── memory_snapshot_minidump.h
│ │ ├── minidump_annotation_reader.cc
│ │ ├── minidump_annotation_reader.h
│ │ ├── minidump_context_converter.cc
│ │ ├── minidump_context_converter.h
│ │ ├── minidump_simple_string_dictionary_reader.cc
│ │ ├── minidump_simple_string_dictionary_reader.h
│ │ ├── minidump_stream.h
│ │ ├── minidump_string_list_reader.cc
│ │ ├── minidump_string_list_reader.h
│ │ ├── minidump_string_reader.cc
│ │ ├── minidump_string_reader.h
│ │ ├── module_snapshot_minidump.cc
│ │ ├── module_snapshot_minidump.h
│ │ ├── process_snapshot_minidump.cc
│ │ ├── process_snapshot_minidump.h
│ │ ├── process_snapshot_minidump_test.cc
│ │ ├── system_snapshot_minidump.cc
│ │ ├── system_snapshot_minidump.h
│ │ ├── thread_snapshot_minidump.cc
│ │ └── thread_snapshot_minidump.h
│ ├── module_snapshot.h
│ ├── posix/
│ │ ├── timezone.cc
│ │ ├── timezone.h
│ │ └── timezone_test.cc
│ ├── process_snapshot.h
│ ├── sanitized/
│ │ ├── memory_snapshot_sanitized.cc
│ │ ├── memory_snapshot_sanitized.h
│ │ ├── module_snapshot_sanitized.cc
│ │ ├── module_snapshot_sanitized.h
│ │ ├── process_snapshot_sanitized.cc
│ │ ├── process_snapshot_sanitized.h
│ │ ├── process_snapshot_sanitized_test.cc
│ │ ├── sanitization_information.cc
│ │ ├── sanitization_information.h
│ │ ├── sanitization_information_test.cc
│ │ ├── thread_snapshot_sanitized.cc
│ │ └── thread_snapshot_sanitized.h
│ ├── snapshot_constants.h
│ ├── system_snapshot.h
│ ├── test/
│ │ ├── test_cpu_context.cc
│ │ ├── test_cpu_context.h
│ │ ├── test_exception_snapshot.cc
│ │ ├── test_exception_snapshot.h
│ │ ├── test_memory_map_region_snapshot.cc
│ │ ├── test_memory_map_region_snapshot.h
│ │ ├── test_memory_snapshot.cc
│ │ ├── test_memory_snapshot.h
│ │ ├── test_module_snapshot.cc
│ │ ├── test_module_snapshot.h
│ │ ├── test_process_snapshot.cc
│ │ ├── test_process_snapshot.h
│ │ ├── test_system_snapshot.cc
│ │ ├── test_system_snapshot.h
│ │ ├── test_thread_snapshot.cc
│ │ └── test_thread_snapshot.h
│ ├── thread_snapshot.h
│ ├── unloaded_module_snapshot.cc
│ ├── unloaded_module_snapshot.h
│ ├── win/
│ │ ├── capture_memory_delegate_win.cc
│ │ ├── capture_memory_delegate_win.h
│ │ ├── cpu_context_win.cc
│ │ ├── cpu_context_win.h
│ │ ├── cpu_context_win_test.cc
│ │ ├── crashpad_snapshot_test_annotations.cc
│ │ ├── crashpad_snapshot_test_crashing_child.cc
│ │ ├── crashpad_snapshot_test_dump_without_crashing.cc
│ │ ├── crashpad_snapshot_test_extra_memory_ranges.cc
│ │ ├── crashpad_snapshot_test_image_reader.cc
│ │ ├── crashpad_snapshot_test_image_reader_module.cc
│ │ ├── end_to_end_test.py
│ │ ├── exception_snapshot_win.cc
│ │ ├── exception_snapshot_win.h
│ │ ├── exception_snapshot_win_test.cc
│ │ ├── extra_memory_ranges_test.cc
│ │ ├── memory_map_region_snapshot_win.cc
│ │ ├── memory_map_region_snapshot_win.h
│ │ ├── module_snapshot_win.cc
│ │ ├── module_snapshot_win.h
│ │ ├── module_snapshot_win_test.cc
│ │ ├── pe_image_annotations_reader.cc
│ │ ├── pe_image_annotations_reader.h
│ │ ├── pe_image_reader.cc
│ │ ├── pe_image_reader.h
│ │ ├── pe_image_reader_test.cc
│ │ ├── pe_image_resource_reader.cc
│ │ ├── pe_image_resource_reader.h
│ │ ├── process_reader_win.cc
│ │ ├── process_reader_win.h
│ │ ├── process_reader_win_test.cc
│ │ ├── process_snapshot_win.cc
│ │ ├── process_snapshot_win.h
│ │ ├── process_snapshot_win_test.cc
│ │ ├── process_subrange_reader.cc
│ │ ├── process_subrange_reader.h
│ │ ├── system_snapshot_win.cc
│ │ ├── system_snapshot_win.h
│ │ ├── system_snapshot_win_test.cc
│ │ ├── thread_snapshot_win.cc
│ │ └── thread_snapshot_win.h
│ └── x86/
│ ├── cpuid_reader.cc
│ └── cpuid_reader.h
├── test/
│ ├── BUILD.gn
│ ├── errors.cc
│ ├── errors.h
│ ├── file.cc
│ ├── file.h
│ ├── filesystem.cc
│ ├── filesystem.h
│ ├── fuchsia_crashpad_tests.cml
│ ├── gtest_death.h
│ ├── gtest_main.cc
│ ├── hex_string.cc
│ ├── hex_string.h
│ ├── hex_string_test.cc
│ ├── ios/
│ │ ├── BUILD.gn
│ │ ├── cptest_google_test_runner.mm
│ │ ├── cptest_google_test_runner_delegate.h
│ │ ├── crash_type_xctest.mm
│ │ ├── google_test_setup.h
│ │ ├── google_test_setup.mm
│ │ └── host/
│ │ ├── BUILD.gn
│ │ ├── Info.plist
│ │ ├── cptest_application_delegate.h
│ │ ├── cptest_application_delegate.mm
│ │ ├── cptest_crash_view_controller.h
│ │ ├── cptest_crash_view_controller.mm
│ │ ├── cptest_shared_object.h
│ │ ├── handler_forbidden_allocators.cc
│ │ ├── handler_forbidden_allocators.h
│ │ └── main.mm
│ ├── linux/
│ │ ├── fake_ptrace_connection.cc
│ │ ├── fake_ptrace_connection.h
│ │ ├── get_tls.cc
│ │ └── get_tls.h
│ ├── mac/
│ │ ├── dyld.cc
│ │ ├── dyld.h
│ │ ├── exception_swallower.cc
│ │ ├── exception_swallower.h
│ │ ├── mach_errors.cc
│ │ ├── mach_errors.h
│ │ ├── mach_multiprocess.cc
│ │ ├── mach_multiprocess.h
│ │ └── mach_multiprocess_test.cc
│ ├── main_arguments.cc
│ ├── main_arguments.h
│ ├── main_arguments_test.cc
│ ├── multiprocess.h
│ ├── multiprocess_exec.cc
│ ├── multiprocess_exec.h
│ ├── multiprocess_exec_fuchsia.cc
│ ├── multiprocess_exec_posix.cc
│ ├── multiprocess_exec_test.cc
│ ├── multiprocess_exec_test_child.cc
│ ├── multiprocess_exec_win.cc
│ ├── multiprocess_posix.cc
│ ├── multiprocess_posix_test.cc
│ ├── process_type.cc
│ ├── process_type.h
│ ├── scoped_guarded_page.h
│ ├── scoped_guarded_page_posix.cc
│ ├── scoped_guarded_page_test.cc
│ ├── scoped_guarded_page_win.cc
│ ├── scoped_module_handle.cc
│ ├── scoped_module_handle.h
│ ├── scoped_set_thread_name.h
│ ├── scoped_set_thread_name_fuchsia.cc
│ ├── scoped_set_thread_name_posix.cc
│ ├── scoped_set_thread_name_win.cc
│ ├── scoped_temp_dir.cc
│ ├── scoped_temp_dir.h
│ ├── scoped_temp_dir_posix.cc
│ ├── scoped_temp_dir_test.cc
│ ├── scoped_temp_dir_win.cc
│ ├── test_paths.cc
│ ├── test_paths.h
│ ├── test_paths_test.cc
│ ├── test_paths_test_data_root.txt
│ └── win/
│ ├── child_launcher.cc
│ ├── child_launcher.h
│ ├── win_child_process.cc
│ ├── win_child_process.h
│ ├── win_child_process_test.cc
│ ├── win_multiprocess.cc
│ ├── win_multiprocess.h
│ ├── win_multiprocess_test.cc
│ ├── win_multiprocess_with_temp_dir.cc
│ └── win_multiprocess_with_temp_dir.h
├── third_party/
│ ├── cpp-httplib/
│ │ ├── BUILD.gn
│ │ ├── README.crashpad
│ │ └── cpp-httplib/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── httplib.h
│ ├── edo/
│ │ ├── BUILD.gn
│ │ └── README.crashpad
│ ├── fuchsia/
│ │ ├── BUILD.gn
│ │ ├── README.crashpad
│ │ └── runner.py
│ ├── getopt/
│ │ ├── BUILD.gn
│ │ ├── LICENSE
│ │ ├── README.crashpad
│ │ ├── getopt.cc
│ │ └── getopt.h
│ ├── googletest/
│ │ ├── BUILD.gn
│ │ └── README.crashpad
│ ├── linux/
│ │ └── README.md
│ ├── lss/
│ │ ├── BUILD.gn
│ │ ├── README.crashpad
│ │ └── lss.h
│ ├── mini_chromium/
│ │ ├── BUILD.gn
│ │ └── README.crashpad
│ ├── ninja/
│ │ ├── README.crashpad
│ │ └── ninja
│ ├── xnu/
│ │ ├── APPLE_LICENSE
│ │ ├── BUILD.gn
│ │ ├── EXTERNAL_HEADERS/
│ │ │ └── mach-o/
│ │ │ └── loader.h
│ │ ├── README.crashpad
│ │ └── osfmk/
│ │ └── mach/
│ │ ├── exc.defs
│ │ ├── mach_exc.defs
│ │ ├── mach_types.defs
│ │ ├── machine/
│ │ │ └── machine_types.defs
│ │ └── std_types.defs
│ └── zlib/
│ ├── BUILD.gn
│ ├── README.crashpad
│ └── zlib_crashpad.h
├── tools/
│ ├── BUILD.gn
│ ├── base94_encoder.cc
│ ├── base94_encoder.md
│ ├── crashpad_database_util.cc
│ ├── crashpad_database_util.md
│ ├── crashpad_http_upload.cc
│ ├── crashpad_http_upload.md
│ ├── dump_minidump_annotations.cc
│ ├── generate_dump.cc
│ ├── generate_dump.md
│ ├── mac/
│ │ ├── catch_exception_tool.cc
│ │ ├── catch_exception_tool.md
│ │ ├── exception_port_tool.cc
│ │ ├── exception_port_tool.md
│ │ ├── on_demand_service_tool.md
│ │ ├── on_demand_service_tool.mm
│ │ └── sectaskaccess_info.plist
│ ├── run_with_crashpad.cc
│ ├── run_with_crashpad.md
│ ├── tool_support.cc
│ └── tool_support.h
└── util/
├── BUILD.gn
├── file/
│ ├── delimited_file_reader.cc
│ ├── delimited_file_reader.h
│ ├── delimited_file_reader_test.cc
│ ├── directory_reader.h
│ ├── directory_reader_posix.cc
│ ├── directory_reader_test.cc
│ ├── directory_reader_win.cc
│ ├── file_helper.cc
│ ├── file_helper.h
│ ├── file_io.cc
│ ├── file_io.h
│ ├── file_io_posix.cc
│ ├── file_io_test.cc
│ ├── file_io_win.cc
│ ├── file_reader.cc
│ ├── file_reader.h
│ ├── file_reader_test.cc
│ ├── file_seeker.cc
│ ├── file_seeker.h
│ ├── file_writer.cc
│ ├── file_writer.h
│ ├── filesystem.h
│ ├── filesystem_posix.cc
│ ├── filesystem_test.cc
│ ├── filesystem_win.cc
│ ├── output_stream_file_writer.cc
│ ├── output_stream_file_writer.h
│ ├── scoped_remove_file.cc
│ ├── scoped_remove_file.h
│ ├── string_file.cc
│ ├── string_file.h
│ └── string_file_test.cc
├── fuchsia/
│ ├── koid_utilities.cc
│ ├── koid_utilities.h
│ ├── scoped_task_suspend.cc
│ ├── scoped_task_suspend.h
│ └── traits.h
├── ios/
│ ├── ios_intermediate_dump_data.cc
│ ├── ios_intermediate_dump_data.h
│ ├── ios_intermediate_dump_format.h
│ ├── ios_intermediate_dump_interface.cc
│ ├── ios_intermediate_dump_interface.h
│ ├── ios_intermediate_dump_list.cc
│ ├── ios_intermediate_dump_list.h
│ ├── ios_intermediate_dump_map.cc
│ ├── ios_intermediate_dump_map.h
│ ├── ios_intermediate_dump_object.cc
│ ├── ios_intermediate_dump_object.h
│ ├── ios_intermediate_dump_reader.cc
│ ├── ios_intermediate_dump_reader.h
│ ├── ios_intermediate_dump_reader_test.cc
│ ├── ios_intermediate_dump_writer.cc
│ ├── ios_intermediate_dump_writer.h
│ ├── ios_intermediate_dump_writer_test.cc
│ ├── ios_system_data_collector.h
│ ├── ios_system_data_collector.mm
│ ├── raw_logging.cc
│ ├── raw_logging.h
│ ├── scoped_background_task.h
│ ├── scoped_background_task.mm
│ ├── scoped_vm_map.cc
│ ├── scoped_vm_map.h
│ ├── scoped_vm_map_test.cc
│ ├── scoped_vm_read.cc
│ ├── scoped_vm_read.h
│ └── scoped_vm_read_test.cc
├── linux/
│ ├── address_types.h
│ ├── auxiliary_vector.cc
│ ├── auxiliary_vector.h
│ ├── auxiliary_vector_test.cc
│ ├── checked_linux_address_range.h
│ ├── direct_ptrace_connection.cc
│ ├── direct_ptrace_connection.h
│ ├── exception_handler_client.cc
│ ├── exception_handler_client.h
│ ├── exception_handler_protocol.cc
│ ├── exception_handler_protocol.h
│ ├── exception_information.h
│ ├── initial_signal_dispositions.cc
│ ├── initial_signal_dispositions.h
│ ├── memory_map.cc
│ ├── memory_map.h
│ ├── memory_map_test.cc
│ ├── pac_helper.cc
│ ├── pac_helper.h
│ ├── proc_stat_reader.cc
│ ├── proc_stat_reader.h
│ ├── proc_stat_reader_test.cc
│ ├── proc_task_reader.cc
│ ├── proc_task_reader.h
│ ├── proc_task_reader_test.cc
│ ├── ptrace_broker.cc
│ ├── ptrace_broker.h
│ ├── ptrace_broker_test.cc
│ ├── ptrace_client.cc
│ ├── ptrace_client.h
│ ├── ptrace_connection.h
│ ├── ptracer.cc
│ ├── ptracer.h
│ ├── ptracer_test.cc
│ ├── scoped_pr_set_dumpable.cc
│ ├── scoped_pr_set_dumpable.h
│ ├── scoped_pr_set_ptracer.cc
│ ├── scoped_pr_set_ptracer.h
│ ├── scoped_ptrace_attach.cc
│ ├── scoped_ptrace_attach.h
│ ├── scoped_ptrace_attach_test.cc
│ ├── socket.cc
│ ├── socket.h
│ ├── socket_test.cc
│ ├── thread_info.cc
│ ├── thread_info.h
│ └── traits.h
├── mac/
│ ├── checked_mach_address_range.h
│ ├── checked_mach_address_range_test.cc
│ ├── launchd.h
│ ├── launchd.mm
│ ├── launchd_test.mm
│ ├── mac_util.cc
│ ├── mac_util.h
│ ├── mac_util_test.mm
│ ├── service_management.cc
│ ├── service_management.h
│ ├── service_management_test.mm
│ ├── sysctl.cc
│ ├── sysctl.h
│ ├── sysctl_test.cc
│ ├── xattr.cc
│ ├── xattr.h
│ └── xattr_test.cc
├── mach/
│ ├── bootstrap.cc
│ ├── bootstrap.h
│ ├── bootstrap_test.cc
│ ├── child_port.defs
│ ├── child_port_handshake.cc
│ ├── child_port_handshake.h
│ ├── child_port_handshake_test.cc
│ ├── child_port_server.cc
│ ├── child_port_server.h
│ ├── child_port_server_test.cc
│ ├── child_port_types.h
│ ├── composite_mach_message_server.cc
│ ├── composite_mach_message_server.h
│ ├── composite_mach_message_server_test.cc
│ ├── exc_client_variants.cc
│ ├── exc_client_variants.h
│ ├── exc_client_variants_test.cc
│ ├── exc_server_variants.cc
│ ├── exc_server_variants.h
│ ├── exc_server_variants_test.cc
│ ├── exception_behaviors.cc
│ ├── exception_behaviors.h
│ ├── exception_behaviors_test.cc
│ ├── exception_ports.cc
│ ├── exception_ports.h
│ ├── exception_ports_test.cc
│ ├── exception_types.cc
│ ├── exception_types.h
│ ├── exception_types_test.cc
│ ├── mach_extensions.cc
│ ├── mach_extensions.h
│ ├── mach_extensions_test.cc
│ ├── mach_message.cc
│ ├── mach_message.h
│ ├── mach_message_server.cc
│ ├── mach_message_server.h
│ ├── mach_message_server_test.cc
│ ├── mach_message_test.cc
│ ├── mig.py
│ ├── mig_fix.py
│ ├── mig_gen.py
│ ├── notify_server.cc
│ ├── notify_server.h
│ ├── notify_server_test.cc
│ ├── scoped_task_suspend.cc
│ ├── scoped_task_suspend.h
│ ├── scoped_task_suspend_test.cc
│ ├── symbolic_constants_mach.cc
│ ├── symbolic_constants_mach.h
│ ├── symbolic_constants_mach_test.cc
│ ├── task_for_pid.cc
│ └── task_for_pid.h
├── misc/
│ ├── address_sanitizer.h
│ ├── address_types.h
│ ├── arm64_pac_bti.S
│ ├── arraysize.h
│ ├── arraysize_test.cc
│ ├── as_underlying_type.h
│ ├── capture_context.h
│ ├── capture_context_linux.S
│ ├── capture_context_mac.S
│ ├── capture_context_test.cc
│ ├── capture_context_test_util.h
│ ├── capture_context_test_util_linux.cc
│ ├── capture_context_test_util_mac.cc
│ ├── capture_context_test_util_win.cc
│ ├── capture_context_win.asm
│ ├── capture_context_win_arm64.asm
│ ├── capture_context_win_arm64.obj
│ ├── clock.h
│ ├── clock_mac.cc
│ ├── clock_posix.cc
│ ├── clock_test.cc
│ ├── clock_win.cc
│ ├── elf_note_types.h
│ ├── from_pointer_cast.h
│ ├── from_pointer_cast_test.cc
│ ├── implicit_cast.h
│ ├── initialization_state.h
│ ├── initialization_state_dcheck.cc
│ ├── initialization_state_dcheck.h
│ ├── initialization_state_dcheck_test.cc
│ ├── initialization_state_test.cc
│ ├── lexing.cc
│ ├── lexing.h
│ ├── memory_sanitizer.h
│ ├── metrics.cc
│ ├── metrics.h
│ ├── no_cfi_icall.h
│ ├── no_cfi_icall_test.cc
│ ├── paths.h
│ ├── paths_fuchsia.cc
│ ├── paths_linux.cc
│ ├── paths_mac.cc
│ ├── paths_test.cc
│ ├── paths_win.cc
│ ├── pdb_structures.cc
│ ├── pdb_structures.h
│ ├── random_string.cc
│ ├── random_string.h
│ ├── random_string_test.cc
│ ├── range_set.cc
│ ├── range_set.h
│ ├── range_set_test.cc
│ ├── reinterpret_bytes.cc
│ ├── reinterpret_bytes.h
│ ├── reinterpret_bytes_test.cc
│ ├── scoped_forbid_return.cc
│ ├── scoped_forbid_return.h
│ ├── scoped_forbid_return_test.cc
│ ├── symbolic_constants_common.h
│ ├── time.cc
│ ├── time.h
│ ├── time_linux.cc
│ ├── time_test.cc
│ ├── time_win.cc
│ ├── tri_state.h
│ ├── uuid.cc
│ ├── uuid.h
│ ├── uuid_test.cc
│ ├── zlib.cc
│ └── zlib.h
├── net/
│ ├── generate_test_server_key.py
│ ├── http_body.cc
│ ├── http_body.h
│ ├── http_body_gzip.cc
│ ├── http_body_gzip.h
│ ├── http_body_gzip_test.cc
│ ├── http_body_test.cc
│ ├── http_body_test_util.cc
│ ├── http_body_test_util.h
│ ├── http_headers.h
│ ├── http_multipart_builder.cc
│ ├── http_multipart_builder.h
│ ├── http_multipart_builder_test.cc
│ ├── http_transport.cc
│ ├── http_transport.h
│ ├── http_transport_libcurl.cc
│ ├── http_transport_mac.mm
│ ├── http_transport_socket.cc
│ ├── http_transport_test.cc
│ ├── http_transport_test_server.cc
│ ├── http_transport_win.cc
│ ├── testdata/
│ │ ├── ascii_http_body.txt
│ │ ├── crashpad_util_test_cert.pem
│ │ └── crashpad_util_test_key.pem
│ ├── tls.gni
│ ├── url.cc
│ ├── url.h
│ └── url_test.cc
├── numeric/
│ ├── checked_address_range.cc
│ ├── checked_address_range.h
│ ├── checked_address_range_test.cc
│ ├── checked_range.h
│ ├── checked_range_test.cc
│ ├── checked_vm_address_range.h
│ ├── in_range_cast.h
│ ├── in_range_cast_test.cc
│ ├── int128.h
│ ├── int128_test.cc
│ └── safe_assignment.h
├── posix/
│ ├── close_multiple.cc
│ ├── close_multiple.h
│ ├── close_stdio.cc
│ ├── close_stdio.h
│ ├── drop_privileges.cc
│ ├── drop_privileges.h
│ ├── process_info.h
│ ├── process_info_linux.cc
│ ├── process_info_mac.cc
│ ├── process_info_test.cc
│ ├── scoped_dir.cc
│ ├── scoped_dir.h
│ ├── scoped_mmap.cc
│ ├── scoped_mmap.h
│ ├── scoped_mmap_test.cc
│ ├── signals.cc
│ ├── signals.h
│ ├── signals_test.cc
│ ├── spawn_subprocess.cc
│ ├── spawn_subprocess.h
│ ├── symbolic_constants_posix.cc
│ ├── symbolic_constants_posix.h
│ └── symbolic_constants_posix_test.cc
├── process/
│ ├── process_id.h
│ ├── process_memory.cc
│ ├── process_memory.h
│ ├── process_memory_fuchsia.cc
│ ├── process_memory_fuchsia.h
│ ├── process_memory_linux.cc
│ ├── process_memory_linux.h
│ ├── process_memory_mac.cc
│ ├── process_memory_mac.h
│ ├── process_memory_mac_test.cc
│ ├── process_memory_native.h
│ ├── process_memory_range.cc
│ ├── process_memory_range.h
│ ├── process_memory_range_test.cc
│ ├── process_memory_sanitized.cc
│ ├── process_memory_sanitized.h
│ ├── process_memory_sanitized_test.cc
│ ├── process_memory_test.cc
│ ├── process_memory_win.cc
│ └── process_memory_win.h
├── stdlib/
│ ├── aligned_allocator.cc
│ ├── aligned_allocator.h
│ ├── aligned_allocator_test.cc
│ ├── map_insert.h
│ ├── map_insert_test.cc
│ ├── objc.h
│ ├── string_number_conversion.cc
│ ├── string_number_conversion.h
│ ├── string_number_conversion_test.cc
│ ├── strlcpy.cc
│ ├── strlcpy.h
│ ├── strlcpy_test.cc
│ ├── strnlen.cc
│ ├── strnlen.h
│ ├── strnlen_test.cc
│ ├── thread_safe_vector.h
│ └── thread_safe_vector_test.cc
├── stream/
│ ├── base94_output_stream.cc
│ ├── base94_output_stream.h
│ ├── base94_output_stream_test.cc
│ ├── file_encoder.cc
│ ├── file_encoder.h
│ ├── file_encoder_test.cc
│ ├── file_output_stream.cc
│ ├── file_output_stream.h
│ ├── log_output_stream.cc
│ ├── log_output_stream.h
│ ├── log_output_stream_test.cc
│ ├── output_stream_interface.h
│ ├── test_output_stream.cc
│ ├── test_output_stream.h
│ ├── zlib_output_stream.cc
│ ├── zlib_output_stream.h
│ └── zlib_output_stream_test.cc
├── string/
│ ├── split_string.cc
│ ├── split_string.h
│ └── split_string_test.cc
├── synchronization/
│ ├── scoped_spin_guard.h
│ ├── scoped_spin_guard_test.cc
│ ├── semaphore.h
│ ├── semaphore_mac.cc
│ ├── semaphore_posix.cc
│ ├── semaphore_test.cc
│ └── semaphore_win.cc
├── thread/
│ ├── stoppable.h
│ ├── thread.cc
│ ├── thread.h
│ ├── thread_log_messages.cc
│ ├── thread_log_messages.h
│ ├── thread_log_messages_test.cc
│ ├── thread_posix.cc
│ ├── thread_test.cc
│ ├── thread_win.cc
│ ├── worker_thread.cc
│ ├── worker_thread.h
│ └── worker_thread_test.cc
└── win/
├── address_types.h
├── checked_win_address_range.h
├── command_line.cc
├── command_line.h
├── command_line_test.cc
├── context_wrappers.h
├── critical_section_with_debug_info.cc
├── critical_section_with_debug_info.h
├── critical_section_with_debug_info_test.cc
├── exception_codes.h
├── exception_handler_server.cc
├── exception_handler_server.h
├── exception_handler_server_test.cc
├── get_function.cc
├── get_function.h
├── get_function_test.cc
├── get_module_information.cc
├── get_module_information.h
├── handle.cc
├── handle.h
├── handle_test.cc
├── initial_client_data.cc
├── initial_client_data.h
├── initial_client_data_test.cc
├── loader_lock.cc
├── loader_lock.h
├── loader_lock_test.cc
├── loader_lock_test_dll.cc
├── module_version.cc
├── module_version.h
├── nt_internals.cc
├── nt_internals.h
├── ntstatus_logging.cc
├── ntstatus_logging.h
├── process_info.cc
├── process_info.h
├── process_info_test.cc
├── process_info_test_child.cc
├── process_structs.h
├── registration_protocol_win.cc
├── registration_protocol_win.h
├── registration_protocol_win_structs.h
├── registration_protocol_win_test.cc
├── safe_terminate_process.asm
├── safe_terminate_process.h
├── safe_terminate_process_test.cc
├── safe_terminate_process_test_child.cc
├── scoped_handle.cc
├── scoped_handle.h
├── scoped_local_alloc.cc
├── scoped_local_alloc.h
├── scoped_process_suspend.cc
├── scoped_process_suspend.h
├── scoped_process_suspend_test.cc
├── scoped_registry_key.h
├── scoped_set_event.cc
├── scoped_set_event.h
├── session_end_watcher.cc
├── session_end_watcher.h
├── session_end_watcher_test.cc
├── termination_codes.h
├── traits.h
└── xp_compat.h
================================================
FILE CONTENTS
================================================
================================================
FILE: .clang-format
================================================
# Copyright 2014 The Crashpad Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
{
BasedOnStyle: Chromium,
AlignTrailingComments: false,
BinPackArguments: false,
}
================================================
FILE: .gitattributes
================================================
# Copyright 2019 The Crashpad Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
*.S text eol=lf
*.asm text eol=lf
*.c text eol=lf
*.cc text eol=lf
*.cmx text eol=lf
*.css text eol=lf
*.defs text eol=lf
*.doxy text eol=lf
*.gn text eol=lf
*.gni text eol=lf
*.go text eol=lf
*.h text eol=lf
*.m text eol=lf
*.md text eol=lf
*.mm text eol=lf
*.pem text eol=lf
*.plist text eol=lf
*.proctype text eol=lf
*.py text eol=lf
*.sh text eol=lf
*.sym text eol=lf
*.txt text eol=lf
*.yaml text eol=lf
.clang-format text eol=lf
.gitattributes text eol=lf
.gitignore text eol=lf
.vpython text eol=lf
/AUTHORS text eol=lf
/CONTRIBUTORS text eol=lf
/LICENSE text eol=lf
/codereview.settings text eol=lf
APPLE_LICENSE text eol=lf
COPYING.LIB text eol=lf
DEPS text eol=lf
README text eol=lf
README.crashpad text eol=lf
*.dat binary
*.dll binary
*.ico binary
*.obj binary
*.png binary
*.so binary
================================================
FILE: .gitignore
================================================
# Copyright 2014 The Crashpad Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Keep sorted
*.Makefile
*.ninja
*.pyc
*.target.mk
*.xcodeproj
*~
.*.sw?
.DS_Store
.cache
.gdb_history
.gdbinit
/.vscode/
/Makefile
/build/fuchsia
/out
/third_party/edo/edo
/third_party/fuchsia-gn-sdk
/third_party/fuchsia/.cipd
/third_party/fuchsia/clang
/third_party/fuchsia/qemu
/third_party/fuchsia/sdk
/third_party/googletest/googletest
/third_party/libfuzzer
/third_party/linux/.cipd
/third_party/linux/clang
/third_party/linux/sysroot
/third_party/lss/lss
/third_party/mini_chromium/mini_chromium
/third_party/ninja/linux
/third_party/ninja/mac*
/third_party/ninja/ninja.exe
/third_party/windows/clang/win-amd64
/third_party/zlib/zlib
/xcodebuild
tags
================================================
FILE: .gn
================================================
# Copyright 2017 The Crashpad Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
buildconfig = "//build/BUILDCONFIG.gn"
script_executable = "python3"
================================================
FILE: .style.yapf
================================================
# Copyright 2020 The Crashpad Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
[style]
based_on_style = google
================================================
FILE: .vpython3
================================================
# Copyright 2022 The Crashpad Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# This is a vpython "spec" file.
#
# It describes patterns for python wheel dependencies of the python scripts.
#
# Read more about `vpython` and how to modify this file here:
# https://chromium.googlesource.com/infra/infra/+/master/doc/users/vpython.md
# This is needed for snapshot/win/end_to_end_test.py.
wheel: <
name: "infra/python/wheels/pywin32/${vpython_platform}"
version: "version:300"
match_tag: <
platform: "win32"
>
match_tag: <
platform: "win_amd64"
>
>
================================================
FILE: AUTHORS
================================================
# This is the official list of Crashpad authors for copyright purposes.
# This file is distinct from the CONTRIBUTORS files.
# See the latter for an explanation.
# Names should be added to this file as:
# Name or Organization <email address>
# The email address is not required for organizations.
Google Inc.
Intel Corporation
Opera Software ASA
Vewd Software AS
LG Electronics, Inc.
MIPS Technologies, Inc.
Darshan Sen <raisinten@gmail.com>
Ho Cheung <uioptt24@gmail.com>
================================================
FILE: BUILD.gn
================================================
# Copyright 2017 The Crashpad Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import("build/crashpad_buildconfig.gni")
import("build/test.gni")
import("util/net/tls.gni")
config("crashpad_config") {
include_dirs = [
".",
root_gen_dir,
]
}
if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) {
test("crashpad_tests") {
deps = [
"client:client_test",
"minidump:minidump_test",
"snapshot:snapshot_test",
"test:googlemock_main",
"test:test_test",
"util:util_test",
]
data_deps = []
if (crashpad_is_in_chromium) {
data_deps += [ "//testing/buildbot/filters:crashpad_tests_filters" ]
}
if (!crashpad_is_ios && !crashpad_is_fuchsia) {
deps += [ "handler:handler_test" ]
}
if (crashpad_is_in_fuchsia) {
# TODO(fuchsia:46559): Fix the leaks and remove this.
deps += [ "//build/config/sanitizers:suppress-lsan.DO-NOT-USE-THIS" ]
# TODO(fxbug.dev/42059784): Remove this once the underlying issue is
# addressed.
exclude_toolchain_tags = [ "hwasan" ]
}
if (crashpad_is_android) {
use_raw_android_executable = true
# crbug.com/418874703 - This is a workaround to propagate the data deps to
# //:crashpad_tests__dist for Android build.
data_deps += [
"snapshot:crashpad_snapshot_test_both_dt_hash_styles",
"snapshot:crashpad_snapshot_test_module",
"snapshot:crashpad_snapshot_test_module_large",
"snapshot:crashpad_snapshot_test_module_small",
"test:crashpad_test_test_multiprocess_exec_test_child",
]
copy("crashpad_test_data") {
testonly = true
sources = [
"test/test_paths_test_data_root.txt",
"util/net/testdata/ascii_http_body.txt",
"util/net/testdata/binary_http_body.dat",
]
outputs = [ "$root_out_dir/crashpad_test_data/{{source}}" ]
}
deps += [ ":crashpad_test_data" ]
extra_dist_files = [
"$root_out_dir/crashpad_handler",
"$root_out_dir/crashpad_test_test_multiprocess_exec_test_child",
"$root_out_dir/crashpad_test_data",
]
}
}
if (crashpad_is_in_fuchsia) {
import("//build/components.gni")
fuchsia_test_component("crashpad-test-component") {
manifest = "test/fuchsia_crashpad_tests.cml"
deps = [
":crashpad-test-resources",
":crashpad_tests",
"snapshot:crashpad_snapshot_test_both_dt_hash_styles",
"snapshot:crashpad_snapshot_test_module",
"snapshot:crashpad_snapshot_test_module_large",
"snapshot:crashpad_snapshot_test_module_small",
"test:crashpad_test_test_multiprocess_exec_test_child",
]
}
fuchsia_test_package("crashpad-test") {
test_components = [ ":crashpad-test-component" ]
deps = [
"//src/connectivity/network/dns:component",
"//src/connectivity/network/netstack:component",
]
test_specs = {
log_settings = {
max_severity = "FATAL"
}
}
}
_resource_files = [
"test/test_paths_test_data_root.txt",
"util/net/testdata/ascii_http_body.txt",
"util/net/testdata/binary_http_body.dat",
]
if (crashpad_use_boringssl_for_http_transport_socket) {
_resource_files += [
"util/net/testdata/crashpad_util_test_cert.pem",
"util/net/testdata/crashpad_util_test_key.pem",
]
}
_resources = []
foreach(resource_file, _resource_files) {
_resource_file_target = string_replace(resource_file, "/", "_")
resource("${_resource_file_target}") {
sources = [ "${resource_file}" ]
outputs = [ "data/${resource_file}" ]
}
_resources += [ ":${_resource_file_target}" ]
}
group("crashpad-test-resources") {
deps = _resources
}
group("tests") {
testonly = true
deps = [ ":crashpad-test" ]
}
}
} else if (crashpad_is_standalone || crashpad_is_external) {
test("crashpad_client_test") {
deps = [
"client:client_test",
"test:googlemock_main",
]
}
test("crashpad_handler_test") {
deps = [
"handler:handler_test",
"test:googletest_main",
]
if (crashpad_is_ios || crashpad_is_fuchsia) {
deps -= [ "handler:handler_test" ]
}
}
test("crashpad_minidump_test") {
deps = [
"minidump:minidump_test",
"test:googletest_main",
]
}
test("crashpad_snapshot_test") {
deps = [
"snapshot:snapshot_test",
"test:googlemock_main",
]
}
test("crashpad_test_test") {
deps = [
"test:googlemock_main",
"test:test_test",
]
}
test("crashpad_util_test") {
deps = [
"test:googlemock_main",
"util:util_test",
]
}
}
if (crashpad_is_ios) {
group("ios_xcuitests") {
testonly = true
deps = [ "test/ios:all_tests" ]
}
}
================================================
FILE: CONTRIBUTORS
================================================
# People who have agreed to one of the CLAs and can contribute patches.
# The AUTHORS file lists the copyright holders; this file
# lists people. For example, Google employees are listed here
# but not in AUTHORS, because Google holds the copyright.
#
# https://developers.google.com/open-source/cla/individual
# https://developers.google.com/open-source/cla/corporate
#
# Names should be added to this file as:
# Name <email address>
Mark Mentovai <mark@chromium.org>
Robert Sesek <rsesek@chromium.org>
Scott Graham <scottmg@chromium.org>
Joshua Peraza <jperaza@chromium.org>
================================================
FILE: DEPS
================================================
# Copyright 2014 The Crashpad Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
vars = {
'chromium_git': 'https://chromium.googlesource.com',
'gn_version': 'git_revision:5e19d2fb166fbd4f6f32147fbb2f497091a54ad8',
# ninja CIPD package version.
# https://chrome-infra-packages.appspot.com/p/infra/3pp/tools/ninja
'ninja_version': 'version:2@1.8.2.chromium.3',
'pull_linux_clang': False,
'pull_win_toolchain': False,
# Controls whether crashpad/build/ios/setup-ios-gn.py is run as part of
# gclient hooks. It is enabled by default for developer's convenience. It can
# be disabled with custom_vars (done automatically on the bots).
'run_setup_ios_gn': True,
}
deps = {
'buildtools':
Var('chromium_git') + '/chromium/src/buildtools.git@' +
'efa920ce144e4dc1c1841e73179cd7e23b9f0d5e',
'buildtools/clang_format/script':
Var('chromium_git') +
'/external/github.com/llvm/llvm-project/clang/tools/clang-format.git@' +
'c912837e0d82b5ca4b6e790b573b3956d3744c1c',
'crashpad/third_party/edo/edo': {
'url': Var('chromium_git') + '/external/github.com/google/eDistantObject.git@' +
'38e71ff183d76f702db6966fa7236c98831acd80',
'condition': 'checkout_ios',
},
'crashpad/third_party/googletest/googletest':
Var('chromium_git') + '/external/github.com/google/googletest@' +
'3983f67e32fb3e9294487b9d4f9586efa6e5d088',
'crashpad/third_party/lss/lss':
Var('chromium_git') + '/linux-syscall-support.git@' +
'9719c1e1e676814c456b55f5f070eabad6709d31',
'crashpad/third_party/mini_chromium/mini_chromium':
Var('chromium_git') + '/chromium/mini_chromium@' +
'706fce5b1a280a6f2eea69040f67847f9acb65ff',
'crashpad/third_party/libfuzzer/src':
Var('chromium_git') + '/chromium/llvm-project/compiler-rt/lib/fuzzer.git@' +
'fda403cf93ecb8792cb1d061564d89a6553ca020',
'crashpad/third_party/zlib/zlib':
Var('chromium_git') + '/chromium/src/third_party/zlib@' +
'fef58692c1d7bec94c4ed3d030a45a1832a9615d',
# CIPD packages.
'buildtools/linux64': {
'packages': [
{
'package': 'gn/gn/linux-${{arch}}',
'version': Var('gn_version'),
}
],
'dep_type': 'cipd',
'condition': 'host_os == "linux"',
},
'buildtools/mac': {
'packages': [
{
'package': 'gn/gn/mac-${{arch}}',
'version': Var('gn_version'),
}
],
'dep_type': 'cipd',
'condition': 'host_os == "mac"',
},
'buildtools/win': {
'packages': [
{
'package': 'gn/gn/windows-amd64',
'version': Var('gn_version'),
}
],
'dep_type': 'cipd',
'condition': 'host_os == "win"',
},
'crashpad/build/fuchsia': {
'packages': [
{
'package': 'chromium/fuchsia/test-scripts',
'version': 'latest',
}
],
'condition': 'checkout_fuchsia',
'dep_type': 'cipd',
},
'crashpad/third_party/linux/clang/linux-amd64': {
'packages': [
{
'package': 'fuchsia/third_party/clang/linux-amd64',
'version': 'Tpc85d1ZwSlZ6UKl2d96GRUBGNA5JKholOKe24sRDr0C',
},
],
'condition': 'checkout_linux and pull_linux_clang',
'dep_type': 'cipd'
},
'crashpad/third_party/fuchsia/clang/mac-amd64': {
'packages': [
{
'package': 'fuchsia/third_party/clang/mac-amd64',
'version': 'integration',
},
],
'condition': 'checkout_fuchsia and host_os == "mac"',
'dep_type': 'cipd'
},
'crashpad/third_party/fuchsia/clang/linux-amd64': {
'packages': [
{
'package': 'fuchsia/third_party/clang/linux-amd64',
'version': 'integration',
},
],
'condition': 'checkout_fuchsia and host_os == "linux"',
'dep_type': 'cipd'
},
'crashpad/third_party/windows/clang/win-amd64': {
'bucket': 'chromium-browser-clang',
'objects': [
{
'object_name': 'Win/clang-llvmorg-20-init-17108-g29ed6000-2.tar.xz',
'sha256sum': '1c71efd923a91480480d4f31c2fd5f1369e01e14f15776a9454abbce0bc13548',
'size_bytes': 46357580,
'generation': 1737590897363452,
},
],
'condition': 'checkout_win and host_os == "win"',
'dep_type': 'gcs',
},
'crashpad/third_party/fuchsia-gn-sdk': {
'packages': [
{
'package': 'chromium/fuchsia/gn-sdk',
'version': 'latest'
},
],
'condition': 'checkout_fuchsia',
'dep_type': 'cipd'
},
'crashpad/third_party/fuchsia/sdk/linux-amd64': {
'packages': [
{
'package': 'fuchsia/sdk/core/linux-amd64',
'version': 'latest'
},
],
'condition': 'checkout_fuchsia and host_os == "linux"',
'dep_type': 'cipd'
},
# depot_tools/ninja wrapper calls third_party/ninja/{ninja, ninja.exe}.
# crashpad/third_party/ninja/ninja is another wrapper to call linux ninja
# or mac ninja.
# This allows crashpad developers to work for multiple platforms on the same
# machine.
'crashpad/third_party/ninja': {
'packages': [
{
'package': 'infra/3pp/tools/ninja/${{platform}}',
'version': Var('ninja_version'),
}
],
'condition': 'host_os == "win"',
'dep_type': 'cipd',
},
'crashpad/third_party/ninja/linux': {
'packages': [
{
'package': 'infra/3pp/tools/ninja/${{platform}}',
'version': Var('ninja_version'),
}
],
'condition': 'host_os == "linux"',
'dep_type': 'cipd',
},
'crashpad/third_party/ninja/mac-amd64': {
'packages': [
{
'package': 'infra/3pp/tools/ninja/mac-amd64',
'version': Var('ninja_version'),
}
],
'condition': 'host_os == "mac" and host_cpu == "x64"',
'dep_type': 'cipd',
},
'crashpad/third_party/ninja/mac-arm64': {
'packages': [
{
'package': 'infra/3pp/tools/ninja/mac-arm64',
'version': Var('ninja_version'),
}
],
'condition': 'host_os == "mac" and host_cpu == "arm64"',
'dep_type': 'cipd',
},
'crashpad/third_party/win/toolchain': {
# This package is only updated when the solution in .gclient includes an
# entry like:
# "custom_vars": { "pull_win_toolchain": True }
# This is because the contained bits are not redistributable.
'packages': [
{
'package': 'chrome_internal/third_party/sdk/windows',
'version': 'uploaded:2021-04-28'
},
],
'condition': 'checkout_win and pull_win_toolchain',
'dep_type': 'cipd'
},
}
hooks = [
{
# If using a local clang ("pull_linux_clang" above), also pull down a
# sysroot.
'name': 'sysroot_linux',
'pattern': '.',
'condition': 'checkout_linux and pull_linux_clang',
'action': [
'crashpad/build/install_linux_sysroot.py',
],
},
{
# Avoid introducing unnecessary PRESUBMIT.py file from build/fuchsia.
# Never fail and ignore the error if the file does not exist.
'name': 'Remove the PRESUBMIT.py from build/fuchsia',
'pattern': '.',
'condition': 'checkout_fuchsia',
'action': [
'rm',
'-f',
'crashpad/build/fuchsia/PRESUBMIT.py',
],
},
{
'name': 'Generate Fuchsia Build Definitions',
'pattern': '.',
'condition': 'checkout_fuchsia',
'action': [
'python3',
'crashpad/build/fuchsia_envs.py',
'crashpad/build/fuchsia/gen_build_defs.py'
],
},
{
'name': 'setup_gn_ios',
'pattern': '.',
'condition': 'run_setup_ios_gn and checkout_ios',
'action': [
'python3',
'crashpad/build/ios/setup_ios_gn.py'
],
},
]
recursedeps = [
'buildtools',
]
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: OWNERS
================================================
# Copyright 2025 The Crashpad Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
jperaza@chromium.org
justincohen@chromium.org
lgrey@chromium.org
mark@chromium.org
pbos@chromium.org
wfh@chromium.org
================================================
FILE: README.md
================================================
<!--
Copyright 2015 The Crashpad Authors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
# Crashpad
[Crashpad](https://crashpad.chromium.org/) is a crash-reporting system.
## Documentation
* [Project status](doc/status.md)
* [Developing Crashpad](doc/developing.md): instructions for getting the source
code, building, testing, and contributing to the project.
* [Crashpad interface documentation](https://crashpad.chromium.org/doxygen/)
* [Crashpad tool man pages](doc/man.md)
* [Crashpad overview design](doc/overview_design.md)
## Source Code
Crashpad’s source code is hosted in a Git repository at
https://chromium.googlesource.com/crashpad/crashpad.
## Other Links
* Bugs can be reported at the [Crashpad issue
tracker](https://crashpad.chromium.org/bug/).
* The [Crashpad bots](https://ci.chromium.org/p/crashpad/g/main/console)
perform automated builds and tests.
* [crashpad-dev](https://groups.google.com/a/chromium.org/group/crashpad-dev)
is the Crashpad developers’ mailing list.
================================================
FILE: build/BUILD.gn
================================================
# Copyright 2017 The Crashpad Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# When building in Chromium, these configs is used to set #defines that indicate
# whether code is being built standalone, or in Chromium, or potentially in some
# other configutation.
import("crashpad_buildconfig.gni")
config("crashpad_is_in_chromium") {
if (crashpad_is_in_chromium) {
defines = [ "CRASHPAD_IS_IN_CHROMIUM" ]
}
}
config("crashpad_is_in_fuchsia") {
if (crashpad_is_in_fuchsia) {
defines = [ "CRASHPAD_IS_IN_FUCHSIA" ]
}
}
config("flock_always_supported_defines") {
defines =
[ "CRASHPAD_FLOCK_ALWAYS_SUPPORTED=$crashpad_flock_always_supported" ]
}
group("default_exe_manifest_win") {
if (crashpad_is_in_chromium) {
deps = [ "//build/win:default_exe_manifest" ]
}
}
config("crashpad_fuzzer_flags") {
cflags = [
"-fsanitize=address",
"-fsanitize-address-use-after-scope",
"-fsanitize=fuzzer",
]
ldflags = [ "-fsanitize=address" ]
}
if (crashpad_is_apple) {
group("apple_enable_arc") {
# If `crashpad_is_in_chromium`, then because Chromium enables ARC
# compilation by default, no special configuration is needed.
if (crashpad_is_standalone) {
public_configs = [ "//third_party/mini_chromium/mini_chromium/build/config:apple_enable_arc" ]
}
}
}
if (crashpad_is_ios) {
group("ios_xctest") {
if (crashpad_is_in_chromium) {
public_configs = [ "//build/config/ios:xctest_config" ]
} else if (crashpad_is_standalone) {
public_configs = [
"//third_party/mini_chromium/mini_chromium/build/ios:xctest_config",
]
}
}
if (crashpad_is_in_chromium) {
import("//build/config/ios/ios_sdk.gni")
crashpad_is_ios_app_extension = ios_is_app_extension
} else {
crashpad_is_ios_app_extension = false
}
config("crashpad_is_ios_app_extension") {
if (crashpad_is_ios_app_extension) {
defines = [ "CRASHPAD_IS_IOS_APP_EXTENSION" ]
}
}
}
================================================
FILE: build/BUILDCONFIG.gn
================================================
# Copyright 2017 The Crashpad Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Intentionally very minimal, so that Crashpad can build in-tree in a variety of
# other projects, unrelated to the variables that are set in those projects'
# BUILDCONFIG.gn. Do not add more variables here. Instead, make them available
# in build/crashpad_buildconfig.gni if they must be globally available.
if (target_os == "") {
target_os = host_os
}
if (current_os == "") {
current_os = target_os
}
if (target_cpu == "") {
target_cpu = host_cpu
}
if (current_cpu == "") {
current_cpu = target_cpu
}
import("//build/crashpad_buildconfig.gni")
if (crashpad_is_standalone) {
_mini_chromium_dir = "//third_party/mini_chromium/mini_chromium"
} else if (crashpad_is_external) {
_mini_chromium_dir = "//../../mini_chromium/mini_chromium"
}
if (current_os == "win") {
set_default_toolchain(
"$_mini_chromium_dir/build/config:msvc_toolchain_$current_cpu")
} else {
set_default_toolchain("$_mini_chromium_dir/build/config:gcc_like_toolchain")
}
declare_args() {
# When true, enables the debug configuration, with additional run-time checks
# and logging. When false, enables the release configuration, with additional
# optimizations.
is_debug = false
# When true, build all code with -fsanitize=fuzzer, and enable various
# *_fuzzer targets.
crashpad_use_libfuzzer = false
}
_default_configs = [
"$_mini_chromium_dir/build/config:default",
"$_mini_chromium_dir/build/config:Wexit_time_destructors",
"$_mini_chromium_dir/build/config:Wimplicit_fallthrough",
]
if (crashpad_use_libfuzzer) {
_default_configs += [ "//build/config:crashpad_fuzzer_flags" ]
}
if (current_os == "fuchsia") {
_default_configs += [
"//third_party/fuchsia-gn-sdk/src/config:compiler",
"//third_party/fuchsia-gn-sdk/src/config:runtime_library",
]
import("//third_party/fuchsia-gn-sdk/src/gn_configs.gni")
}
_default_executable_configs = _default_configs + [
"$_mini_chromium_dir/build/config:executable",
"$_mini_chromium_dir/build/config:win_console",
]
set_defaults("source_set") {
configs = _default_configs
}
set_defaults("static_library") {
configs = _default_configs
}
set_defaults("executable") {
configs = _default_executable_configs
}
set_defaults("loadable_module") {
configs = _default_configs
}
set_defaults("shared_library") {
configs = _default_configs
}
set_defaults("test") {
configs = _default_executable_configs
}
================================================
FILE: build/config/fuchsia/gn_configs.gni
================================================
# Copyright 2024 The Crashpad Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# This file is copied from
# https://crsrc.org/c/build/config/fuchsia/gn_configs.gni?q=gn_configs.gni
# with some local modifications to match the crashpad setup.
# Path to the fuchsia SDK. This is intended for use in other templates &
# rules to reference the contents of the fuchsia SDK.
fuchsia_sdk = "//third_party/fuchsia/sdk/linux-amd64"
declare_args() {
# Specify a readelf_exec path to use. If not specified, the host's system
# executable will be used. Passed to populate_build_id_dir.py and
# prepare_package_inputs.py via the --readelf-exec flag.
# Must be a GN path (not an absolute path) since it is adjusted with
# rebase_path().
if (!defined(fuchsia_sdk_readelf_exec)) {
fuchsia_sdk_readelf_exec = ""
}
}
================================================
FILE: build/crashpad_buildconfig.gni
================================================
# Copyright 2017 The Crashpad Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
declare_args() {
# Determines various flavors of build configuration, and which concrete
# targets to use for dependencies. Valid values are "standalone", "chromium",
# "fuchsia", "dart" or "external".
crashpad_dependencies = "standalone"
if (defined(is_fuchsia_tree) && is_fuchsia_tree) {
crashpad_dependencies = "fuchsia"
}
}
assert(
crashpad_dependencies == "chromium" || crashpad_dependencies == "fuchsia" ||
crashpad_dependencies == "standalone" ||
crashpad_dependencies == "external" || crashpad_dependencies == "dart")
crashpad_is_in_chromium = crashpad_dependencies == "chromium"
crashpad_is_in_fuchsia = crashpad_dependencies == "fuchsia"
crashpad_is_in_dart = crashpad_dependencies == "dart"
crashpad_is_external = crashpad_dependencies == "external"
crashpad_is_standalone = crashpad_dependencies == "standalone"
# This is the parent directory that contains the mini_chromium source dir.
# This variable is not used when crashpad_is_in_chromium.
if (crashpad_is_in_fuchsia) {
import("//third_party/crashpad/fuchsia_buildconfig.gni")
mini_chromium_source_parent =
fuchsia_crashpad_root + "/third_party/mini_chromium"
} else {
mini_chromium_source_parent = "../third_party/mini_chromium"
}
# This is the source directory of mini_chromium (what is checked out).
_mini_chromium_source_root = "$mini_chromium_source_parent/mini_chromium"
# This references the mini_chromium location for importing GN files.
if (crashpad_is_external || crashpad_is_in_dart) {
mini_chromium_import_root = "../../../$_mini_chromium_source_root"
} else if (crashpad_is_in_fuchsia) {
mini_chromium_import_root = fuchsia_mini_chromium_root
} else {
mini_chromium_import_root = _mini_chromium_source_root
}
if (crashpad_is_in_chromium) {
if (is_ios) {
# For `target_platform`.
import("//build/config/apple/mobile_config.gni")
}
crashpad_is_mac = is_mac
crashpad_is_ios = is_ios
crashpad_is_tvos = is_ios && target_platform == "tvos"
crashpad_is_apple = is_apple
crashpad_is_win = is_win
crashpad_is_linux = is_linux || is_chromeos
crashpad_is_android = is_android
crashpad_is_fuchsia = is_fuchsia
crashpad_is_posix = is_posix
crashpad_is_clang = is_clang
} else {
import("$mini_chromium_import_root/build/compiler.gni")
import("$mini_chromium_import_root/build/platform.gni")
if (mini_chromium_is_ios) {
# For `target_platform`.
import("$mini_chromium_import_root/build/ios/ios_sdk.gni")
}
crashpad_is_mac = mini_chromium_is_mac
crashpad_is_ios = mini_chromium_is_ios
crashpad_is_tvos = crashpad_is_ios && target_platform == "tvos"
crashpad_is_apple = mini_chromium_is_apple
crashpad_is_win = mini_chromium_is_win
crashpad_is_linux = mini_chromium_is_linux
crashpad_is_android = mini_chromium_is_android
crashpad_is_fuchsia = mini_chromium_is_fuchsia
crashpad_is_posix = mini_chromium_is_posix
crashpad_is_clang = mini_chromium_is_clang
# fuchsia-gn-sdk from chromium uses "is_fuchsia" condition.
is_fuchsia = crashpad_is_fuchsia
}
crashpad_flock_always_supported = !(crashpad_is_android || crashpad_is_fuchsia)
template("crashpad_executable") {
executable(target_name) {
forward_variables_from(invoker,
"*",
[
"configs",
"remove_configs",
])
if (defined(invoker.remove_configs)) {
configs -= invoker.remove_configs
}
if (defined(invoker.configs)) {
configs += invoker.configs
}
if (crashpad_is_in_fuchsia) {
conversion_config = [ "//build/config:Wno-conversion" ]
if (configs + conversion_config - conversion_config == configs) {
# TODO(https://fxbug.dev/42136089): Decide if these are worth enabling.
configs += conversion_config
}
}
}
}
template("crashpad_loadable_module") {
loadable_module(target_name) {
forward_variables_from(invoker,
"*",
[
"configs",
"remove_configs",
])
if (defined(invoker.remove_configs)) {
configs -= invoker.remove_configs
}
if (defined(invoker.configs)) {
configs += invoker.configs
}
if (crashpad_is_in_fuchsia) {
conversion_config = [ "//build/config:Wno-conversion" ]
if (configs + conversion_config - conversion_config == configs) {
# TODO(https://fxbug.dev/42136089): Decide if these are worth enabling.
configs += conversion_config
}
}
}
}
template("crashpad_static_library") {
static_library(target_name) {
forward_variables_from(invoker,
"*",
[
"configs",
"remove_configs",
])
if (defined(invoker.remove_configs)) {
configs -= invoker.remove_configs
}
if (defined(invoker.configs)) {
configs += invoker.configs
}
if (crashpad_is_in_fuchsia) {
conversion_config = [ "//build/config:Wno-conversion" ]
if (configs + conversion_config - conversion_config == configs) {
# TODO(https://fxbug.dev/42136089): Decide if these are worth enabling.
configs += conversion_config
}
}
}
}
================================================
FILE: build/crashpad_fuzzer_test.gni
================================================
# Copyright 2018 The Crashpad Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import("crashpad_buildconfig.gni")
import("test.gni")
if (crashpad_is_in_chromium) {
import("//testing/libfuzzer/fuzzer_test.gni")
}
template("crashpad_fuzzer_test") {
if (crashpad_is_standalone && crashpad_use_libfuzzer) {
test(target_name) {
forward_variables_from(invoker,
[
"cflags",
"cflags_cc",
"check_includes",
"defines",
"include_dirs",
"sources",
])
configs += [ "..:crashpad_config" ]
if (defined(invoker.deps)) {
deps = invoker.deps
}
deps += [ "../third_party/libfuzzer" ]
if (!defined(invoker.cflags)) {
cflags = []
}
cflags += [ "-fsanitize=fuzzer" ]
}
if (defined(invoker.seed_corpus)) {
not_needed(invoker, [ "seed_corpus" ])
}
} else if (crashpad_is_in_chromium && use_fuzzing_engine) {
# Append "crashpad_" to the beginning of the fuzzer's name to make it easier
# in Chromium to recognize where fuzzer came from.
forward_variables_from(invoker, "*")
fuzzer_test("crashpad_" + target_name) {
}
} else {
not_needed(invoker, "*")
group(target_name) {
}
}
}
================================================
FILE: build/fuchsia_envs.py
================================================
#!/usr/bin/env python3
# Copyright 2024 The Crashpad Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import os
import platform
import subprocess
import sys
def main(args):
"""
Executes the test-scripts with required environment variables. It acts like
/usr/bin/env, but provides some extra functionality to dynamically set up
the environment variables.
Args:
args: the command line arguments without the script name itself.
"""
os.environ['SRC_ROOT'] = os.path.abspath(
os.path.join(os.path.dirname(__file__), '..'))
assert platform.system() == 'Linux', 'Unsupported OS ' + platform.system()
os.environ['FUCHSIA_SDK_ROOT'] = os.path.join(
os.environ['SRC_ROOT'], 'third_party/fuchsia/sdk/linux-amd64/')
os.environ['FUCHSIA_GN_SDK_ROOT'] = os.path.join(
os.environ['SRC_ROOT'], 'third_party/fuchsia-gn-sdk/src')
os.environ['FUCHSIA_READELF'] = os.path.join(os.environ['SRC_ROOT'],
'third_party/fuchsia/clang/linux-amd64/bin/llvm-readelf')
return subprocess.run(args).returncode
if __name__ == '__main__':
sys.exit(main(sys.argv[1:]))
================================================
FILE: build/install_linux_sysroot.py
================================================
#!/usr/bin/env python3
# Copyright 2018 The Crashpad Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Various code adapted from:
# https://cs.chromium.org/chromium/src/build/linux/sysroot_scripts/install-sysroot.py
import os
import shutil
import subprocess
import sys
import urllib.request
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
# Sysroot revision from:
# https://cs.chromium.org/chromium/src/build/linux/sysroot_scripts/sysroots.json
SERVER = 'https://commondatastorage.googleapis.com'
PATH = 'chrome-linux-sysroot/toolchain'
REVISION = '43a87bbebccad99325fdcf34166295b121ee15c7'
FILENAME = 'debian_sid_amd64_sysroot.tar.xz'
def main():
url = '%s/%s/%s/%s' % (SERVER, PATH, REVISION, FILENAME)
sysroot = os.path.join(SCRIPT_DIR, os.pardir, 'third_party', 'linux',
'sysroot')
stamp = os.path.join(sysroot, '.stamp')
if os.path.exists(stamp):
with open(stamp) as s:
if s.read() == url:
return
print('Installing Debian root image from %s' % url)
if os.path.isdir(sysroot):
shutil.rmtree(sysroot)
os.mkdir(sysroot)
tarball = os.path.join(sysroot, FILENAME)
print('Downloading %s' % url)
for _ in range(3):
response = urllib.request.urlopen(url)
with open(tarball, 'wb') as f:
f.write(response.read())
break
else:
raise Exception('Failed to download %s' % url)
subprocess.check_call(['tar', 'xf', tarball, '-C', sysroot])
os.remove(tarball)
with open(stamp, 'w') as s:
s.write(url)
if __name__ == '__main__':
main()
sys.exit(0)
================================================
FILE: build/ios/Unittest-Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleIdentifier</key>
<string>${IOS_BUNDLE_ID_PREFIX}.${GTEST_BUNDLE_ID_SUFFIX:rfc1034identifier}</string>
<key>UIApplicationDelegate</key>
<string>CrashpadUnitTestDelegate</string>
</dict>
</plist>
================================================
FILE: build/ios/convert_gn_xcodeproj.py
================================================
#!/usr/bin/env python3
# Copyright 2020 The Crashpad Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Convert GN Xcode projects to platform and configuration independent targets.
GN generates Xcode projects that build one configuration only. However, typical
iOS development involves using the Xcode IDE to toggle the platform and
configuration. This script replaces the 'gn' configuration with 'Debug',
'Release' and 'Profile', and changes the ninja invocation to honor these
configurations.
"""
import argparse
import collections
import copy
import filecmp
import functools
import hashlib
import io
import json
import os
import re
import shutil
import string
import subprocess
import sys
import tempfile
import xml.etree.ElementTree
LLDBINIT_PATH = '$(PROJECT_DIR)/.lldbinit'
PYTHON_RE = re.compile('[ /]python[23]?$')
XCTEST_PRODUCT_TYPES = frozenset((
'com.apple.product-type.bundle.unit-test',
'com.apple.product-type.bundle.ui-testing',
))
SCHEME_PRODUCT_TYPES = frozenset((
'com.apple.product-type.app-extension',
'com.apple.product-type.application',
'com.apple.product-type.framework'
))
class Template(string.Template):
"""A subclass of string.Template that changes delimiter."""
delimiter = '@'
@functools.lru_cache
def LoadSchemeTemplate(root, name):
"""Return a string.Template object for scheme file loaded relative to root."""
path = os.path.join(root, 'build', 'ios', name + '.template')
with open(path) as file:
return Template(file.read())
def CreateIdentifier(str_id):
"""Return a 24 characters string that can be used as an identifier."""
return hashlib.sha1(str_id.encode("utf-8")).hexdigest()[:24].upper()
def GenerateSchemeForTarget(root, project, old_project, name, path, is_test):
"""Generates the .xcsheme file for target named |name|.
The file is generated in the new project schemes directory from a template.
If there is an existing previous project, then the old scheme file is copied
and the lldbinit setting is set. If lldbinit setting is already correct, the
file is not modified, just copied.
"""
project_name = os.path.basename(project)
relative_path = os.path.join('xcshareddata', 'xcschemes', name + '.xcscheme')
identifier = CreateIdentifier('%s %s' % (name, path))
scheme_path = os.path.join(project, relative_path)
if not os.path.isdir(os.path.dirname(scheme_path)):
os.makedirs(os.path.dirname(scheme_path))
substitutions = {
'LLDBINIT_PATH': LLDBINIT_PATH,
'BLUEPRINT_IDENTIFIER': identifier,
'BUILDABLE_NAME': path,
'BLUEPRINT_NAME': name,
'PROJECT_NAME': project_name
}
if is_test:
template = LoadSchemeTemplate(root, 'xcodescheme-testable')
substitutions['PATH'] = os.environ['PATH']
else:
template = LoadSchemeTemplate(root, 'xcodescheme')
old_scheme_path = os.path.join(old_project, relative_path)
if os.path.exists(old_scheme_path):
tree = xml.etree.ElementTree.parse(old_scheme_path)
tree_root = tree.getroot()
for reference in tree_root.findall('.//BuildableReference'):
for (attr, value) in (
('BuildableName', path),
('BlueprintName', name),
('BlueprintIdentifier', identifier)):
if reference.get(attr) != value:
reference.set(attr, value)
for child in tree_root:
if child.tag not in ('TestAction', 'LaunchAction'):
continue
if child.get('customLLDBInitFile') != LLDBINIT_PATH:
child.set('customLLDBInitFile', LLDBINIT_PATH)
if is_test:
template_tree = xml.etree.ElementTree.parse(
io.StringIO(template.substitute(**substitutions)))
template_tree_root = template_tree.getroot()
for child in tree_root:
if child.tag != 'BuildAction':
continue
for subchild in list(child):
child.remove(subchild)
for post_action in template_tree_root.findall('.//PostActions'):
child.append(post_action)
tree.write(scheme_path, xml_declaration=True, encoding='UTF-8')
else:
with open(scheme_path, 'w') as scheme_file:
scheme_file.write(template.substitute(**substitutions))
class XcodeProject(object):
def __init__(self, objects, counter = 0):
self.objects = objects
self.counter = 0
def AddObject(self, parent_name, obj):
while True:
self.counter += 1
str_id = "%s %s %d" % (parent_name, obj['isa'], self.counter)
new_id = CreateIdentifier(str_id)
# Make sure ID is unique. It's possible there could be an id conflict
# since this is run after GN runs.
if new_id not in self.objects:
self.objects[new_id] = obj
return new_id
def IterObjectsByIsa(self, isa):
"""Iterates overs objects of the |isa| type."""
for key, obj in self.objects.items():
if obj['isa'] == isa:
yield (key, obj)
def IterNativeTargetByProductType(self, product_types):
"""Iterates over PBXNativeTarget objects of any |product_types| types."""
for key, obj in self.IterObjectsByIsa('PBXNativeTarget'):
if obj['productType'] in product_types:
yield (key, obj)
def UpdateBuildScripts(self):
"""Update build scripts to respect configuration and platforms."""
for key, obj in self.IterObjectsByIsa('PBXShellScriptBuildPhase'):
shell_path = obj['shellPath']
shell_code = obj['shellScript']
if shell_path.endswith('/sh'):
shell_code = shell_code.replace(
'ninja -C .',
'ninja -C "../${CONFIGURATION}${EFFECTIVE_PLATFORM_NAME}"')
elif PYTHON_RE.search(shell_path):
shell_code = shell_code.replace(
'''ninja_params = [ '-C', '.' ]''',
'''ninja_params = [ '-C', '../' + os.environ['CONFIGURATION']'''
''' + os.environ['EFFECTIVE_PLATFORM_NAME'] ]''')
# Replace the build script in the object.
obj['shellScript'] = shell_code
def UpdateBuildConfigurations(self, configurations):
"""Add new configurations, using the first one as default."""
# Create a list with all the objects of interest. This is needed
# because objects will be added to/removed from the project upon
# iterating this list and python dictionaries cannot be mutated
# during iteration.
for key, obj in list(self.IterObjectsByIsa('XCConfigurationList')):
# Use the first build configuration as template for creating all the
# new build configurations.
build_config_template = self.objects[obj['buildConfigurations'][0]]
build_config_template['buildSettings']['CONFIGURATION_BUILD_DIR'] = \
'$(PROJECT_DIR)/../$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)'
# Remove the existing build configurations from the project before
# creating the new ones.
for build_config_id in obj['buildConfigurations']:
del self.objects[build_config_id]
obj['buildConfigurations'] = []
for configuration in configurations:
build_config = copy.copy(build_config_template)
build_config['name'] = configuration
build_config_id = self.AddObject('products', build_config)
obj['buildConfigurations'].append(build_config_id)
def GetHostMappingForXCTests(self):
"""Returns a dict from targets to the list of their xctests modules."""
mapping = collections.defaultdict(list)
for key, obj in self.IterNativeTargetByProductType(XCTEST_PRODUCT_TYPES):
build_config_lists_id = obj['buildConfigurationList']
build_configs = self.objects[build_config_lists_id]['buildConfigurations']
# Use the first build configuration to get the name of the host target.
# This is arbitrary, but since the build configuration are all identical
# after UpdateBuildConfiguration, except for their 'name', it is fine.
build_config = self.objects[build_configs[0]]
if obj['productType'] == 'com.apple.product-type.bundle.unit-test':
# The test_host value will look like this:
# `$(BUILD_PRODUCTS_DIR)/host_app_name.app/host_app_name`
#
# Extract the `host_app_name.app` part as key for the output.
test_host_path = build_config['buildSettings']['TEST_HOST']
test_host_name = os.path.basename(os.path.dirname(test_host_path))
else:
test_host_name = build_config['buildSettings']['TEST_TARGET_NAME']
test_name = obj['name']
test_path = self.objects[obj['productReference']]['path']
mapping[test_host_name].append((key, test_name, test_path))
return dict(mapping)
def check_output(command):
"""Wrapper around subprocess.check_output that decode output as utf-8."""
return subprocess.check_output(command).decode('utf-8')
def CopyFileIfChanged(source_path, target_path):
"""Copy |source_path| to |target_path| if different."""
target_dir = os.path.dirname(target_path)
if not os.path.isdir(target_dir):
os.makedirs(target_dir)
if not os.path.exists(target_path) or \
not filecmp.cmp(source_path, target_path):
shutil.copyfile(source_path, target_path)
def CopyTreeIfChanged(source, target):
"""Copy |source| to |target| recursively; files are copied iff changed."""
if os.path.isfile(source):
return CopyFileIfChanged(source, target)
if not os.path.isdir(target):
os.makedirs(target)
for name in os.listdir(source):
CopyTreeIfChanged(
os.path.join(source, name),
os.path.join(target, name))
def LoadXcodeProjectAsJSON(project_dir):
"""Return Xcode project at |path| as a JSON string."""
return check_output([
'plutil', '-convert', 'json', '-o', '-',
os.path.join(project_dir, 'project.pbxproj')])
def WriteXcodeProject(output_path, json_string):
"""Save Xcode project to |output_path| as XML."""
with tempfile.NamedTemporaryFile() as temp_file:
temp_file.write(json_string.encode("utf-8"))
temp_file.flush()
subprocess.check_call(['plutil', '-convert', 'xml1', temp_file.name])
CopyFileIfChanged(
temp_file.name,
os.path.join(output_path, 'project.pbxproj'))
def UpdateXcodeProject(project_dir, old_project_dir, configurations, root_dir):
"""Update inplace Xcode project to support multiple configurations.
Args:
project_dir: path to the input Xcode project
configurations: list of string corresponding to the configurations that
need to be supported by the tweaked Xcode projects, must contains at
least one value.
root_dir: path to the root directory used to find markdown files
"""
json_data = json.loads(LoadXcodeProjectAsJSON(project_dir))
project = XcodeProject(json_data['objects'])
project.UpdateBuildScripts()
project.UpdateBuildConfigurations(configurations)
mapping = project.GetHostMappingForXCTests()
# Generate schemes for application, extensions and framework targets
for key, obj in project.IterNativeTargetByProductType(SCHEME_PRODUCT_TYPES):
product = project.objects[obj['productReference']]
product_path = product['path']
# Do not generate scheme for the XCTests and XXCUITests target app.
# Instead, a scheme will be generated for each test modules.
tests = mapping.get(product_path, []) + mapping.get(obj['name'], [])
if not tests:
GenerateSchemeForTarget(
root_dir, project_dir, old_project_dir,
obj['name'], product_path, False)
else:
for (_, test_name, test_path) in tests:
GenerateSchemeForTarget(
root_dir, project_dir, old_project_dir,
test_name, test_path, True)
root_object = project.objects[json_data['rootObject']]
main_group = project.objects[root_object['mainGroup']]
sources = None
for child_key in main_group['children']:
child = project.objects[child_key]
if child.get('name') == 'Source' or child.get('name') == 'Sources':
sources = child
break
if sources is None:
sources = main_group
AddMarkdownToProject(project, root_dir, sources, sources is main_group)
SortFileReferencesByName(project, sources, root_object.get('productRefGroup'))
objects = collections.OrderedDict(sorted(project.objects.items()))
# WriteXcodeProject(project_dir, json.dumps(json_data))
def CreateGroup(project, parent_group, group_name, use_relative_paths):
group_object = {
'children': [],
'isa': 'PBXGroup',
'sourceTree': '<group>',
}
if use_relative_paths:
group_object['path'] = group_name
else:
group_object['name'] = group_name
parent_group_name = parent_group.get('name', '')
group_object_key = project.AddObject(parent_group_name, group_object)
parent_group['children'].append(group_object_key)
return group_object
class ObjectKey(object):
"""Wrapper around PBXFileReference and PBXGroup for sorting.
A PBXGroup represents a "directory" containing a list of files in an
Xcode project; it can contain references to a list of directories or
files.
A PBXFileReference represents a "file".
The type is stored in the object "isa" property as a string. Since we
want to sort all directories before all files, the < and > operators
are defined so that if "isa" is different, they are sorted in the
reverse of alphabetic ordering, otherwise the name (or path) property
is checked and compared in alphabetic order.
"""
def __init__(self, obj, last):
self.isa = obj['isa']
if 'name' in obj:
self.name = obj['name']
else:
self.name = obj['path']
self.last = last
def __lt__(self, other):
if self.last != other.last:
return other.last
if self.isa != other.isa:
return self.isa > other.isa
return self.name < other.name
def __gt__(self, other):
if self.last != other.last:
return self.last
if self.isa != other.isa:
return self.isa < other.isa
return self.name > other.name
def __eq__(self, other):
return self.isa == other.isa and self.name == other.name
def SortFileReferencesByName(project, group_object, products_group_ref):
SortFileReferencesByNameWithSortKey(
project, group_object,
lambda ref: ObjectKey(project.objects[ref], ref == products_group_ref))
def SortFileReferencesByNameWithSortKey(project, group_object, sort_key):
group_object['children'].sort(key=sort_key)
for key in group_object['children']:
child = project.objects[key]
if child['isa'] == 'PBXGroup':
SortFileReferencesByNameWithSortKey(project, child, sort_key)
def AddMarkdownToProject(project, root_dir, group_object, use_relative_paths):
list_files_cmd = ['git', '-C', root_dir, 'ls-files', '*.md']
paths = check_output(list_files_cmd).splitlines()
ios_internal_dir = os.path.join(root_dir, 'ios_internal')
if os.path.exists(ios_internal_dir):
list_files_cmd = ['git', '-C', ios_internal_dir, 'ls-files', '*.md']
ios_paths = check_output(list_files_cmd).splitlines()
paths.extend([os.path.join("ios_internal", path) for path in ios_paths])
for path in paths:
new_markdown_entry = {
"fileEncoding": "4",
"isa": "PBXFileReference",
"lastKnownFileType": "net.daringfireball.markdown",
"sourceTree": "<group>"
}
if use_relative_paths:
new_markdown_entry['path'] = os.path.basename(path)
else:
new_markdown_entry['name'] = os.path.basename(path)
new_markdown_entry['path'] = path
folder = GetFolderForPath(
project, group_object, os.path.dirname(path),
use_relative_paths)
folder_name = folder.get('name', None)
if folder_name is None:
folder_name = folder.get('path', 'sources')
new_markdown_entry_id = project.AddObject(folder_name, new_markdown_entry)
folder['children'].append(new_markdown_entry_id)
def GetFolderForPath(project, group_object, path, use_relative_paths):
objects = project.objects
if not path:
return group_object
for folder in path.split('/'):
children = group_object['children']
new_root = None
for child_key in children:
child = objects[child_key]
if child['isa'] == 'PBXGroup':
child_name = child.get('name', None)
if child_name is None:
child_name = child.get('path')
if child_name == folder:
new_root = child
break
if not new_root:
# If the folder isn't found we could just cram it into the leaf existing
# folder, but that leads to folders with tons of README.md inside.
new_root = CreateGroup(project, group_object, folder, use_relative_paths)
group_object = new_root
return group_object
def ConvertGnXcodeProject(root_dir, proj_name, input_dir, output_dir, configs):
'''Tweak the Xcode project generated by gn to support multiple configurations.
The Xcode projects generated by "gn gen --ide" only supports a single
platform and configuration (as the platform and configuration are set
per output directory). This method takes as input such projects and
add support for multiple configurations and platforms (to allow devs
to select them in Xcode).
Args:
root_dir: directory that is the root of the project
proj_name: name of the Xcode project "file" (usually `all.xcodeproj`)
input_dir: directory containing the XCode projects created by "gn gen --ide"
output_dir: directory where the tweaked Xcode projects will be saved
configs: list of string corresponding to the configurations that need to be
supported by the tweaked Xcode projects, must contains at least one
value.
'''
UpdateXcodeProject(
os.path.join(input_dir, proj_name),
os.path.join(output_dir, proj_name),
configs, root_dir)
CopyTreeIfChanged(os.path.join(input_dir, proj_name),
os.path.join(output_dir, proj_name))
def Main(args):
parser = argparse.ArgumentParser(
description='Convert GN Xcode projects for iOS.')
parser.add_argument(
'input',
help='directory containing [product|all] Xcode projects.')
parser.add_argument(
'output',
help='directory where to generate the iOS configuration.')
parser.add_argument(
'--add-config', dest='configurations', default=[], action='append',
help='configuration to add to the Xcode project')
parser.add_argument(
'--root', type=os.path.abspath, required=True,
help='root directory of the project')
parser.add_argument(
'--project-name', default='all.xcodeproj', dest='proj_name',
help='name of the Xcode project (default: %(default)s)')
args = parser.parse_args(args)
if not os.path.isdir(args.input):
sys.stderr.write('Input directory does not exists.\n')
return 1
if args.proj_name not in os.listdir(args.input):
sys.stderr.write(
'Input directory does not contain the Xcode project.\n')
return 1
if not args.configurations:
sys.stderr.write('At least one configuration required, see --add-config.\n')
return 1
ConvertGnXcodeProject(
args.root,
args.proj_name,
args.input,
args.output,
args.configurations)
if __name__ == '__main__':
sys.exit(Main(sys.argv[1:]))
================================================
FILE: build/ios/setup_ios_gn.config
================================================
# Copyright 2020 The Crashpad Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
[xcode]
# Controls settings for the generated Xcode project. If jobs is non-zero
# it will be passed to the ninja invocation in Xcode project.
jobs = 0
[build]
# Controls the build output. The only supported values are "64-bit", "32-bit"
# and "fat" (for a fat binary supporting both "32-bit" and "64-bit" cpus).
arch = "64-bit"
[gn_args]
# Values in that section will be copied verbatim in the generated args.gn file.
target_os = "ios"
[filters]
# List of target files to pass to --filters argument of gn gen when generating
# the Xcode project. By default, list all targets from ios/ and ios_internal/
# and the targets corresponding to the unit tests run on the bots.
================================================
FILE: build/ios/setup_ios_gn.py
================================================
#!/usr/bin/env python3
# Copyright 2020 The Crashpad Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import argparse
import configparser
import convert_gn_xcodeproj
import errno
import io
import os
import platform
import re
import shutil
import subprocess
import sys
import tempfile
SUPPORTED_TARGETS = ('appletvos', 'appletvsimulator', 'iphoneos',
'iphonesimulator', 'maccatalyst')
SUPPORTED_CONFIGS = ('Debug', 'Release', 'Profile', 'Official')
# Pattern matching lines from ~/.lldbinit that must not be copied to the
# generated .lldbinit file. They match what the user were told to add to
# their global ~/.lldbinit file before setup-gn.py was updated to generate
# a project specific file and thus must not be copied as they would cause
# the settings to be overwritten.
LLDBINIT_SKIP_PATTERNS = (
re.compile('^script sys.path\\[:0\\] = \\[\'.*/src/tools/lldb\'\\]$'),
re.compile('^script import lldbinit$'),
re.compile('^settings append target.source-map .* /google/src/.*$'),
)
def HostCpuArch():
'''Returns the arch of the host cpu for GN.'''
HOST_CPU_ARCH = {
'arm64': '"arm64"',
'x86_64': '"x64"',
}
return HOST_CPU_ARCH[platform.machine()]
class ConfigParserWithStringInterpolation(configparser.ConfigParser):
'''A .ini file parser that supports strings and environment variables.'''
ENV_VAR_PATTERN = re.compile(r'\$([A-Za-z0-9_]+)')
def values(self, section):
return filter(
lambda val: val != '',
map(lambda kv: self._UnquoteString(self._ExpandEnvVar(kv[1])),
configparser.ConfigParser.items(self, section)))
def getstring(self, section, option, fallback=''):
try:
raw_value = self.get(section, option)
except configparser.NoOptionError:
return fallback
return self._UnquoteString(self._ExpandEnvVar(raw_value))
def _UnquoteString(self, string):
if not string or string[0] != '"' or string[-1] != '"':
return string
return string[1:-1]
def _ExpandEnvVar(self, value):
match = self.ENV_VAR_PATTERN.search(value)
if not match:
return value
name, (begin, end) = match.group(1), match.span(0)
prefix, suffix = value[:begin], self._ExpandEnvVar(value[end:])
return prefix + os.environ.get(name, '') + suffix
class GnGenerator(object):
'''Holds configuration for a build and method to generate gn default files.'''
FAT_BUILD_DEFAULT_ARCH = '64-bit'
TARGET_CPU_VALUES = {
'appletvos': '"arm64"',
'appletvsimulator': HostCpuArch(),
'iphoneos': '"arm64"',
'iphonesimulator': HostCpuArch(),
'maccatalyst': HostCpuArch(),
}
TARGET_ENVIRONMENT_VALUES = {
'appletvos': '"device"',
'appletvsimulator': '"simulator"',
'iphoneos': '"device"',
'iphonesimulator': '"simulator"',
'maccatalyst': '"catalyst"'
}
TARGET_PLATFORM_VALUES = {
'appletvos': '"tvos"',
'appletvsimulator': '"tvos"',
'iphoneos': '"iphoneos"',
'iphonesimulator': '"iphoneos"',
'maccatalyst': '"iphoneos"'
}
def __init__(self, settings, config, target):
assert target in SUPPORTED_TARGETS
assert config in SUPPORTED_CONFIGS
self._settings = settings
self._config = config
self._target = target
def _GetGnArgs(self):
"""Build the list of arguments to pass to gn.
Returns:
A list of tuple containing gn variable names and variable values (it
is not a dictionary as the order needs to be preserved).
"""
args = []
is_debug = self._config == 'Debug'
official = self._config == 'Official'
is_optim = self._config in ('Profile', 'Official')
args.append(('target_os', '"ios"'))
args.append(('is_debug', is_debug))
if os.environ.get('FORCE_MAC_TOOLCHAIN', '0') == '1':
args.append(('use_system_xcode', False))
args.append(('target_cpu', self.TARGET_CPU_VALUES[self._target]))
args.append(
('target_environment', self.TARGET_ENVIRONMENT_VALUES[self._target]))
args.append(('target_platform', self.TARGET_PLATFORM_VALUES[self._target]))
# Add user overrides after the other configurations so that they can
# refer to them and override them.
args.extend(self._settings.items('gn_args'))
return args
def Generate(self, gn_path, proj_name, root_path, build_dir):
self.WriteArgsGn(build_dir, xcode_project_name=proj_name)
subprocess.check_call(self.GetGnCommand(
gn_path, root_path, build_dir, xcode_project_name=proj_name))
def CreateGnRules(self, gn_path, root_path, build_dir):
gn_command = self.GetGnCommand(gn_path, root_path, build_dir)
self.WriteArgsGn(build_dir)
self.WriteBuildNinja(gn_command, build_dir)
self.WriteBuildNinjaDeps(build_dir)
def WriteArgsGn(self, build_dir, xcode_project_name=None):
with open(os.path.join(build_dir, 'args.gn'), 'w') as stream:
stream.write('# This file was generated by setup-gn.py. Do not edit\n')
stream.write('# but instead use ~/.setup-gn or $repo/.setup-gn files\n')
stream.write('# to configure settings.\n')
stream.write('\n')
if self._target != 'maccatalyst':
if self._settings.has_section('$imports$'):
for import_rule in self._settings.values('$imports$'):
stream.write('import("%s")\n' % import_rule)
stream.write('\n')
gn_args = self._GetGnArgs()
for name, value in gn_args:
if isinstance(value, bool):
stream.write('%s = %s\n' % (name, str(value).lower()))
elif isinstance(value, list):
stream.write('%s = [%s' % (name, '\n' if len(value) > 1 else ''))
if len(value) == 1:
prefix = ' '
suffix = ' '
else:
prefix = ' '
suffix = ',\n'
for item in value:
if isinstance(item, bool):
stream.write('%s%s%s' % (prefix, str(item).lower(), suffix))
else:
stream.write('%s%s%s' % (prefix, item, suffix))
stream.write(']\n')
else:
# ConfigParser removes quote around empty string which confuse
# `gn gen` so restore them.
if not value:
value = '""'
stream.write('%s = %s\n' % (name, value))
def WriteBuildNinja(self, gn_command, build_dir):
with open(os.path.join(build_dir, 'build.ninja'), 'w') as stream:
stream.write('ninja_required_version = 1.7.2\n')
stream.write('\n')
stream.write('rule gn\n')
stream.write(' command = %s\n' % NinjaEscapeCommand(gn_command))
stream.write(' description = Regenerating ninja files\n')
stream.write('\n')
stream.write('build build.ninja: gn\n')
stream.write(' generator = 1\n')
stream.write(' depfile = build.ninja.d\n')
def WriteBuildNinjaDeps(self, build_dir):
with open(os.path.join(build_dir, 'build.ninja.d'), 'w') as stream:
stream.write('build.ninja: nonexistant_file.gn\n')
def GetGnCommand(self, gn_path, src_path, out_path, xcode_project_name=None):
gn_command = [ gn_path, '--root=%s' % os.path.realpath(src_path), '-q' ]
if xcode_project_name is not None:
gn_command.append('--ide=xcode')
gn_command.append('--ninja-executable=autoninja')
gn_command.append('--xcode-build-system=new')
gn_command.append('--xcode-project=%s' % xcode_project_name)
gn_command.append('--xcode-additional-files-patterns=*.md')
gn_command.append('--xcode-configs=' + ';'.join(SUPPORTED_CONFIGS))
gn_command.append('--xcode-config-build-dir='
'//out/${CONFIGURATION}${EFFECTIVE_PLATFORM_NAME}')
if self._settings.has_section('filters'):
target_filters = self._settings.values('filters')
if target_filters:
gn_command.append('--filters=%s' % ';'.join(target_filters))
else:
gn_command.append('--check')
gn_command.append('gen')
gn_command.append('//%s' %
os.path.relpath(os.path.abspath(out_path), os.path.abspath(src_path)))
return gn_command
def NinjaNeedEscape(arg):
'''Returns True if |arg| needs to be escaped when written to .ninja file.'''
return ':' in arg or '*' in arg or ';' in arg
def NinjaEscapeCommand(command):
'''Escapes |command| in order to write it to .ninja file.'''
result = []
for arg in command:
if NinjaNeedEscape(arg):
arg = arg.replace(':', '$:')
arg = arg.replace(';', '\\;')
arg = arg.replace('*', '\\*')
else:
result.append(arg)
return ' '.join(result)
def FindGn():
'''Returns absolute path to gn binary looking at the PATH env variable.'''
for path in os.environ['PATH'].split(os.path.pathsep):
gn_path = os.path.join(path, 'gn')
if os.path.isfile(gn_path) and os.access(gn_path, os.X_OK):
return gn_path
return None
def GenerateXcodeProject(gn_path, root_dir, proj_name, out_dir, settings):
'''Generate Xcode project with Xcode and convert to multi-configurations.'''
prefix = os.path.abspath(os.path.join(out_dir, '_temp'))
temp_path = tempfile.mkdtemp(prefix=prefix)
try:
generator = GnGenerator(settings, 'Debug', 'iphonesimulator')
generator.Generate(gn_path, proj_name, root_dir, temp_path)
convert_gn_xcodeproj.ConvertGnXcodeProject(
root_dir,
'%s.xcodeproj' % proj_name,
os.path.join(temp_path),
os.path.join(out_dir, 'build'),
SUPPORTED_CONFIGS)
finally:
if os.path.exists(temp_path):
shutil.rmtree(temp_path)
def CreateLLDBInitFile(root_dir, out_dir, settings):
'''
Generate an .lldbinit file for the project that load the script that fixes
the mapping of source files (see docs/ios/build_instructions.md#debugging).
'''
with open(os.path.join(out_dir, 'build', '.lldbinit'), 'w') as lldbinit:
lldb_script_dir = os.path.join(os.path.abspath(root_dir), 'tools', 'lldb')
lldbinit.write('script sys.path[:0] = [\'%s\']\n' % lldb_script_dir)
lldbinit.write('script import lldbinit\n')
workspace_name = settings.getstring(
'gn_args',
'ios_internal_citc_workspace_name')
if workspace_name != '':
username = os.environ['USER']
for shortname in ('googlemac', 'third_party', 'blaze-out'):
lldbinit.write('settings append target.source-map %s %s\n' % (
shortname,
'/google/src/cloud/%s/%s/google3/%s' % (
username, workspace_name, shortname)))
# Append the content of //ios/build/tools/lldbinit.defaults if it exists.
tools_dir = os.path.join(root_dir, 'ios', 'build', 'tools')
defaults_lldbinit_path = os.path.join(tools_dir, 'lldbinit.defaults')
if os.path.isfile(defaults_lldbinit_path):
with open(defaults_lldbinit_path) as defaults_lldbinit:
for line in defaults_lldbinit:
lldbinit.write(line)
# Append the content of ~/.lldbinit if it exists. Line that look like they
# are trying to configure source mapping are skipped as they probably date
# back from when setup-gn.py was not generating an .lldbinit file.
global_lldbinit_path = os.path.join(os.environ['HOME'], '.lldbinit')
if os.path.isfile(global_lldbinit_path):
with open(global_lldbinit_path) as global_lldbinit:
for line in global_lldbinit:
if any(pattern.match(line) for pattern in LLDBINIT_SKIP_PATTERNS):
continue
lldbinit.write(line)
def GenerateGnBuildRules(gn_path, root_dir, out_dir, settings):
'''Generates all template configurations for gn.'''
for config in SUPPORTED_CONFIGS:
for target in SUPPORTED_TARGETS:
build_dir = os.path.join(out_dir, '%s-%s' % (config, target))
if not os.path.isdir(build_dir):
os.makedirs(build_dir)
generator = GnGenerator(settings, config, target)
generator.CreateGnRules(gn_path, root_dir, build_dir)
def Main(args):
default_root = os.path.normpath(os.path.join(
os.path.dirname(__file__), os.pardir, os.pardir))
parser = argparse.ArgumentParser(
description='Generate build directories for use with gn.')
parser.add_argument(
'root', default=default_root, nargs='?',
help='root directory where to generate multiple out configurations')
parser.add_argument(
'--import', action='append', dest='import_rules', default=[],
help='path to file defining default gn variables')
parser.add_argument(
'--gn-path', default=None,
help='path to gn binary (default: look up in $PATH)')
parser.add_argument(
'--build-dir', default='out',
help='path where the build should be created (default: %(default)s)')
parser.add_argument(
'--config-path', default=os.path.expanduser('~/.setup-gn'),
help='path to the user config file (default: %(default)s)')
parser.add_argument(
'--system-config-path', default=os.path.splitext(__file__)[0] + '.config',
help='path to the default config file (default: %(default)s)')
parser.add_argument(
'--project-name', default='all', dest='proj_name',
help='name of the generated Xcode project (default: %(default)s)')
parser.add_argument(
'--no-xcode-project', action='store_true', default=False,
help='do not generate the build directory with XCode project')
args = parser.parse_args(args)
# Load configuration (first global and then any user overrides).
settings = ConfigParserWithStringInterpolation()
settings.read([
args.system_config_path,
args.config_path,
])
# Add private sections corresponding to --import argument.
if args.import_rules:
settings.add_section('$imports$')
for i, import_rule in enumerate(args.import_rules):
if not import_rule.startswith('//'):
import_rule = '//%s' % os.path.relpath(
os.path.abspath(import_rule), os.path.abspath(args.root))
settings.set('$imports$', '$rule%d$' % i, import_rule)
# Validate settings.
if settings.getstring('build', 'arch') not in ('64-bit', '32-bit', 'fat'):
sys.stderr.write('ERROR: invalid value for build.arch: %s\n' %
settings.getstring('build', 'arch'))
sys.exit(1)
# Find path to gn binary either from command-line or in PATH.
if args.gn_path:
gn_path = args.gn_path
else:
gn_path = FindGn()
if gn_path is None:
sys.stderr.write('ERROR: cannot find gn in PATH\n')
sys.exit(1)
out_dir = os.path.join(args.root, args.build_dir)
if not os.path.isdir(out_dir):
os.makedirs(out_dir)
if not args.no_xcode_project:
GenerateXcodeProject(gn_path, args.root, args.proj_name, out_dir, settings)
CreateLLDBInitFile(args.root, out_dir, settings)
GenerateGnBuildRules(gn_path, args.root, out_dir, settings)
if __name__ == '__main__':
sys.exit(Main(sys.argv[1:]))
================================================
FILE: build/ios/xcodescheme-testable.template
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1220"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<PostActions>
<ExecutionAction
ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction">
<ActionContent
title = "Resign test runner"
scriptText = "unset -v XCODE_DEVELOPER_DIR_PATH BUILDDIR="${PROJECT_DIR}/../${CONFIGURATION}${EFFECTIVE_PLATFORM_NAME}" export PATH="@{PATH}" rm -rf "${BUILDDIR}/@{BLUEPRINT_NAME}-Runner.app" autoninja -C "${BUILDDIR}" "@{BLUEPRINT_NAME}" "
shellToInvoke = "/bin/sh">
<EnvironmentBuildable>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "@{BLUEPRINT_IDENTIFIER}"
BuildableName = "@{BUILDABLE_NAME}"
BlueprintName = "@{BLUEPRINT_NAME}"
ReferencedContainer = "container:@{PROJECT_NAME}">
</BuildableReference>
</EnvironmentBuildable>
</ActionContent>
</ExecutionAction>
</PostActions>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
customLLDBInitFile = "@{LLDBINIT_PATH}"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "@{BLUEPRINT_IDENTIFIER}"
BuildableName = "@{BUILDABLE_NAME}"
BlueprintName = "@{BLUEPRINT_NAME}"
ReferencedContainer = "container:@{PROJECT_NAME}">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
customLLDBInitFile = "@{LLDBINIT_PATH}"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
</LaunchAction>
<ProfileAction
buildConfiguration = "Profile"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Official"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
================================================
FILE: build/ios/xcodescheme.template
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1220"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "@{BLUEPRINT_IDENTIFIER}"
BuildableName = "@{BUILDABLE_NAME}"
BlueprintName = "@{BLUEPRINT_NAME}"
ReferencedContainer = "container:@{PROJECT_NAME}">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
customLLDBInitFile = "@{LLDBINIT_PATH}"
shouldUseLaunchSchemeArgsEnv = "YES">
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
customLLDBInitFile = "@{LLDBINIT_PATH}"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "@{BLUEPRINT_IDENTIFIER}"
BuildableName = "@{BUILDABLE_NAME}"
BlueprintName = "@{BLUEPRINT_NAME}"
ReferencedContainer = "container:@{PROJECT_NAME}">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Profile"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "@{BLUEPRINT_IDENTIFIER}"
BuildableName = "@{BUILDABLE_NAME}"
BlueprintName = "@{BLUEPRINT_NAME}"
ReferencedContainer = "container:@{PROJECT_NAME}">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Official"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
================================================
FILE: build/run_tests.py
================================================
#!/usr/bin/env python3
# Copyright 2014 The Crashpad Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import argparse
import os
import posixpath
import re
import shlex
import subprocess
import sys
import tempfile
import uuid
CRASHPAD_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)),
os.pardir)
IS_WINDOWS_HOST = sys.platform.startswith('win')
def _FindGNFromBinaryDir(binary_dir):
"""Attempts to determine the path to a GN binary used to generate the build
files in the given binary_dir. This is necessary because `gn` might not be
in the path or might be in a non-standard location, particularly on build
machines."""
build_ninja = os.path.join(binary_dir, 'build.ninja')
if os.path.isfile(build_ninja):
with open(build_ninja, 'r') as f:
# Look for the always-generated regeneration rule of the form:
#
# rule gn
# command = <gn binary> ... arguments ...
#
# to extract the gn binary's full path.
found_rule_gn = False
for line in f:
if line.strip() == 'rule gn':
found_rule_gn = True
continue
if found_rule_gn:
if len(line) == 0 or line[0] != ' ':
return None
if line.startswith(' command = '):
gn_command_line_parts = line.strip().split(' ')
if len(gn_command_line_parts) > 2:
return os.path.join(binary_dir,
gn_command_line_parts[2])
return None
def _GetGNArgument(argument_name, binary_dir):
"""Returns the value of a given GN argument, or None if it is not
explicitly specified."""
gn_path = _FindGNFromBinaryDir(binary_dir)
if gn_path:
# Look for a GN “target_os”.
popen = subprocess.Popen([
gn_path, '--root=' + CRASHPAD_DIR, 'args', binary_dir,
'--list=%s' % argument_name, '--short'
],
shell=IS_WINDOWS_HOST,
stdout=subprocess.PIPE,
stderr=open(os.devnull),
text=True)
value = popen.communicate()[0]
if popen.returncode == 0:
match = re.match(r'%s = "(.*)"$' % argument_name, value)
if match:
return match.group(1)
return None
def _EnableVTProcessingOnWindowsConsole():
"""Enables virtual terminal processing for ANSI/VT100-style escape sequences
on a Windows console attached to standard output. Returns True on success.
Returns False if standard output is not a console or if virtual terminal
processing is not supported. The feature was introduced in Windows 10.
"""
import pywintypes
import win32console
import winerror
stdout_console = win32console.GetStdHandle(win32console.STD_OUTPUT_HANDLE)
try:
console_mode = stdout_console.GetConsoleMode()
except pywintypes.error as e:
if e.winerror == winerror.ERROR_INVALID_HANDLE:
# Standard output is not a console.
return False
raise
try:
# From <wincon.h>. This would be
# win32console.ENABLE_VIRTUAL_TERMINAL_PROCESSING, but it’s too new to
# be defined there.
ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004
stdout_console.SetConsoleMode(console_mode |
ENABLE_VIRTUAL_TERMINAL_PROCESSING)
except pywintypes.error as e:
if e.winerror == winerror.ERROR_INVALID_PARAMETER:
# ANSI/VT100-style escape sequence processing isn’t supported before
# Windows 10.
return False
raise
return True
def _RunOnAndroidTarget(binary_dir, test, android_device, extra_command_line):
local_test_path = os.path.join(binary_dir, test)
MAYBE_UNSUPPORTED_TESTS = (
'crashpad_client_test',
'crashpad_handler_test',
'crashpad_minidump_test',
'crashpad_snapshot_test',
)
if not os.path.exists(local_test_path) and test in MAYBE_UNSUPPORTED_TESTS:
print('This test is not present and may not be supported, skipping')
return
def _adb(*args):
# Flush all of this script’s own buffered stdout output before running
# adb, which will likely produce its own output on stdout.
sys.stdout.flush()
adb_command = ['adb', '-s', android_device]
adb_command.extend(args)
subprocess.check_call(adb_command, shell=IS_WINDOWS_HOST)
def _adb_push(sources, destination):
args = list(sources)
args.append(destination)
_adb('push', *args)
def _adb_shell(command_args, env={}):
# Build a command to execute via “sh -c” instead of invoking it
# directly. Here’s why:
#
# /system/bin/env isn’t normally present prior to Android 6.0 (M), where
# toybox was introduced (Android platform/manifest 9a2c01e8450b).
# Instead, set environment variables by using the shell’s internal
# “export” command.
#
# adbd prior to Android 7.0 (N), and the adb client prior to SDK
# platform-tools version 24, don’t know how to communicate a shell
# command’s exit status. This was added in Android platform/system/core
# 606835ae5c4b). With older adb servers and clients, adb will “exit 0”
# indicating success even if the command failed on the device. This
# makes subprocess.check_call() semantics difficult to implement
# directly. As a workaround, have the device send the command’s exit
# status over stdout and pick it back up in this function.
#
# Both workarounds are implemented by giving the device a simple script,
# which adbd will run as an “sh -c” argument.
adb_command = ['adb', '-s', android_device, 'shell']
script_commands = []
for k, v in env.items():
script_commands.append('export %s=%s' %
(shlex.quote(k), shlex.quote(v)))
script_commands.extend([
' '.join(shlex.quote(x) for x in command_args), 'status=${?}',
'echo "status=${status}"', 'exit ${status}'
])
adb_command.append('; '.join(script_commands))
child = subprocess.Popen(adb_command,
shell=IS_WINDOWS_HOST,
stdin=open(os.devnull),
stdout=subprocess.PIPE,
text=True)
FINAL_LINE_RE = re.compile(r'status=(\d+)$')
final_line = None
while True:
# Use readline so that the test output appears “live” when running.
data = child.stdout.readline()
if data == '':
break
if final_line is not None:
# It wasn’t really the final line.
print(final_line, end='')
final_line = None
if FINAL_LINE_RE.match(data.rstrip()):
final_line = data
else:
print(data, end='')
if final_line is None:
# Maybe there was some stderr output after the end of stdout. Old
# versions of adb, prior to when the exit status could be
# communicated, smush the two together.
raise subprocess.CalledProcessError(-1, adb_command)
status = int(FINAL_LINE_RE.match(final_line.rstrip()).group(1))
if status != 0:
raise subprocess.CalledProcessError(status, adb_command)
child.wait()
if child.returncode != 0:
raise subprocess.CalledProcessError(subprocess.returncode,
adb_command)
# /system/bin/mktemp isn’t normally present prior to Android 6.0 (M), where
# toybox was introduced (Android platform/manifest 9a2c01e8450b). Fake it
# with a host-generated name. This won’t retry if the name is in use, but
# with 122 bits of randomness, it should be OK. This uses “mkdir” instead of
# “mkdir -p”because the latter will not indicate failure if the directory
# already exists.
device_temp_dir = '/data/local/tmp/%s.%s' % (test, uuid.uuid4().hex)
_adb_shell(['mkdir', device_temp_dir])
try:
# Specify test dependencies that must be pushed to the device. This
# could be determined automatically in a GN build, following the example
# used for Fuchsia. Since nothing like that exists for GYP, hard-code it
# for supported tests.
test_build_artifacts = [test, 'crashpad_handler']
test_data = ['test/test_paths_test_data_root.txt']
if test == 'crashpad_test_test':
test_build_artifacts.append(
'crashpad_test_test_multiprocess_exec_test_child')
elif test == 'crashpad_util_test':
test_data.append('util/net/testdata/')
# Establish the directory structure on the device.
device_out_dir = posixpath.join(device_temp_dir, 'out')
device_mkdirs = [device_out_dir]
for source_path in test_data:
# A trailing slash could reasonably mean to copy an entire
# directory, but will interfere with what’s needed from the path
# split. All parent directories of any source_path need to be be
# represented in device_mkdirs, but it’s important that no
# source_path itself wind up in device_mkdirs, even if source_path
# names a directory, because that would cause the “adb push” of the
# directory below to behave incorrectly.
if source_path.endswith(posixpath.sep):
source_path = source_path[:-1]
device_source_path = posixpath.join(device_temp_dir, source_path)
device_mkdir = posixpath.split(device_source_path)[0]
if device_mkdir not in device_mkdirs:
device_mkdirs.append(device_mkdir)
adb_mkdir_command = ['mkdir', '-p']
adb_mkdir_command.extend(device_mkdirs)
_adb_shell(adb_mkdir_command)
# Push the test binary and any other build output to the device.
local_test_build_artifacts = []
for artifact in test_build_artifacts:
local_test_build_artifacts.append(os.path.join(
binary_dir, artifact))
_adb_push(local_test_build_artifacts, device_out_dir)
# Push test data to the device.
for source_path in test_data:
_adb_push([os.path.join(CRASHPAD_DIR, source_path)],
posixpath.join(device_temp_dir, source_path))
# Run the test on the device. Pass the test data root in the
# environment.
#
# Because the test will not run with its standard output attached to a
# pseudo-terminal device, Google Test will not normally enable colored
# output, so mimic Google Test’s own logic for deciding whether to
# enable color by checking this script’s own standard output connection.
# The list of TERM values comes from Google Test’s
# googletest/src/gtest.cc testing::internal::ShouldUseColor().
env = {'CRASHPAD_TEST_DATA_ROOT': device_temp_dir}
gtest_color = os.environ.get('GTEST_COLOR')
if gtest_color in ('auto', None):
if (sys.stdout.isatty() and
(os.environ.get('TERM')
in ('xterm', 'xterm-color', 'xterm-256color', 'screen',
'screen-256color', 'tmux', 'tmux-256color', 'rxvt-unicode',
'rxvt-unicode-256color', 'linux', 'cygwin') or
(IS_WINDOWS_HOST and _EnableVTProcessingOnWindowsConsole()))):
gtest_color = 'yes'
else:
gtest_color = 'no'
env['GTEST_COLOR'] = gtest_color
_adb_shell([posixpath.join(device_out_dir, test)] + extra_command_line,
env)
finally:
_adb_shell(['rm', '-rf', device_temp_dir])
def _RunOnIOSTarget(binary_dir,
test,
target_platform,
is_xcuitest=False,
gtest_filter=None):
"""Runs the given iOS |test| app on a simulator with the default OS version."""
target_platform = target_platform or 'iphoneos'
if target_platform == 'iphoneos':
dyld_insert_libraries = (
'__PLATFORMS__/iPhoneSimulator.platform/Developer/usr/lib/'
'libXCTestBundleInject.dylib')
xcodebuild_platform = 'iOS Simulator'
xcodebuild_device_name = 'iPhone 17'
elif target_platform == 'tvos':
dyld_insert_libraries = (
'__PLATFORMS__/AppleTVSimulator.platform/Developer/usr/lib/'
'libXCTestBundleInject.dylib')
xcodebuild_platform = 'tvOS Simulator'
xcodebuild_device_name = 'Apple TV 4K (3rd generation)'
else:
raise ValueError(f'Unexpected target_platform: {target_platform}')
# E.g. __TESTROOT__/Debug-iphonesimulator.
dyld_framework_path = '__TESTROOT__/%s' % os.path.basename(binary_dir)
def xctest(binary_dir, test, gtest_filter=None):
"""Returns a dict containing the xctestrun data needed to run an
XCTest-based test app."""
test_path = os.path.join(CRASHPAD_DIR, binary_dir)
module_data = {
'TestBundlePath': os.path.join(test_path, test + '_module.xctest'),
'TestHostPath': os.path.join(test_path, test + '.app'),
'TestingEnvironmentVariables': {
'DYLD_FRAMEWORK_PATH': dyld_framework_path + ':',
'DYLD_INSERT_LIBRARIES': dyld_insert_libraries,
'DYLD_LIBRARY_PATH': dyld_framework_path,
'IDEiPhoneInternalTestBundleName': test + '.app',
'XCInjectBundleInto': '__TESTHOST__/' + test,
}
}
if gtest_filter:
module_data['CommandLineArguments'] = [
'--gtest_filter=' + gtest_filter
]
return {test: module_data}
def xcuitest(binary_dir, test):
"""Returns a dict containing the xctestrun data needed to run an
XCUITest-based test app."""
test_path = os.path.join(CRASHPAD_DIR, binary_dir)
runner_path = os.path.join(test_path, test + '_module-Runner.app')
bundle_path = os.path.join(runner_path, 'PlugIns',
test + '_module.xctest')
target_app_path = os.path.join(test_path, test + '.app')
module_data = {
'IsUITestBundle': True,
'SystemAttachmentLifetime': 'deleteOnSuccess',
'IsXCTRunnerHostedTestBundle': True,
'TestBundlePath': bundle_path,
'TestHostPath': runner_path,
'UITargetAppPath': target_app_path,
'DependentProductPaths': [
bundle_path, runner_path, target_app_path
],
'TestingEnvironmentVariables': {
'DYLD_FRAMEWORK_PATH': dyld_framework_path + ':',
'DYLD_LIBRARY_PATH': dyld_framework_path,
'XCInjectBundleInto': '__TESTHOST__/' + test + '_module-Runner',
},
}
return {test: module_data}
with tempfile.NamedTemporaryFile() as f:
import plistlib
xctestrun_path = f.name + ".xctestrun"
print(xctestrun_path)
command = [
'xcodebuild',
'test-without-building',
'-xctestrun',
xctestrun_path,
'-destination',
f'platform={xcodebuild_platform},name={xcodebuild_device_name}',
]
with open(xctestrun_path, 'wb') as fp:
if is_xcuitest:
plistlib.dump(xcuitest(binary_dir, test), fp)
if gtest_filter:
command.append('-only-testing:' + test + '/' + gtest_filter)
else:
plistlib.dump(xctest(binary_dir, test, gtest_filter), fp)
subprocess.check_call(command)
# This script is primarily used from the waterfall so that the list of tests
# that are run is maintained in-tree, rather than in a separate infrastructure
# location in the recipe.
def main(args):
parser = argparse.ArgumentParser(description='Run Crashpad unittests.')
parser.add_argument('binary_dir', help='Root of build dir')
parser.add_argument('test', nargs='*', help='Specific test(s) to run.')
parser.add_argument(
'--gtest_filter',
help='Google Test filter applied to Google Test binary runs.')
args = parser.parse_args()
# Tell 64-bit Windows tests where to find 32-bit test executables, for
# cross-bitted testing. This relies on the fact that the GYP build by
# default uses {Debug,Release} for the 32-bit build and {Debug,Release}_x64
# for the 64-bit build. This is not a universally valid assumption, and if
# it’s not met, 64-bit tests that require 32-bit build output will disable
# themselves dynamically.
if (sys.platform == 'win32' and args.binary_dir.endswith('_x64') and
'CRASHPAD_TEST_32_BIT_OUTPUT' not in os.environ):
binary_dir_32 = args.binary_dir[:-4]
if os.path.isdir(binary_dir_32):
os.environ['CRASHPAD_TEST_32_BIT_OUTPUT'] = binary_dir_32
target_os = _GetGNArgument('target_os', args.binary_dir)
is_android = target_os == 'android'
is_ios = target_os == 'ios'
# |target_platform| is only set for iOS-based platforms.
target_platform = _GetGNArgument('target_platform', args.binary_dir)
tests = [
'crashpad_client_test',
'crashpad_handler_test',
'crashpad_minidump_test',
'crashpad_snapshot_test',
'crashpad_test_test',
'crashpad_util_test',
]
if is_android:
android_device = os.environ.get('ANDROID_DEVICE')
if not android_device:
adb_devices = subprocess.check_output(['adb', 'devices'],
shell=IS_WINDOWS_HOST,
text=True)
devices = []
for line in adb_devices.splitlines():
line = line
if (line == 'List of devices attached' or
re.match(r'^\* daemon .+ \*$', line) or line == ''):
continue
(device, ignore) = line.split('\t')
devices.append(device)
if len(devices) != 1:
print("Please set ANDROID_DEVICE to your device's id",
file=sys.stderr)
return 2
android_device = devices[0]
print('Using autodetected Android device:', android_device)
elif is_ios:
tests.append('ios_crash_xcuitests')
elif IS_WINDOWS_HOST:
tests.append('snapshot/win/end_to_end_test.py')
if args.test:
for t in args.test:
if t not in tests:
print('Unrecognized test:', t, file=sys.stderr)
return 3
tests = args.test
for test in tests:
print('-' * 80)
print(test)
print('-' * 80)
if test.endswith('.py'):
subprocess.check_call([
sys.executable,
os.path.join(CRASHPAD_DIR, test), args.binary_dir
])
else:
extra_command_line = []
if args.gtest_filter:
extra_command_line.append('--gtest_filter=' + args.gtest_filter)
if is_android:
_RunOnAndroidTarget(args.binary_dir, test, android_device,
extra_command_line)
elif is_ios:
_RunOnIOSTarget(args.binary_dir,
test,
target_platform,
is_xcuitest=test.startswith('ios'),
gtest_filter=args.gtest_filter)
else:
subprocess.check_call([os.path.join(args.binary_dir, test)] +
extra_command_line)
return 0
if __name__ == '__main__':
sys.exit(main(sys.argv[1:]))
================================================
FILE: build/test.gni
================================================
# Copyright 2017 The Crashpad Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import("crashpad_buildconfig.gni")
if (crashpad_is_in_chromium) {
import("//testing/test.gni")
} else {
template("test") {
if (crashpad_is_ios) {
import("//third_party/mini_chromium/mini_chromium/build/ios/rules.gni")
_launch_image_bundle_target = target_name + "_launch_image"
bundle_data(_launch_image_bundle_target) {
forward_variables_from(invoker, [ "testonly" ])
sources = [ "//build/ios/Default.png" ]
outputs = [ "{{bundle_contents_dir}}/{{source_file_part}}" ]
}
ios_xctest_test(target_name) {
testonly = true
xctest_module_target = "//test/ios:google_test_runner"
info_plist = "//build/ios/Unittest-Info.plist"
extra_substitutions = [ "GTEST_BUNDLE_ID_SUFFIX=$target_name" ]
forward_variables_from(invoker, "*")
if (!defined(deps)) {
deps = []
}
deps += [ ":$_launch_image_bundle_target" ]
}
} else {
executable(target_name) {
testonly = true
forward_variables_from(invoker, "*")
}
}
}
}
================================================
FILE: client/BUILD.gn
================================================
# Copyright 2015 The Crashpad Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import("../build/crashpad_buildconfig.gni")
crashpad_static_library("client") {
sources = [
"crashpad_client.h",
"prune_crash_reports.cc",
"prune_crash_reports.h",
"simulate_crash.h",
]
if (crashpad_is_mac) {
sources += [
"crashpad_client_mac.cc",
"simulate_crash_mac.cc",
"simulate_crash_mac.h",
]
}
if (crashpad_is_ios) {
sources += [
"crash_handler_base_ios.cc",
"crash_handler_base_ios.h",
"crashpad_client_ios.cc",
"ios_handler/exception_processor.h",
"ios_handler/exception_processor.mm",
"ios_handler/in_process_handler.cc",
"ios_handler/in_process_handler.h",
"ios_handler/in_process_intermediate_dump_handler.cc",
"ios_handler/in_process_intermediate_dump_handler.h",
"ios_handler/prune_intermediate_dumps_and_crash_reports_thread.cc",
"ios_handler/prune_intermediate_dumps_and_crash_reports_thread.h",
"simulate_crash_ios.h",
"upload_behavior_ios.h",
]
if (!crashpad_is_tvos) {
sources += [
"crash_handler_ios.cc",
"crash_handler_ios.h",
]
} else {
sources += [
"crash_handler_tvos.cc",
"crash_handler_tvos.h",
]
}
}
if (crashpad_is_linux || crashpad_is_android) {
sources += [
"crashpad_client_linux.cc",
"simulate_crash_linux.h",
]
}
if (crashpad_is_linux || crashpad_is_android || crashpad_is_fuchsia) {
sources += [
"client_argv_handling.cc",
"client_argv_handling.h",
]
}
if (crashpad_is_win) {
sources += [
"crashpad_client_win.cc",
"simulate_crash_win.h",
]
}
if (crashpad_is_fuchsia) {
sources += [ "crashpad_client_fuchsia.cc" ]
}
public_configs = [ "..:crashpad_config" ]
public_deps = [
":common",
"$mini_chromium_source_parent:base",
"../util",
]
deps = [ ":common" ]
if (crashpad_is_win) {
libs = [ "rpcrt4.lib" ]
cflags = [ "/wd4201" ] # nonstandard extension used : nameless struct/union
}
if (crashpad_is_apple) {
deps += [ "../build:apple_enable_arc" ]
}
if (crashpad_is_ios) {
deps += [
"../handler:common",
"../minidump",
"../snapshot",
]
}
if (crashpad_is_linux || crashpad_is_android) {
deps += [ "../third_party/lss" ]
}
if (crashpad_is_fuchsia) {
deps += [ "../third_party/fuchsia" ]
if (crashpad_is_in_fuchsia) {
deps += [ "//sdk/lib/fdio" ]
}
}
}
static_library("common") {
sources = [
"annotation.cc",
"annotation.h",
"annotation_list.cc",
"annotation_list.h",
"crash_report_database.cc",
"crash_report_database.h",
"crashpad_info.cc",
"crashpad_info.h",
"length_delimited_ring_buffer.h",
"ring_buffer_annotation.h",
"settings.cc",
"settings.h",
"simple_address_range_bag.h",
"simple_string_dictionary.h",
]
if (crashpad_is_apple) {
sources += [ "crash_report_database_mac.mm" ]
}
if (crashpad_is_win) {
sources += [ "crash_report_database_win.cc" ]
}
if (crashpad_is_linux || crashpad_is_android || crashpad_is_fuchsia) {
sources += [
"crash_report_database_generic.cc",
"crashpad_info_note.S",
]
}
public_configs = [ "..:crashpad_config" ]
public_deps = [
"$mini_chromium_source_parent:base",
"../util",
]
deps = [ "../util" ]
configs += [ "../build:flock_always_supported_defines" ]
if (crashpad_is_apple) {
deps += [ "../build:apple_enable_arc" ]
}
}
crashpad_executable("ring_buffer_annotation_load_test") {
testonly = true
sources = [ "ring_buffer_annotation_load_test_main.cc" ]
deps = [
":client",
"$mini_chromium_source_parent:base",
"../tools:tool_support",
]
}
source_set("client_test") {
testonly = true
sources = [
"annotation_list_test.cc",
"annotation_test.cc",
"crash_report_database_test.cc",
"crashpad_info_test.cc",
"length_delimited_ring_buffer_test.cc",
"prune_crash_reports_test.cc",
"ring_buffer_annotation_test.cc",
"settings_test.cc",
"simple_address_range_bag_test.cc",
"simple_string_dictionary_test.cc",
]
if (crashpad_is_mac) {
sources += [ "simulate_crash_mac_test.cc" ]
}
if (crashpad_is_win) {
sources += [ "crashpad_client_win_test.cc" ]
}
if (crashpad_is_ios) {
sources += [
"crashpad_client_ios_test.mm",
"ios_handler/exception_processor_test.mm",
"ios_handler/in_process_handler_test.cc",
"ios_handler/in_process_intermediate_dump_handler_test.cc",
]
}
if (crashpad_is_linux || crashpad_is_android) {
sources += [ "crashpad_client_linux_test.cc" ]
}
deps = [
":client",
"$mini_chromium_source_parent:base",
"../compat",
"../snapshot",
"../test",
"../third_party/googletest",
"../third_party/googletest:googlemock",
"../util",
]
if (!crashpad_is_ios && !crashpad_is_fuchsia) {
data_deps = [ "../handler:crashpad_handler" ]
}
if (crashpad_is_apple) {
deps += [ "../build:apple_enable_arc" ]
}
if (crashpad_is_win) {
data_deps += [
"../handler:crashpad_handler_console",
"../handler/win/wer:crashpad_wer_handler",
]
}
if (crashpad_is_ios) {
deps += [ "../minidump" ]
}
}
if (crashpad_is_linux || crashpad_is_android) {
source_set("pthread_create") {
sources = [ "pthread_create_linux.cc" ]
deps = [ ":client" ]
}
}
================================================
FILE: client/annotation.cc
================================================
// Copyright 2017 The Crashpad Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "client/annotation.h"
#include <type_traits>
#include "base/check_op.h"
#include "client/annotation_list.h"
namespace crashpad {
static_assert(std::is_standard_layout<Annotation>::value,
"Annotation must be POD");
// static
constexpr size_t Annotation::kNameMaxLength;
constexpr size_t Annotation::kValueMaxSize;
void Annotation::SetSize(ValueSizeType size) {
DCHECK_LT(size, kValueMaxSize);
size_ = size;
// Use Register() instead of Get() in case the calling module has not
// explicitly initialized the annotation list, to avoid crashing.
AnnotationList::Register()->Add(this);
}
void Annotation::Clear() {
size_ = 0;
}
} // namespace crashpad
================================================
FILE: client/annotation.h
================================================
// Copyright 2017 The Crashpad Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef CRASHPAD_CLIENT_ANNOTATION_H_
#define CRASHPAD_CLIENT_ANNOTATION_H_
#include <stdint.h>
#include <string.h>
#include <sys/types.h>
#include <algorithm>
#include <atomic>
#include <optional>
#include <ostream>
#include <string_view>
#include "base/check.h"
#include "base/numerics/safe_conversions.h"
#include "build/build_config.h"
#include "util/synchronization/scoped_spin_guard.h"
namespace crashpad {
#if BUILDFLAG(IS_IOS)
namespace internal {
class InProcessIntermediateDumpHandler;
} // namespace internal
#endif
class AnnotationList;
//! \brief Base class for an annotation, which records a name-value pair of
//! arbitrary data when set.
//!
//! After an annotation is declared, its `value_ptr_` will not be captured in a
//! crash report until a call to \a SetSize() specifies how much data from the
//! value should be recorded.
//!
//! Annotations should be declared with static storage duration.
//!
//! An example declaration and usage:
//!
//! \code
//! // foo.cc:
//!
//! namespace {
//! char g_buffer[1024];
//! crashpad::Annotation g_buffer_annotation(
//! crashpad::Annotation::Type::kString, "buffer_head", g_buffer);
//! } // namespace
//!
//! void OnBufferProduced(size_t n) {
//! // Capture the head of the buffer, in case we crash when parsing it.
//! g_buffer_annotation.SetSize(std::min(64, n));
//!
//! // Start parsing the header.
//! Frobinate(g_buffer, n);
//! }
//! \endcode
//!
//! Annotation objects are not inherently thread-safe. To manipulate them
//! from multiple threads, external synchronization must be used.
//!
//! Annotation objects should never be destroyed. Once they are Set(), they
//! are permanently referenced by a global object.
class Annotation {
public:
//! \brief The maximum length of an annotation’s name, in bytes.
//! Matches the behavior of Breakpad's SimpleStringDictionary.
static constexpr size_t kNameMaxLength = 256;
//! \brief The maximum size of an annotation’s value, in bytes.
static constexpr size_t kValueMaxSize = 5 * 4096;
//! \brief The type used for \a SetSize().
using ValueSizeType = uint32_t;
//! \brief The type of data stored in the annotation.
enum class Type : uint16_t {
//! \brief An invalid annotation. Reserved for internal use.
kInvalid = 0,
//! \brief A `NUL`-terminated C-string.
kString = 1,
//! \brief Clients may declare their own custom types by using values
//! greater than this.
kUserDefinedStart = 0x8000,
};
//! \brief Mode used to guard concurrent reads from writes.
enum class ConcurrentAccessGuardMode : bool {
//! \!brief Annotation does not guard reads from concurrent
//! writes. Annotation values can be corrupted if the process crashes
//! mid-write and the handler tries to read from the Annotation while
//! being written to.
kUnguarded = false,
//! \!brief Annotation guards reads from concurrent writes using
//! ScopedSpinGuard. Clients must use TryCreateScopedSpinGuard()
//! before reading or writing the data in this Annotation.
kScopedSpinGuard = true,
};
//! \brief Creates a user-defined Annotation::Type.
//!
//! This exists to remove the casting overhead of `enum class`.
//!
//! \param[in] value A value used to create a user-defined type.
//!
//! \returns The value added to Type::kUserDefinedStart and casted.
constexpr static Type UserDefinedType(uint16_t value) {
using UnderlyingType = std::underlying_type<Type>::type;
// MSVS 2015 doesn't have full C++14 support and complains about local
// variables defined in a constexpr function, which is valid. Avoid them
// and the also-problematic DCHECK until all the infrastructure is updated:
// https://crbug.com/crashpad/201.
#if !BUILDFLAG(IS_WIN) || (defined(_MSC_VER) && _MSC_VER >= 1910)
const UnderlyingType start =
static_cast<UnderlyingType>(Type::kUserDefinedStart);
const UnderlyingType user_type = start + value;
DCHECK(user_type > start) << "User-defined Type is 0 or overflows";
return static_cast<Type>(user_type);
#else
return static_cast<Type>(
static_cast<UnderlyingType>(Type::kUserDefinedStart) + value);
#endif
}
//! \brief Constructs a new annotation.
//!
//! Upon construction, the annotation will not be included in any crash
//! reports until \sa SetSize() is called with a value greater than `0`.
//!
//! \param[in] type The data type of the value of the annotation.
//! \param[in] name A `NUL`-terminated C-string name for the annotation. Names
//! do not have to be unique, though not all crash processors may handle
//! Annotations with the same name. Names should be constexpr data with
//! static storage duration.
//! \param[in] value_ptr A pointer to the value for the annotation. The
//! pointer may not be changed once associated with an annotation, but
//! the data may be mutated.
constexpr Annotation(Type type, const char name[], void* value_ptr)
: Annotation(type,
name,
value_ptr,
ConcurrentAccessGuardMode::kUnguarded) {}
Annotation(const Annotation&) = delete;
Annotation& operator=(const Annotation&) = delete;
//! \brief Specifies the number of bytes in \a value_ptr_ to include when
//! generating a crash report.
//!
//! A size of `0` indicates that no value should be recorded and is the
//! equivalent of calling \sa Clear().
//!
//! This method does not mutate the data referenced by the annotation, it
//! merely updates the annotation system's bookkeeping.
//!
//! Subclasses of this base class that provide additional Set methods to
//! mutate the value of the annotation must call always call this method.
//!
//! \param[in] size The number of bytes.
void SetSize(ValueSizeType size);
//! \brief Marks the annotation as cleared, indicating the \a value_ptr_
//! should not be included in a crash report.
//!
//! This method does not mutate the data referenced by the annotation, it
//! merely updates the annotation system's bookkeeping.
void Clear();
//! \brief Tests whether the annotation has been set.
bool is_set() const { return size_ > 0; }
Type type() const { return type_; }
ValueSizeType size() const { return size_; }
const char* name() const { return name_; }
const void* value() const { return value_ptr_; }
ConcurrentAccessGuardMode concurrent_access_guard_mode() const {
return concurrent_access_guard_mode_;
}
//! \brief If this Annotation guards concurrent access using ScopedSpinGuard,
//! tries to obtain the spin guard and returns the result.
//!
//! \param[in] timeout_ns The timeout in nanoseconds after which to give up
//! trying to obtain the spin guard.
//! \return std::nullopt if the spin guard could not be obtained within
//! timeout_ns, or the obtained spin guard otherwise.
std::optional<ScopedSpinGuard> TryCreateScopedSpinGuard(uint64_t timeout_ns) {
// This can't use DCHECK_EQ() because ostream doesn't support
// operator<<(bool).
DCHECK(concurrent_access_guard_mode_ ==
ConcurrentAccessGuardMode::kScopedSpinGuard);
if (concurrent_access_guard_mode_ ==
ConcurrentAccessGuardMode::kUnguarded) {
return std::nullopt;
}
return ScopedSpinGuard::TryCreateScopedSpinGuard(timeout_ns,
spin_guard_state_);
}
protected:
//! \brief Constructs a new annotation.
//!
//! Upon construction, the annotation will not be included in any crash
//! reports until \sa SetSize() is called with a value greater than `0`.
//!
//! \param[in] type The data type of the value of the annotation.
//! \param[in] name A `NUL`-terminated C-string name for the annotation. Names
//! do not have to be unique, though not all crash processors may handle
//! Annotations with the same name. Names should be constexpr data with
//! static storage duration.
//! \param[in] value_ptr A pointer to the value for the annotation. The
//! pointer may not be changed once associated with an annotation, but
//! the data may be mutated.
//! \param[in] concurrent_access_guard_mode Mode used to guard concurrent
//! reads from writes.
constexpr Annotation(Type type,
const char name[],
void* value_ptr,
ConcurrentAccessGuardMode concurrent_access_guard_mode)
: link_node_(nullptr),
name_(name),
value_ptr_(value_ptr),
size_(0),
type_(type),
concurrent_access_guard_mode_(concurrent_access_guard_mode),
spin_guard_state_() {}
friend class AnnotationList;
#if BUILDFLAG(IS_IOS)
friend class internal::InProcessIntermediateDumpHandler;
#endif
std::atomic<Annotation*>& link_node() { return link_node_; }
Annotation* GetLinkNode(std::memory_order order = std::memory_order_seq_cst) {
return link_node_.load(order);
}
const Annotation* GetLinkNode(
std::memory_order order = std::memory_order_seq_cst) const {
return link_node_.load(order);
}
private:
//! \brief Linked list next-node pointer. Accessed only by \sa AnnotationList.
//!
//! This will be null until the first call to \sa SetSize(), after which the
//! presence of the pointer will prevent the node from being added to the
//! list again.
std::atomic<Annotation*> link_node_;
const char* const name_;
void* const value_ptr_;
ValueSizeType size_;
const Type type_;
//! \brief Mode used to guard concurrent reads from writes.
const ConcurrentAccessGuardMode concurrent_access_guard_mode_;
SpinGuardState spin_guard_state_;
};
//! \brief An \sa Annotation that stores a `NUL`-terminated C-string value.
//!
//! The storage for the value is allocated by the annotation and the template
//! parameter \a MaxSize controls the maxmium length for the value.
//!
//! It is expected that the string value be valid UTF-8, although this is not
//! validated.
template <Annotation::ValueSizeType MaxSize>
class StringAnnotation : public Annotation {
public:
//! \brief A constructor tag that enables braced initialization in C arrays.
//!
//! \sa StringAnnotation()
enum class Tag { kArray };
//! \brief Constructs a new StringAnnotation with the given \a name.
//!
//! \param[in] name The Annotation name.
constexpr explicit StringAnnotation(const char name[])
: Annotation(Type::kString, name, value_), value_() {}
StringAnnotation(const StringAnnotation&) = delete;
StringAnnotation& operator=(const StringAnnotation&) = delete;
//! \brief Constructs a new StringAnnotation with the given \a name.
//!
//! This constructor takes the ArrayInitializerTag for use when
//! initializing a C array of annotations. The main constructor is
//! explicit and cannot be brace-initialized. As an example:
//!
//! \code
//! static crashpad::StringAnnotation<32> annotations[] = {
//! {"name-1", crashpad::StringAnnotation<32>::Tag::kArray},
//! {"name-2", crashpad::StringAnnotation<32>::Tag::kArray},
//! {"name-3", crashpad::StringAnnotation<32>::Tag::kArray},
//! };
//! \endcode
//!
//! \param[in] name The Annotation name.
//! \param[in] tag A constructor tag.
constexpr StringAnnotation(const char name[], Tag tag)
: StringAnnotation(name) {}
//! \brief Sets the Annotation's string value.
//!
//! \param[in] value The `NUL`-terminated C-string value.
void Set(const char* value) {
strncpy(value_, value, MaxSize);
SetSize(
std::min(MaxSize, base::saturated_cast<ValueSizeType>(strlen(value))));
}
//! \brief Sets the Annotation's string value.
//!
//! \param[in] string The string value.
void Set(std::string_view string) {
Annotation::ValueSizeType size =
std::min(MaxSize, base::saturated_cast<ValueSizeType>(string.size()));
string = string.substr(0, size);
std::copy(string.begin(), string.end(), value_);
// Check for no embedded `NUL` characters.
DCHECK(string.find('\0', /*pos=*/0) == std::string_view::npos)
<< "embedded NUL";
SetSize(size);
}
const std::string_view value() const {
return std::string_view(value_, size());
}
private:
// This value is not `NUL`-terminated, since the size is stored by the base
// annotation.
char value_[MaxSize];
};
} // namespace crashpad
#endif // CRASHPAD_CLIENT_ANNOTATION_H_
================================================
FILE: client/annotation_list.cc
================================================
// Copyright 2017 The Crashpad Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "client/annotation_list.h"
#include "base/check_op.h"
#include "client/crashpad_info.h"
namespace crashpad {
template <typename T>
T* AnnotationList::IteratorBase<T>::operator*() const {
CHECK_NE(curr_, tail_);
return curr_;
}
template <typename T>
T* AnnotationList::IteratorBase<T>::operator->() const {
CHECK_NE(curr_, tail_);
return curr_;
}
template <typename T>
AnnotationList::IteratorBase<T>& AnnotationList::IteratorBase<T>::operator++() {
CHECK_NE(curr_, tail_);
curr_ = curr_->GetLinkNode();
return *this;
}
template <typename T>
AnnotationList::IteratorBase<T> AnnotationList::IteratorBase<T>::operator++(
int) {
T* const old_curr = curr_;
++(*this);
return IteratorBase(old_curr, tail_);
}
template <typename T>
bool AnnotationList::IteratorBase<T>::operator!=(
const IteratorBase& other) const {
return !(*this == other);
}
template <typename T>
AnnotationList::IteratorBase<T>::IteratorBase(T* head, const Annotation* tail)
: curr_(head), tail_(tail) {}
template class AnnotationList::IteratorBase<Annotation>;
template class AnnotationList::IteratorBase<const Annotation>;
AnnotationList::AnnotationList()
: tail_pointer_(&tail_),
head_(Annotation::Type::kInvalid, nullptr, nullptr),
tail_(Annotation::Type::kInvalid, nullptr, nullptr) {
head_.link_node().store(&tail_);
}
AnnotationList::~AnnotationList() {}
// static
AnnotationList* AnnotationList::Get() {
return CrashpadInfo::GetCrashpadInfo()->annotations_list();
}
// static
AnnotationList* AnnotationList::Register() {
AnnotationList* list = Get();
if (!list) {
list = new AnnotationList();
CrashpadInfo::GetCrashpadInfo()->set_annotations_list(list);
}
return list;
}
void AnnotationList::Add(Annotation* annotation) {
Annotation* null = nullptr;
Annotation* head_next = head_.link_node().load(std::memory_order_relaxed);
if (!annotation->link_node().compare_exchange_strong(null, head_next)) {
// If |annotation|'s link node is not null, then it has been added to the
// list already and no work needs to be done.
return;
}
// Check that the annotation's name is less than the maximum size. This is
// done here, since the Annotation constructor must be constexpr and this
// path is taken once per annotation.
DCHECK_LT(strlen(annotation->name_), Annotation::kNameMaxLength);
// Update the head link to point to the new |annotation|.
while (!head_.link_node().compare_exchange_weak(head_next, annotation)) {
// Another thread has updated the head-next pointer, so try again with the
// re-loaded |head_next|.
annotation->link_node().store(head_next, std::memory_order_relaxed);
}
}
AnnotationList::Iterator AnnotationList::begin() {
return Iterator(head_.GetLinkNode(), tail_pointer_);
}
AnnotationList::ConstIterator AnnotationList::cbegin() const {
return ConstIterator(head_.GetLinkNode(), tail_pointer_);
}
AnnotationList::Iterator AnnotationList::end() {
return Iterator(&tail_, tail_pointer_);
}
AnnotationList::ConstIterator AnnotationList::cend() const {
return ConstIterator(&tail_, tail_pointer_);
}
} // namespace crashpad
================================================
FILE: client/annotation_list.h
================================================
// Copyright 2017 The Crashpad Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef CRASHPAD_CLIENT_ANNOTATION_LIST_H_
#define CRASHPAD_CLIENT_ANNOTATION_LIST_H_
#include <iterator>
#include "build/build_config.h"
#include "client/annotation.h"
namespace crashpad {
#if BUILDFLAG(IS_IOS)
namespace internal {
class InProcessIntermediateDumpHandler;
} // namespace internal
#endif
//! \brief A list that contains all the currently set annotations.
//!
//! An instance of this class must be registered on the \a CrashpadInfo
//! structure in order to use the annotations system. Once a list object has
//! been registered on the CrashpadInfo, a different instance should not
//! be used instead.
class AnnotationList {
public:
AnnotationList();
AnnotationList(const AnnotationList&) = delete;
AnnotationList& operator=(const AnnotationList&) = delete;
~AnnotationList();
//! \brief Returns the instance of the list that has been registered on the
//! CrashapdInfo structure.
static AnnotationList* Get();
//! \brief Returns the instance of the list, creating and registering
//! it if one is not already set on the CrashapdInfo structure.
static AnnotationList* Register();
//! \brief Adds \a annotation to the global list. This method does not need
//! to be called by clients directly. The Annotation object will do so
//! automatically.
//!
//! Once an annotation is added to the list, it is not removed. This is
//! because the AnnotationList avoids the use of locks/mutexes, in case it is
//! being manipulated in a compromised context. Instead, an Annotation keeps
//! track of when it has been cleared, which excludes it from a crash report.
//! This design also avoids linear scans of the list when repeatedly setting
//! and/or clearing the value.
void Add(Annotation* annotation);
//! \brief An InputIterator for the AnnotationList.
template <typename T>
class IteratorBase {
public:
using difference_type = signed int;
using value_type = T*;
using reference = T*;
using pointer = void;
using iterator_category = std::input_iterator_tag;
IteratorBase(const IteratorBase& other) = default;
IteratorBase(IteratorBase&& other) = default;
~IteratorBase() = default;
IteratorBase& operator=(const IteratorBase& other) = default;
IteratorBase& operator=(IteratorBase&& other) = default;
T* operator*() const;
T* operator->() const;
IteratorBase& operator++();
IteratorBase operator++(int);
bool operator==(const IteratorBase& other) const {
return curr_ == other.curr_;
}
bool operator!=(const IteratorBase& other) const;
private:
friend class AnnotationList;
IteratorBase(T* head, const Annotation* tail);
T* curr_ = nullptr;
const Annotation* tail_ = nullptr;
};
using Iterator = IteratorBase<Annotation>;
using ConstIterator = IteratorBase<const Annotation>;
//! \brief Returns an iterator to the first element of the annotation list.
Iterator begin();
ConstIterator begin() const { return cbegin(); }
ConstIterator cbegin() const;
//! \brief Returns an iterator past the last element of the annotation list.
Iterator end();
ConstIterator end() const { return cend(); }
ConstIterator cend() const;
protected:
#if BUILDFLAG(IS_IOS)
friend class internal::InProcessIntermediateDumpHandler;
#endif
//! \brief Returns a pointer to the tail node.
const Annotation* tail_pointer() const { return tail_pointer_; }
//! \brief Returns a pointer to the head element.
const Annotation* head() const { return &head_; }
private:
// To make it easier for the handler to locate the dummy tail node, store the
// pointer. Placed first for packing.
const Annotation* const tail_pointer_;
// Dummy linked-list head and tail elements of \a Annotation::Type::kInvalid.
Annotation head_;
Annotation tail_;
};
} // namespace crashpad
#endif // CRASHPAD_CLIENT_ANNOTATION_LIST_H_
================================================
FILE: client/annotation_list_test.cc
================================================
// Copyright 2017 The Crashpad Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "client/annotation.h"
#include <algorithm>
#include <iterator>
#include <string>
#include <type_traits>
#include <vector>
#include "base/rand_util.h"
#include "client/crashpad_info.h"
#include "gtest/gtest.h"
#include "util/misc/clock.h"
#include "util/thread/thread.h"
namespace crashpad {
namespace test {
namespace {
#if (__cplusplus >= 202002L)
template <typename Iterator>
requires std::input_iterator<Iterator>
void VerifyIsInputIterator(Iterator) {}
#else
template <typename Iterator>
struct IsLegacyIteratorImpl {
static constexpr bool value =
std::is_copy_constructible_v<Iterator> &&
std::is_copy_assignable_v<Iterator> && std::is_destructible_v<Iterator> &&
std::is_swappable_v<Iterator> &&
// check that std::iterator_traits has the necessary types (check only one
// needed as std::iterator is required to define only if all are defined)
!std::is_same_v<typename std::iterator_traits<Iterator>::reference,
void> &&
std::is_same_v<decltype(++std::declval<Iterator>()), Iterator&> &&
!std::is_same_v<decltype(*std::declval<Iterator>()), void>;
};
template <typename Iterator>
struct IsLegacyInputIteratorImpl {
static constexpr bool value =
IsLegacyIteratorImpl<Iterator>::value &&
std::is_base_of_v<
std::input_iterator_tag,
typename std::iterator_traits<Iterator>::iterator_category> &&
std::is_convertible_v<decltype(std::declval<Iterator>() !=
std::declval<Iterator>()),
bool> &&
std::is_convertible_v<decltype(std::declval<Iterator>() ==
std::declval<Iterator>()),
bool> &&
std::is_same_v<decltype(*std::declval<Iterator>()),
typename std::iterator_traits<Iterator>::reference> &&
std::is_same_v<decltype(++std::declval<Iterator>()), Iterator&> &&
std::is_same_v<decltype(std::declval<Iterator>()++), Iterator> &&
std::is_same_v<decltype(*(++std::declval<Iterator>())),
typename std::iterator_traits<Iterator>::reference>;
};
template <typename Iterator>
void VerifyIsInputIterator(Iterator) {
static_assert(IsLegacyInputIteratorImpl<Iterator>::value);
}
#endif
TEST(AnnotationListStatic, Register) {
ASSERT_FALSE(AnnotationList::Get());
EXPECT_TRUE(AnnotationList::Register());
EXPECT_TRUE(AnnotationList::Get());
EXPECT_EQ(AnnotationList::Get(), AnnotationList::Register());
// This isn't expected usage of the AnnotationList API, but it is necessary
// for testing.
AnnotationList* list = AnnotationList::Get();
CrashpadInfo::GetCrashpadInfo()->set_annotations_list(nullptr);
delete list;
EXPECT_FALSE(AnnotationList::Get());
}
class AnnotationList : public testing::Test {
public:
void SetUp() override {
CrashpadInfo::GetCrashpadInfo()->set_annotations_list(&annotations_);
}
void TearDown() override {
CrashpadInfo::GetCrashpadInfo()->set_annotations_list(nullptr);
}
// NOTE: Annotations should be declared at file-scope, but in order to test
// them, they are declared as part of the test. These members are public so
// they are accessible from global helpers.
crashpad::StringAnnotation<8> one_{"First"};
crashpad::StringAnnotation<256> two_{"Second"};
crashpad::StringAnnotation<101> three_{"First"};
protected:
using AllAnnotations = std::vector<std::pair<std::string, std::string>>;
AllAnnotations CollectAnnotations() {
AllAnnotations annotations;
for (Annotation* curr : annotations_) {
if (!curr->is_set())
continue;
std::string value(static_cast<const char*>(curr->value()), curr->size());
annotations.push_back(std::make_pair(curr->name(), value));
}
return annotations;
}
bool ContainsNameValue(const AllAnnotations& annotations,
const std::string& name,
const std::string& value) {
return std::find(annotations.begin(),
annotations.end(),
std::make_pair(name, value)) != annotations.end();
}
crashpad::AnnotationList annotations_;
};
TEST_F(AnnotationList, SetAndClear) {
one_.Set("this is a value longer than 8 bytes");
AllAnnotations annotations = CollectAnnotations();
EXPECT_EQ(1u, annotations.size());
EXPECT_TRUE(ContainsNameValue(annotations, "First", "this is "));
one_.Clear();
EXPECT_EQ(0u, CollectAnnotations().size());
one_.Set("short");
two_.Set(std::string(500, 'A').data());
annotations = CollectAnnotations();
EXPECT_EQ(2u, annotations.size());
EXPECT_EQ(5u, one_.size());
EXPECT_EQ(256u, two_.size());
EXPECT_TRUE(ContainsNameValue(annotations, "First", "short"));
EXPECT_TRUE(ContainsNameValue(annotations, "Second", std::string(256, 'A')));
}
TEST_F(AnnotationList, DuplicateKeys) {
ASSERT_EQ(0u, CollectAnnotations().size());
one_.Set("1");
three_.Set("2");
AllAnnotations annotations = CollectAnnotations();
EXPECT_EQ(2u, annotations.size());
EXPECT_TRUE(ContainsNameValue(annotations, "First", "1"));
EXPECT_TRUE(ContainsNameValue(annotations, "First", "2"));
one_.Clear();
annotations = CollectAnnotations();
EXPECT_EQ(1u, annotations.size());
}
TEST_F(AnnotationList, IteratorSingleAnnotation) {
ASSERT_EQ(annotations_.begin(), annotations_.end());
ASSERT_EQ(annotations_.cbegin(), annotations_.cend());
one_.Set("1");
auto iterator = annotations_.begin();
auto const_iterator = annotations_.cbegin();
ASSERT_NE(iterator, annotations_.end());
ASSERT_NE(const_iterator, annotations_.cend());
EXPECT_EQ(*iterator, &one_);
EXPECT_EQ(*const_iterator, &one_);
++iterator;
++const_iterator;
EXPECT_EQ(iterator, annotations_.end());
EXPECT_EQ(const_iterator, annotations_.cend());
}
TEST_F(AnnotationList, IteratorMultipleAnnotationsInserted) {
ASSERT_EQ(annotations_.begin(), annotations_.end());
ASSERT_EQ(annotations_.cbegin(), annotations_.cend());
one_.Set("1");
two_.Set("2");
// New annotations are inserted to the beginning of the list. Hence, |two_|
// must be the first annotation, followed by |one_|.
{
auto iterator = annotations_.begin();
auto const_iterator = annotations_.cbegin();
ASSERT_NE(iterator, annotations_.end());
ASSERT_NE(const_iterator, annotations_.cend());
EXPECT_EQ(*iterator, &two_);
EXPECT_EQ(*const_iterator, &two_);
++iterator;
++const_iterator;
ASSERT_NE(iterator, annotations_.end());
ASSERT_NE(const_iterator, annotations_.cend());
EXPECT_EQ(*iterator, &one_);
EXPECT_EQ(*const_iterator, &one_);
++iterator;
++const_iterator;
EXPECT_EQ(iterator, annotations_.end());
EXPECT_EQ(const_iterator, annotations_.cend());
}
}
TEST_F(AnnotationList, IteratorMultipleAnnotationsInsertedAndRemoved) {
ASSERT_EQ(annotations_.begin(), annotations_.end());
ASSERT_EQ(annotations_.cbegin(), annotations_.cend());
one_.Set("1");
two_.Set("2");
one_.Clear();
two_.Clear();
// Even after clearing, Annotations are still inserted in the list and
// reachable via the iterators.
auto iterator = annotations_.begin();
auto const_iterator = annotations_.cbegin();
ASSERT_NE(iterator, annotations_.end());
ASSERT_NE(const_iterator, annotations_.cend());
EXPECT_EQ(*iterator, &two_);
EXPECT_EQ(*const_iterator, &two_);
++iterator;
++const_iterator;
ASSERT_NE(iterator, annotations_.end());
ASSERT_NE(const_iterator, annotations_.cend());
EXPECT_EQ(*iterator, &one_);
EXPECT_EQ(*const_iterator, &one_);
++iterator;
++const_iterator;
EXPECT_EQ(iterator, annotations_.end());
EXPECT_EQ(const_iterator, annotations_.cend());
}
TEST_F(AnnotationList, IteratorIsInputIterator) {
one_.Set("1");
two_.Set("2");
// Check explicitly that the iterators meet the interface of an input
// iterator.
VerifyIsInputIterator(annotations_.begin());
VerifyIsInputIterator(annotations_.cbegin());
VerifyIsInputIterator(annotations_.end());
VerifyIsInputIterator(annotations_.cend());
// Additionally verify that std::distance accepts the iterators. It requires
// the iterators to comply to the input iterator interface.
EXPECT_EQ(std::distance(annotations_.begin(), annotations_.end()), 2);
EXPECT_EQ(std::distance(annotations_.cbegin(), annotations_.cend()), 2);
}
class RaceThread : public Thread {
public:
explicit RaceThread(test::AnnotationList* test) : Thread(), test_(test) {}
private:
void ThreadMain() override {
for (int i = 0; i <= 50; ++i) {
if (i % 2 == 0) {
test_->three_.Set("three");
test_->two_.Clear();
} else {
test_->three_.Clear();
}
SleepNanoseconds(base::RandInt(1, 1000));
}
}
test::AnnotationList* test_;
};
TEST_F(AnnotationList, MultipleThreads) {
ASSERT_EQ(0u, CollectAnnotations().size());
RaceThread other_thread(this);
other_thread.Start();
for (int i = 0; i <= 50; ++i) {
if (i % 2 == 0) {
one_.Set("one");
two_.Set("two");
} else {
one_.Clear();
}
SleepNanoseconds(base::RandInt(1, 1000));
}
other_thread.Join();
AllAnnotations annotations = CollectAnnotations();
EXPECT_GE(annotations.size(), 2u);
EXPECT_LE(annotations.size(), 3u);
EXPECT_TRUE(ContainsNameValue(annotations, "First", "one"));
EXPECT_TRUE(ContainsNameValue(annotations, "First", "three"));
if (annotations.size() == 3) {
EXPECT_TRUE(ContainsNameValue(annotations, "Second", "two"));
}
}
} // namespace
} // namespace test
} // namespace crashpad
================================================
FILE: client/annotation_test.cc
================================================
// Copyright 2017 The Crashpad Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "client/annotation.h"
#include <array>
#include <string>
#include "client/annotation_list.h"
#include "client/crashpad_info.h"
#include "gtest/gtest.h"
#include "test/gtest_death.h"
#include "util/misc/clock.h"
#include "util/synchronization/scoped_spin_guard.h"
#include "util/thread/thread.h"
namespace crashpad {
namespace test {
namespace {
class SpinGuardAnnotation final : public Annotation {
public:
SpinGuardAnnotation(Annotation::Type type, const char name[])
: Annotation(type,
name,
&value_,
ConcurrentAccessGuardMode::kScopedSpinGuard) {}
bool Set(bool value, uint64_t spin_guard_timeout_ns) {
auto guard = TryCreateScopedSpinGuard(spin_guard_timeout_ns);
if (!guard) {
return false;
}
value_ = value;
SetSize(sizeof(value_));
return true;
}
private:
bool value_;
};
class ScopedSpinGuardUnlockThread final : public Thread {
public:
ScopedSpinGuardUnlockThread(ScopedSpinGuard scoped_spin_guard,
uint64_t sleep_time_ns)
: scoped_spin_guard_(std::move(scoped_spin_guard)),
sleep_time_ns_(sleep_time_ns) {}
private:
void ThreadMain() override {
SleepNanoseconds(sleep_time_ns_);
// Move the ScopedSpinGuard member into a local variable which is
// destroyed when ThreadMain() returns.
ScopedSpinGuard local_scoped_spin_guard(std::move(scoped_spin_guard_));
// After this point, local_scoped_spin_guard will be destroyed and unlocked.
}
ScopedSpinGuard scoped_spin_guard_;
const uint64_t sleep_time_ns_;
};
class Annotation : public testing::Test {
public:
void SetUp() override {
CrashpadInfo::GetCrashpadInfo()->set_annotations_list(&annotations_);
}
void TearDown() override {
CrashpadInfo::GetCrashpadInfo()->set_annotations_list(nullptr);
}
size_t AnnotationsCount() {
size_t result = 0;
for (auto* annotation : annotations_) {
if (annotation->is_set())
++result;
}
return result;
}
protected:
crashpad::AnnotationList annotations_;
};
TEST_F(Annotation, Basics) {
constexpr crashpad::Annotation::Type kType =
crashpad::Annotation::UserDefinedType(1);
const char kName[] = "annotation 1";
char buffer[1024];
crashpad::Annotation annotation(kType, kName, buffer);
EXPECT_FALSE(annotation.is_set());
EXPECT_EQ(0u, AnnotationsCount());
EXPECT_EQ(kType, annotation.type());
EXPECT_EQ(0u, annotation.size());
EXPECT_EQ(std::string(kName), annotation.name());
EXPECT_EQ(buffer, annotation.value());
annotation.SetSize(10);
EXPECT_TRUE(annotation.is_set());
EXPECT_EQ(1u, AnnotationsCount());
EXPECT_EQ(10u, annotation.size());
EXPECT_EQ(&annotation, *annotations_.begin());
annotation.Clear();
EXPECT_FALSE(annotation.is_set());
EXPECT_EQ(0u, AnnotationsCount());
EXPECT_EQ(0u, annotation.size());
}
TEST_F(Annotation, StringType) {
crashpad::StringAnnotation<5> annotation("name");
EXPECT_FALSE(annotation.is_set());
EXPECT_EQ(crashpad::Annotation::Type::kString, annotation.type());
EXPECT_EQ(0u, annotation.size());
EXPECT_EQ(std::string("name"), annotation.name());
EXPECT_EQ(0u, annotation.value().size());
annotation.Set("test");
EXPECT_TRUE(annotation.is_set());
EXPECT_EQ(1u, AnnotationsCount());
EXPECT_EQ(4u, annotation.size());
EXPECT_EQ("test", annotation.value());
annotation.Set(std::string("loooooooooooong"));
EXPECT_TRUE(annotation.is_set());
EXPECT_EQ(1u, AnnotationsCount());
EXPECT_EQ(5u, annotation.size());
EXPECT_EQ("loooo", annotation.value());
}
TEST_F(Annotation, BaseAnnotationShouldNotSupportSpinGuard) {
char buffer[1024];
crashpad::Annotation annotation(
crashpad::Annotation::Type::kString, "no-spin-guard", buffer);
EXPECT_EQ(annotation.concurrent_access_guard_mode(),
crashpad::Annotation::ConcurrentAccessGuardMode::kUnguarded);
#if !DCHECK_IS_ON()
// This fails a DCHECK() in debug builds, so only test it when DCHECK()
// is not on.
EXPECT_EQ(std::nullopt, annotation.TryCreateScopedSpinGuard(0));
#endif
}
TEST_F(Annotation, CustomAnnotationShouldSupportSpinGuardAndSet) {
constexpr crashpad::Annotation::Type kType =
crashpad::Annotation::UserDefinedType(1);
SpinGuardAnnotation spin_guard_annotation(kType, "spin-guard");
EXPECT_EQ(spin_guard_annotation.concurrent_access_guard_mode(),
crashpad::Annotation::ConcurrentAccessGuardMode::kScopedSpinGuard);
EXPECT_TRUE(spin_guard_annotation.Set(true, 0));
EXPECT_EQ(1U, spin_guard_annotation.size());
}
TEST_F(Annotation, CustomAnnotationSetShouldFailIfRunConcurrently) {
constexpr crashpad::Annotation::Type kType =
crashpad::Annotation::UserDefinedType(1);
SpinGuardAnnotation spin_guard_annotation(kType, "spin-guard");
auto guard = spin_guard_annotation.TryCreateScopedSpinGuard(0);
EXPECT_NE(std::nullopt, guard);
// This should fail, since the guard is already held and the timeout is 0.
EXPECT_FALSE(spin_guard_annotation.Set(true, 0));
}
TEST_F(Annotation,
CustomAnnotationSetShouldSucceedIfSpinGuardUnlockedAsynchronously) {
constexpr crashpad::Annotation::Type kType =
crashpad::Annotation::UserDefinedType(1);
SpinGuardAnnotation spin_guard_annotation(kType, "spin-guard");
auto guard = spin_guard_annotation.TryCreateScopedSpinGuard(0);
EXPECT_NE(std::nullopt, guard);
// Pass the guard off to a background thread which unlocks it after 1 ms.
constexpr uint64_t kSleepTimeNs = 1000000; // 1 ms
ScopedSpinGuardUnlockThread unlock_thread(std::move(guard.value()),
kSleepTimeNs);
unlock_thread.Start();
// Try to set the annotation with a 100 ms timeout.
constexpr uint64_t kSpinGuardTimeoutNanos = 100000000; // 100 ms
// This should succeed after 1 ms, since the timeout is much larger than the
// time the background thread holds the guard.
EXPECT_TRUE(spin_guard_annotation.Set(true, kSpinGuardTimeoutNanos));
unlock_thread.Join();
}
TEST(StringAnnotation, ArrayOfString) {
static crashpad::StringAnnotation<4> annotations[] = {
{"test-1", crashpad::StringAnnotation<4>::Tag::kArray},
{"test-2", crashpad::StringAnnotation<4>::Tag::kArray},
{"test-3", crashpad::StringAnnotation<4>::Tag::kArray},
{"test-4", crashpad::StringAnnotation<4>::Tag::kArray},
};
for (auto& annotation : annotations) {
EXPECT_FALSE(annotation.is_set());
}
}
#if DCHECK_IS_ON()
TEST(AnnotationDeathTest, EmbeddedNUL) {
crashpad::StringAnnotation<5> annotation("name");
EXPECT_DEATH_CHECK(annotation.Set(std::string("te\0st", 5)), "embedded NUL");
}
#endif
} // namespace
} // namespace test
} // namespace crashpad
================================================
FILE: client/client_argv_handling.cc
================================================
// Copyright 2018 The Crashpad Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "client/client_argv_handling.h"
#include "base/strings/stringprintf.h"
namespace crashpad {
namespace {
std::string FormatArgumentString(const std::string& name,
const std::string& value) {
return base::StringPrintf("--%s=%s", name.c_str(), value.c_str());
}
} // namespace
std::vector<std::string> BuildHandlerArgvStrings(
const base::FilePath& handler,
const base::FilePath& database,
const base::FilePath& metrics_dir,
const std::string& url,
const std::map<std::string, std::string>& annotations,
const std::vector<std::string>& arguments,
const std::vector<base::FilePath>& attachments) {
std::vector<std::string> argv_strings(1, handler.value());
for (const auto& argument : arguments) {
argv_strings.push_back(argument);
}
if (!database.empty()) {
argv_strings.push_back(FormatArgumentString("database", database.value()));
}
if (!metrics_dir.empty()) {
argv_strings.push_back(
FormatArgumentString("metrics-dir", metrics_dir.value()));
}
if (!url.empty()) {
argv_strings.push_back(FormatArgumentString("url", url));
}
for (const auto& kv : annotations) {
argv_strings.push_back(
FormatArgumentString("annotation", kv.first + '=' + kv.second));
}
for (const auto& attachment : attachments) {
argv_strings.push_back(
FormatArgumentString("attachment", attachment.value()));
}
return argv_strings;
}
void StringVectorToCStringVector(const std::vector<std::string>& strings,
std::vector<const char*>* c_strings) {
c_strings->clear();
c_strings->reserve(strings.size() + 1);
for (const auto& str : strings) {
c_strings->push_back(str.c_str());
}
c_strings->push_back(nullptr);
}
} // namespace crashpad
================================================
FILE: client/client_argv_handling.h
================================================
// Copyright 2018 The Crashpad Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef CRASHPAD_CLIENT_CLIENT_ARGV_HANDLING_H_
#define CRASHPAD_CLIENT_CLIENT_ARGV_HANDLING_H_
#include <map>
#include <string>
#include <vector>
#include "base/files/file_path.h"
namespace crashpad {
//! \brief Builds a vector of arguments suitable for invoking a handler process
//! based on arguments passed to StartHandler-type().
//!
//! See StartHandlerAtCrash() for documentation on the input arguments.
//!
//! \return A vector of arguments suitable for starting the handler with.
std::vector<std::string> BuildHandlerArgvStrings(
const base::FilePath& handler,
const base::FilePath& database,
const base::FilePath& metrics_dir,
const std::string& url,
const std::map<std::string, std::string>& annotations,
const std::vector<std::string>& arguments,
const std::vector<base::FilePath>& attachments = {});
//! \brief Flattens a string vector into a const char* vector suitable for use
//! in an exec() call.
//!
//! \param[in] strings A vector of string data. This vector must remain valid
//! for the lifetime of \a c_strings.
//! \param[out] c_strings A vector of pointers to the string data in \a strings.
void StringVectorToCStringVector(const std::vector<std::string>& strings,
std::vector<const char*>* c_strings);
} // namespace crashpad
#endif // CRASHPAD_CLIENT_CLIENT_ARGV_HANDLING_H_
================================================
FILE: client/crash_handler_base_ios.cc
================================================
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "client/crash_handler_base_ios.h"
#include "base/logging.h"
#include "util/posix/signals.h"
namespace crashpad {
CrashHandlerBase::CrashHandlerBase() = default;
CrashHandlerBase::~CrashHandlerBase() = default;
bool CrashHandlerBase::Initialize(
const base::FilePath& database,
const std::string& url,
const std::map<std::string, std::string>& annotations,
internal::InProcessHandler::ProcessPendingReportsObservationCallback
callback) {
INITIALIZATION_STATE_SET_INITIALIZING(initialized_);
if (!in_process_handler().Initialize(database, url, annotations, callback)) {
LOG(ERROR) << "Unable to initialize Crashpad.";
return false;
}
if (!DoInitialize()) {
return false;
}
INITIALIZATION_STATE_SET_VALID(initialized_);
return true;
}
void CrashHandlerBase::ProcessIntermediateDumps(
const std::map<std::string, std::string>& annotations,
const UserStreamDataSources* user_stream_sources) {
in_process_handler_.ProcessIntermediateDumps(annotations,
user_stream_sources);
}
void CrashHandlerBase::ProcessIntermediateDump(
const base::FilePath& file,
const std::map<std::string, std::string>& annotations) {
in_process_handler_.ProcessIntermediateDump(file, annotations);
}
void CrashHandlerBase::DumpWithoutCrash(NativeCPUContext* context,
bool process_dump) {
INITIALIZATION_STATE_DCHECK_VALID(initialized_);
base::FilePath path;
if (!in_process_handler_.DumpExceptionFromSimulatedMachException(
context, kMachExceptionSimulated, &path)) {
return;
}
if (process_dump) {
in_process_handler_.ProcessIntermediateDump(path);
}
}
void CrashHandlerBase::DumpWithoutCrashAtPath(NativeCPUContext* context,
const base::FilePath& path) {
in_process_handler_.DumpExceptionFromSimulatedMachExceptionAtPath(
context, kMachExceptionSimulated, path);
}
void CrashHandlerBase::StartProcessingPendingReports(
UploadBehavior upload_behavior) {
INITIALIZATION_STATE_DCHECK_VALID(initialized_);
in_process_handler_.StartProcessingPendingReports(upload_behavior);
}
void CrashHandlerBase::SetExceptionCallbackForTesting(void (*callback)()) {
in_process_handler_.SetExceptionCallbackForTesting(callback);
}
void CrashHandlerBase::HandleAndReraiseSignal(int signo,
siginfo_t* siginfo,
ucontext_t* context,
struct sigaction* old_action) {
in_process_handler_.DumpExceptionFromSignal(siginfo, context);
// Always call system handler.
Signals::RestoreHandlerAndReraiseSignalOnReturn(siginfo, old_action);
}
void CrashHandlerBase::HandleUncaughtNSException(const uint64_t* frames,
const size_t num_frames) {
in_process_handler_.DumpExceptionFromNSExceptionWithFrames(frames,
num_frames);
// After uncaught exceptions are reported, the system immediately triggers a
// call to std::terminate()/abort(). Remove the abort handler so a second
// dump isn't generated.
CHECK(Signals::InstallDefaultHandler(SIGABRT));
}
void CrashHandlerBase::HandleUncaughtNSExceptionWithContext(
NativeCPUContext* context) {
base::FilePath path;
in_process_handler_.DumpExceptionFromSimulatedMachException(
context, kMachExceptionFromNSException, &path);
// After uncaught exceptions are reported, the system immediately triggers a
// call to std::terminate()/abort(). Remove the abort handler so a second
// dump isn't generated.
CHECK(Signals::InstallDefaultHandler(SIGABRT));
}
void CrashHandlerBase::HandleUncaughtNSExceptionWithContextAtPath(
NativeCPUContext* context,
const base::FilePath& path) {
in_process_handler_.DumpExceptionFromSimulatedMachExceptionAtPath(
context, kMachExceptionFromNSException, path);
}
bool CrashHandlerBase::MoveIntermediateDumpAtPathToPending(
const base::FilePath& path) {
if (in_process_handler_.MoveIntermediateDumpAtPathToPending(path)) {
// After uncaught exceptions are reported, the system immediately triggers
// a call to std::terminate()/abort(). Remove the abort handler so a
// second dump isn't generated.
CHECK(Signals::InstallDefaultHandler(SIGABRT));
return true;
}
return false;
}
} // namespace crashpad
================================================
FILE: client/crash_handler_base_ios.h
================================================
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CRASHPAD_CLIENT_CRASH_HANDLER_BASE_IOS_H_
#define CRASHPAD_CLIENT_CRASH_HANDLER_BASE_IOS_H_
#include <stdint.h>
#include <sys/signal.h>
#include <map>
#include <string>
#include "base/files/file_path.h"
#include "client/ios_handler/exception_processor.h"
#include "client/ios_handler/in_process_handler.h"
#include "client/upload_behavior_ios.h"
#include "util/misc/capture_context.h"
#include "util/misc/initialization_state_dcheck.h"
namespace crashpad {
// Base class shared by the iOS and tvOS CrashHandler implementations.
class CrashHandlerBase : public ObjcExceptionDelegate {
public:
CrashHandlerBase(const CrashHandlerBase&) = delete;
CrashHandlerBase& operator=(const CrashHandlerBase&) = delete;
bool Initialize(
const base::FilePath& database,
const std::string& url,
const std::map<std::string, std::string>& annotations,
internal::InProcessHandler::ProcessPendingReportsObservationCallback
callback);
void ProcessIntermediateDumps(
const std::map<std::string, std::string>& annotations,
const UserStreamDataSources* user_stream_sources);
void ProcessIntermediateDump(
const base::FilePath& file,
const std::map<std::string, std::string>& annotations);
void DumpWithoutCrash(NativeCPUContext* context, bool process_dump);
void DumpWithoutCrashAtPath(NativeCPUContext* context,
const base::FilePath& path);
void StartProcessingPendingReports(UploadBehavior upload_behavior);
void SetExceptionCallbackForTesting(void (*callback)());
protected:
CrashHandlerBase();
virtual ~CrashHandlerBase();
// Subclasses are expected to install signal handlers and set up Mach ports in
// this function.
virtual bool DoInitialize() = 0;
void HandleAndReraiseSignal(int signo,
siginfo_t* siginfo,
ucontext_t* context,
struct sigaction* old_action);
internal::InProcessHandler& in_process_handler() {
return in_process_handler_;
}
private:
// ObjcExceptionDelegate overrides:
void HandleUncaughtNSException(const uint64_t* frames,
const size_t num_frames) override;
void HandleUncaughtNSExceptionWithContext(NativeCPUContext* context) override;
void HandleUncaughtNSExceptionWithContextAtPath(
NativeCPUContext* context,
const base::FilePath& path) override;
bool MoveIntermediateDumpAtPathToPending(const base::FilePath& path) override;
internal::InProcessHandler in_process_handler_;
InitializationStateDcheck initialized_;
};
} // namespace crashpad
#endif // CRASHPAD_CLIENT_CRASH_HANDLER_BASE_IOS_H_
================================================
FILE: client/crash_handler_ios.cc
================================================
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "client/crash_handler_ios.h"
#include <sys/sysctl.h>
#include <unistd.h>
#include <iterator>
#include "base/apple/mach_logging.h"
#include "util/ios/raw_logging.h"
#include "util/mach/mach_extensions.h"
#include "util/mach/mach_message.h"
#include "util/mach/mach_message_server.h"
#include "util/posix/signals.h"
namespace {
bool IsBeingDebugged() {
int mib[] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()};
size_t len = sizeof(kinfo_proc);
kinfo_proc kern_proc_info;
if (sysctl(mib, std::size(mib), &kern_proc_info, &len, nullptr, 0) == 0) {
return kern_proc_info.kp_proc.p_flag & P_TRACED;
}
return false;
}
} // namespace
namespace crashpad {
CrashHandler::ThreadSafeScopedMachPortWithReceiveRight::
ThreadSafeScopedMachPortWithReceiveRight()
: port_(NewMachPort(MACH_PORT_RIGHT_RECEIVE)) {}
CrashHandler::ThreadSafeScopedMachPortWithReceiveRight::
~ThreadSafeScopedMachPortWithReceiveRight() {
reset();
}
mach_port_t CrashHandler::ThreadSafeScopedMachPortWithReceiveRight::get() {
return port_.load();
}
void CrashHandler::ThreadSafeScopedMachPortWithReceiveRight::reset() {
mach_port_t old_port = port_.exchange(MACH_PORT_NULL);
if (old_port == MACH_PORT_NULL) {
// Already reset, nothing to do.
return;
}
kern_return_t kr = mach_port_mod_refs(
mach_task_self(), old_port, MACH_PORT_RIGHT_RECEIVE, -1);
MACH_LOG_IF(ERROR, kr != KERN_SUCCESS, kr)
<< "ThreadSafeScopedMachPortWithReceiveRight mach_port_mod_refs";
kr = mach_port_deallocate(mach_task_self(), old_port);
MACH_LOG_IF(ERROR, kr != KERN_SUCCESS, kr)
<< "ThreadSafeScopedMachPortWithReceiveRight mach_port_deallocate";
}
CrashHandler* CrashHandler::instance_ = nullptr;
CrashHandler::CrashHandler() = default;
CrashHandler::~CrashHandler() {
UninstallObjcExceptionPreprocessor();
// Reset the SIGPIPE handler only if the current handler is the
// one installed by DoInitialize(). In other words, if an
// application has set its own SIGPIPE handler after initializing
// Crashpad, there is no need to change the signal handler here.
struct sigaction sa;
if (sigaction(SIGPIPE, nullptr, &sa) == 0 &&
sa.sa_sigaction == CatchAndReraiseSignalDefaultAction) {
Signals::InstallDefaultHandler(SIGPIPE);
}
Signals::InstallDefaultHandler(SIGABRT);
UninstallMachExceptionHandler();
}
// static
CrashHandler* CrashHandler::Get() {
if (!instance_)
instance_ = new CrashHandler();
return instance_;
}
// static
void CrashHandler::ResetForTesting() {
delete instance_;
instance_ = nullptr;
}
bool CrashHandler::DoInitialize() {
if (!InstallMachExceptionHandler() ||
// xnu turns hardware faults into Mach exceptions, so the only signal
// left to register is SIGABRT, which never starts off as a hardware
// fault. Installing a handler for other signals would lead to
// recording exceptions twice. As a consequence, Crashpad will not
// generate intermediate dumps for anything manually calling
// raise(SIG*). In practice, this doesn’t actually happen for crash
// signals that originate as hardware faults.
!Signals::InstallHandler(
SIGABRT, CatchAndReraiseSignal, 0, &old_action_)) {
return false;
}
// For applications that haven't ignored or set a handler for SIGPIPE:
// It’s OK for an application to set its own SIGPIPE handler (including
// SIG_IGN) before initializing Crashpad, because Crashpad will discover the
// existing handler and not install its own.
// It’s OK for Crashpad to install its own SIGPIPE handler and for the
// application to subsequently install its own (including SIG_IGN)
// afterwards, because its handler will replace Crashpad’s.
// This is useful to cover the default situation where nobody installs a
// SIGPIPE handler and the disposition is at SIG_DFL, because SIGPIPE is a
// “kill” signal (bsd/sys/signalvar.h sigprop). In that case, without
// Crashpad, SIGPIPE results in a silent and unreported kill (and not even
// ReportCrash will record it), but developers probably want to be alerted to
// the condition.
struct sigaction sa;
if (sigaction(SIGPIPE, nullptr, &sa) == 0 && sa.sa_handler == SIG_DFL) {
Signals::InstallHandler(
SIGPIPE, CatchAndReraiseSignalDefaultAction, 0, nullptr);
}
InstallObjcExceptionPreprocessor(this);
return true;
}
bool CrashHandler::InstallMachExceptionHandler() {
mach_port_t exception_port = exception_port_.get();
if (exception_port == MACH_PORT_NULL) {
return false;
}
kern_return_t kr = mach_port_insert_right(mach_task_self(),
exception_port,
exception_port,
MACH_MSG_TYPE_MAKE_SEND);
if (kr != KERN_SUCCESS) {
MACH_LOG(ERROR, kr) << "mach_port_insert_right";
return false;
}
// TODO: Use SwapExceptionPort instead and put back EXC_MASK_BREAKPOINT.
// Until then, remove |EXC_MASK_BREAKPOINT| while attached to a debugger.
exception_mask_t mask =
ExcMaskAll() &
~(EXC_MASK_EMULATION | EXC_MASK_SOFTWARE | EXC_MASK_RPC_ALERT |
EXC_MASK_GUARD | (IsBeingDebugged() ? EXC_MASK_BREAKPOINT : 0));
exception_behavior_t behavior = EXCEPTION_STATE_IDENTITY;
if (__builtin_available(iOS 18.0, *)) {
behavior = EXCEPTION_STATE_IDENTITY_PROTECTED;
}
ExceptionPorts exception_ports(ExceptionPorts::kTargetTypeTask, TASK_NULL);
if (!exception_ports.GetExceptionPorts(mask, &original_handlers_) ||
!exception_ports.SetExceptionPort(mask,
exception_port,
behavior | MACH_EXCEPTION_CODES,
MACHINE_THREAD_STATE)) {
return false;
}
mach_handler_running_ = true;
Start();
return true;
}
void CrashHandler::UninstallMachExceptionHandler() {
mach_handler_running_ = false;
exception_port_.reset();
Join();
}
// Thread:
void CrashHandler::ThreadMain() {
UniversalMachExcServer universal_mach_exc_server(this);
while (mach_handler_running_) {
mach_msg_return_t mr =
MachMessageServer::Run(&universal_mach_exc_server,
exception_port_.get(),
MACH_MSG_OPTION_NONE,
MachMessageServer::kPersistent,
MachMessageServer::kReceiveLargeIgnore,
kMachMessageTimeoutWaitIndefinitely);
MACH_CHECK(
mach_handler_running_
? mr == MACH_SEND_INVALID_DEST // This shouldn't happen for
// exception messages that come
// from the kernel itself, but if
// something else in-process sends
// exception messages and breaks,
// handle that case.
: (mr == MACH_RCV_PORT_CHANGED || // Port was closed while the
// thread was listening.
mr == MACH_RCV_INVALID_NAME), // Port was closed before the
// thread started listening.
mr)
<< "MachMessageServer::Run";
}
}
// UniversalMachExcServer::Interface:
kern_return_t CrashHandler::CatchMachException(
exception_behavior_t behavior,
exception_handler_t exception_port,
thread_t thread,
task_t task,
exception_type_t exception,
const mach_exception_data_type_t* code,
mach_msg_type_number_t code_count,
thread_state_flavor_t* flavor,
ConstThreadState old_state,
mach_msg_type_number_t old_state_count,
thread_state_t new_state,
mach_msg_type_number_t* new_state_count,
const mach_msg_trailer_t* trailer,
bool* destroy_complex_request) {
*destroy_complex_request = true;
// TODO(justincohen): Forward exceptions to original_handlers_ with
// UniversalExceptionRaise.
// iOS shouldn't have any child processes, but just in case, those will
// inherit the task exception ports, and this process isn’t prepared to
// handle them
if (task != mach_task_self()) {
CRASHPAD_RAW_LOG("MachException task != mach_task_self()");
return KERN_FAILURE;
}
HandleMachException(behavior,
thread,
exception,
code,
code_count,
*flavor,
old_state,
old_state_count);
// Respond with KERN_FAILURE so the system will continue to handle this
// exception. xnu will turn this Mach exception into a signal and take the
// default action to terminate the process. However, if sigprocmask is
// called before this Mach exception returns (such as by another thread
// calling abort, see: Libc-1506.40.4/stdlib/FreeBSD/abort.c), the Mach
// exception will be converted into a signal but delivery will be blocked.
// Since concurrent exceptions lead to the losing thread sleeping
// indefinitely, if the abort thread never returns, the thread that
// triggered this Mach exception will repeatedly trap and the process will
// never terminate. If the abort thread didn’t have a user-space signal
// handler that slept forever, the abort would terminate the process even if
// all other signals had been blocked. Instead, unblock all signals
// corresponding to all Mach exceptions Crashpad is registered for before
// returning KERN_FAILURE. There is still racy behavior possible with this
// call to sigprocmask, but the repeated calls to CatchMachException here
// will eventually lead to termination.
sigset_t unblock_set;
sigemptyset(&unblock_set);
sigaddset(&unblock_set, SIGILL); // EXC_BAD_INSTRUCTION
sigaddset(&unblock_set, SIGTRAP); // EXC_BREAKPOINT
sigaddset(&unblock_set, SIGFPE); // EXC_ARITHMETIC
sigaddset(&unblock_set, SIGBUS); // EXC_BAD_ACCESS
sigaddset(&unblock_set, SIGSEGV); // EXC_BAD_ACCESS
if (sigprocmask(SIG_UNBLOCK, &unblock_set, nullptr) != 0) {
CRASHPAD_RAW_LOG("sigprocmask");
}
return KERN_FAILURE;
}
void CrashHandler::HandleMachException(exception_behavior_t behavior,
thread_t thread,
exception_type_t exception,
const mach_exception_data_type_t* code,
mach_msg_type_number_t code_count,
thread_state_flavor_t flavor,
ConstThreadState old_state,
mach_msg_type_number_t old_state_count) {
in_process_handler().DumpExceptionFromMachException(behavior,
thread,
exception,
code,
code_count,
flavor,
old_state,
old_state_count);
}
// static
void CrashHandler::CatchAndReraiseSignal(int signo,
siginfo_t* siginfo,
void* context) {
Get()->HandleAndReraiseSignal(signo,
siginfo,
reinterpret_cast<ucontext_t*>(context),
&(Get()->old_action_));
}
// static
void CrashHandler::CatchAndReraiseSignalDefaultAction(int signo,
siginfo_t* siginfo,
void* context) {
Get()->HandleAndReraiseSignal(
signo, siginfo, reinterpret_cast<ucontext_t*>(context), nullptr);
}
} // namespace crashpad
================================================
FILE: client/crash_handler_ios.h
================================================
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CRASHPAD_CLIENT_CRASH_HANDLER_IOS_H_
#define CRASHPAD_CLIENT_CRASH_HANDLER_IOS_H_
#include <atomic>
#include "client/crash_handler_base_ios.h"
#include "util/mach/exc_server_variants.h"
#include "util/mach/exception_ports.h"
#include "util/thread/thread.h"
namespace crashpad {
// A base class for signal handler and Mach exception server.
class CrashHandler : public Thread,
public UniversalMachExcServer::Interface,
public CrashHandlerBase {
public:
CrashHandler(const CrashHandler&) = delete;
CrashHandler& operator=(const CrashHandler&) = delete;
static CrashHandler* Get();
static void ResetForTesting();
private:
// Thread-safe version of `base::apple::ScopedMachReceiveRight` which
// allocates the Mach port upon construction and deallocates it upon
// destruction.
class ThreadSafeScopedMachPortWithReceiveRight {
public:
ThreadSafeScopedMachPortWithReceiveRight();
ThreadSafeScopedMachPortWithReceiveRight(
const ThreadSafeScopedMachPortWithReceiveRight&) = delete;
ThreadSafeScopedMachPortWithReceiveRight& operator=(
const ThreadSafeScopedMachPortWithReceiveRight&) = delete;
~ThreadSafeScopedMachPortWithReceiveRight();
mach_port_t get();
void reset();
private:
std::atomic<mach_port_t> port_;
};
CrashHandler();
~CrashHandler() override;
bool DoInitialize() override;
bool InstallMachExceptionHandler();
void UninstallMachExceptionHandler();
// Thread:
void ThreadMain() override;
// UniversalMachExcServer::Interface:
kern_return_t CatchMachException(exception_behavior_t behavior,
exception_handler_t exception_port,
thread_t thread,
task_t task,
exception_type_t exception,
const mach_exception_data_type_t* code,
mach_msg_type_number_t code_count,
thread_state_flavor_t* flavor,
ConstThreadState old_state,
mach_msg_type_number_t old_state_count,
thread_state_t new_state,
mach_msg_type_number_t* new_state_count,
const mach_msg_trailer_t* trailer,
bool* destroy_complex_request) override;
void HandleMachException(exception_behavior_t behavior,
thread_t thread,
exception_type_t exception,
const mach_exception_data_type_t* code,
mach_msg_type_number_t code_count,
thread_state_flavor_t flavor,
ConstThreadState old_state,
mach_msg_type_number_t old_state_count);
// The signal handler installed at OS-level.
static void CatchAndReraiseSignal(int signo,
siginfo_t* siginfo,
void* context);
static void CatchAndReraiseSignalDefaultAction(int signo,
siginfo_t* siginfo,
void* context);
ThreadSafeScopedMachPortWithReceiveRight exception_port_;
ExceptionPorts::ExceptionHandlerVector original_handlers_;
struct sigaction old_action_ = {};
static CrashHandler* instance_;
std::atomic<bool> mach_handler_running_ = false;
};
} // namespace crashpad
#endif // CRASHPAD_CLIENT_CRASH_HANDLER_IOS_H_
================================================
FILE: client/crash_handler_tvos.cc
================================================
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "client/crash_handler_tvos.h"
#include <sys/signal.h>
#include "util/posix/signals.h"
#include "util/thread/thread.h"
namespace crashpad {
CrashHandler* CrashHandler::instance_ = nullptr;
CrashHandler::CrashHandler() = default;
CrashHandler::~CrashHandler() {
UninstallObjcExceptionPreprocessor();
for (int signo = 1; signo < NSIG; ++signo) {
if (!Signals::IsCrashSignal(signo)) {
Signals::RestoreOrResetHandler(signo,
old_actions_.ActionForSignal(signo));
} else if (signo == SIGPIPE) {
// Reset the SIGPIPE handler only if the current handler is the one
// installed by DoInitialize(). In other words, if an application has set
// its own SIGPIPE handler after initializing Crashpad, there is no need
// to change the signal handler here.
struct sigaction sa;
if (sigaction(SIGPIPE, nullptr, &sa) == 0 &&
sa.sa_sigaction == CatchAndReraiseSignal) {
Signals::InstallDefaultHandler(SIGPIPE);
}
}
}
}
// static
CrashHandler* CrashHandler::Get() {
if (!instance_) {
instance_ = new CrashHandler;
}
return instance_;
}
// static
void CrashHandler::ResetForTesting() {
delete instance_;
instance_ = nullptr;
}
uint64_t CrashHandler::GetThreadIdForTesting() {
return Thread::GetThreadIdForTesting();
}
bool CrashHandler::DoInitialize() {
if (!Signals::InstallCrashHandlers(CatchAndReraiseSignal,
/*flags=*/0,
&old_actions_)) {
return false;
}
// For applications that haven't ignored or set a handler for SIGPIPE:
// It’s OK for an application to set its own SIGPIPE handler (including
// SIG_IGN) before initializing Crashpad, because Crashpad will discover the
// existing handler and not install its own.
// It’s OK for Crashpad to install its own SIGPIPE handler and for the
// application to subsequently install its own (including SIG_IGN)
// afterwards, because its handler will replace Crashpad’s.
// This is useful to cover the default situation where nobody installs a
// SIGPIPE handler and the disposition is at SIG_DFL, because SIGPIPE is a
// “kill” signal (bsd/sys/signalvar.h sigprop). In that case, without
// Crashpad, SIGPIPE results in a silent and unreported kill (and not even
// ReportCrash will record it), but developers probably want to be alerted to
// the condition.
struct sigaction sa;
if (sigaction(SIGPIPE, nullptr, &sa) == 0 && sa.sa_handler == SIG_DFL) {
Signals::InstallHandler(SIGPIPE, CatchAndReraiseSignal, 0, nullptr);
}
InstallObjc
gitextract_jbkjhin4/
├── .clang-format
├── .gitattributes
├── .gitignore
├── .gn
├── .style.yapf
├── .vpython3
├── AUTHORS
├── BUILD.gn
├── CONTRIBUTORS
├── DEPS
├── LICENSE
├── OWNERS
├── README.md
├── build/
│ ├── BUILD.gn
│ ├── BUILDCONFIG.gn
│ ├── config/
│ │ └── fuchsia/
│ │ └── gn_configs.gni
│ ├── crashpad_buildconfig.gni
│ ├── crashpad_fuzzer_test.gni
│ ├── fuchsia_envs.py
│ ├── install_linux_sysroot.py
│ ├── ios/
│ │ ├── Unittest-Info.plist
│ │ ├── convert_gn_xcodeproj.py
│ │ ├── setup_ios_gn.config
│ │ ├── setup_ios_gn.py
│ │ ├── xcodescheme-testable.template
│ │ └── xcodescheme.template
│ ├── run_tests.py
│ └── test.gni
├── client/
│ ├── BUILD.gn
│ ├── annotation.cc
│ ├── annotation.h
│ ├── annotation_list.cc
│ ├── annotation_list.h
│ ├── annotation_list_test.cc
│ ├── annotation_test.cc
│ ├── client_argv_handling.cc
│ ├── client_argv_handling.h
│ ├── crash_handler_base_ios.cc
│ ├── crash_handler_base_ios.h
│ ├── crash_handler_ios.cc
│ ├── crash_handler_ios.h
│ ├── crash_handler_tvos.cc
│ ├── crash_handler_tvos.h
│ ├── crash_report_database.cc
│ ├── crash_report_database.h
│ ├── crash_report_database_generic.cc
│ ├── crash_report_database_mac.mm
│ ├── crash_report_database_test.cc
│ ├── crash_report_database_win.cc
│ ├── crashpad_client.h
│ ├── crashpad_client_fuchsia.cc
│ ├── crashpad_client_ios.cc
│ ├── crashpad_client_ios_test.mm
│ ├── crashpad_client_linux.cc
│ ├── crashpad_client_linux_test.cc
│ ├── crashpad_client_mac.cc
│ ├── crashpad_client_win.cc
│ ├── crashpad_client_win_test.cc
│ ├── crashpad_info.cc
│ ├── crashpad_info.h
│ ├── crashpad_info_note.S
│ ├── crashpad_info_test.cc
│ ├── ios_handler/
│ │ ├── exception_processor.h
│ │ ├── exception_processor.mm
│ │ ├── exception_processor_test.mm
│ │ ├── in_process_handler.cc
│ │ ├── in_process_handler.h
│ │ ├── in_process_handler_test.cc
│ │ ├── in_process_intermediate_dump_handler.cc
│ │ ├── in_process_intermediate_dump_handler.h
│ │ ├── in_process_intermediate_dump_handler_test.cc
│ │ ├── prune_intermediate_dumps_and_crash_reports_thread.cc
│ │ └── prune_intermediate_dumps_and_crash_reports_thread.h
│ ├── length_delimited_ring_buffer.h
│ ├── length_delimited_ring_buffer_test.cc
│ ├── prune_crash_reports.cc
│ ├── prune_crash_reports.h
│ ├── prune_crash_reports_test.cc
│ ├── pthread_create_linux.cc
│ ├── ring_buffer_annotation.h
│ ├── ring_buffer_annotation_load_test_main.cc
│ ├── ring_buffer_annotation_test.cc
│ ├── settings.cc
│ ├── settings.h
│ ├── settings_test.cc
│ ├── simple_address_range_bag.h
│ ├── simple_address_range_bag_test.cc
│ ├── simple_string_dictionary.h
│ ├── simple_string_dictionary_test.cc
│ ├── simulate_crash.h
│ ├── simulate_crash_ios.h
│ ├── simulate_crash_linux.h
│ ├── simulate_crash_mac.cc
│ ├── simulate_crash_mac.h
│ ├── simulate_crash_mac_test.cc
│ ├── simulate_crash_win.h
│ └── upload_behavior_ios.h
├── codereview.settings
├── compat/
│ ├── BUILD.gn
│ ├── android/
│ │ ├── dlfcn_internal.cc
│ │ ├── dlfcn_internal.h
│ │ ├── elf.h
│ │ ├── linux/
│ │ │ ├── elf.h
│ │ │ ├── prctl.h
│ │ │ └── ptrace.h
│ │ ├── sched.h
│ │ └── sys/
│ │ ├── epoll.cc
│ │ ├── epoll.h
│ │ ├── mman.h
│ │ ├── mman_mmap.cc
│ │ ├── syscall.h
│ │ └── user.h
│ ├── ios/
│ │ └── mach/
│ │ ├── exc.defs
│ │ ├── mach_exc.defs
│ │ ├── mach_types.defs
│ │ ├── machine/
│ │ │ └── machine_types.defs
│ │ └── std_types.defs
│ ├── linux/
│ │ ├── signal.h
│ │ └── sys/
│ │ ├── mman.h
│ │ ├── mman_memfd_create.cc
│ │ ├── ptrace.h
│ │ └── user.h
│ ├── mac/
│ │ ├── Availability.h
│ │ ├── AvailabilityVersions.h
│ │ ├── kern/
│ │ │ └── exc_resource.h
│ │ ├── mach/
│ │ │ ├── i386/
│ │ │ │ └── thread_state.h
│ │ │ └── mach.h
│ │ ├── mach-o/
│ │ │ └── loader.h
│ │ └── sys/
│ │ └── resource.h
│ ├── non_mac/
│ │ ├── mach/
│ │ │ ├── mach.h
│ │ │ ├── machine.h
│ │ │ └── vm_prot.h
│ │ └── mach-o/
│ │ └── loader.h
│ ├── non_win/
│ │ ├── dbghelp.h
│ │ ├── minwinbase.h
│ │ ├── timezoneapi.h
│ │ ├── verrsrc.h
│ │ ├── windows.h
│ │ └── winnt.h
│ └── win/
│ ├── getopt.h
│ ├── strings.cc
│ ├── strings.h
│ ├── sys/
│ │ ├── time.h
│ │ └── types.h
│ ├── time.cc
│ ├── time.h
│ ├── winbase.h
│ ├── winnt.h
│ └── winternl.h
├── doc/
│ ├── .gitignore
│ ├── appengine/
│ │ ├── README
│ │ ├── go.mod
│ │ ├── go.sum
│ │ └── src/
│ │ └── crashpad-home/
│ │ ├── app.yaml
│ │ └── main.go
│ ├── developing.md
│ ├── ios_overview_design.md
│ ├── man.md
│ ├── overview_design.md
│ ├── status.md
│ └── support/
│ ├── compat.sh
│ ├── crashpad.doxy
│ ├── crashpad.doxy.h
│ ├── crashpad_doxygen.css
│ ├── generate.sh
│ ├── generate_doxygen.py
│ └── generate_git.sh
├── handler/
│ ├── BUILD.gn
│ ├── crash_report_upload_rate_limit.cc
│ ├── crash_report_upload_rate_limit.h
│ ├── crash_report_upload_rate_limit_test.cc
│ ├── crash_report_upload_thread.cc
│ ├── crash_report_upload_thread.h
│ ├── crashpad_handler.md
│ ├── crashpad_handler_main.cc
│ ├── crashpad_handler_test.cc
│ ├── crashpad_handler_test_extended_handler.cc
│ ├── handler_main.cc
│ ├── handler_main.h
│ ├── linux/
│ │ ├── capture_snapshot.cc
│ │ ├── capture_snapshot.h
│ │ ├── crash_report_exception_handler.cc
│ │ ├── crash_report_exception_handler.h
│ │ ├── cros_crash_report_exception_handler.cc
│ │ ├── cros_crash_report_exception_handler.h
│ │ ├── exception_handler_server.cc
│ │ ├── exception_handler_server.h
│ │ ├── exception_handler_server_test.cc
│ │ └── handler_trampoline.cc
│ ├── mac/
│ │ ├── crash_report_exception_handler.cc
│ │ ├── crash_report_exception_handler.h
│ │ ├── exception_handler_server.cc
│ │ ├── exception_handler_server.h
│ │ ├── file_limit_annotation.cc
│ │ └── file_limit_annotation.h
│ ├── main.cc
│ ├── minidump_to_upload_parameters.cc
│ ├── minidump_to_upload_parameters.h
│ ├── minidump_to_upload_parameters_test.cc
│ ├── prune_crash_reports_thread.cc
│ ├── prune_crash_reports_thread.h
│ ├── user_stream_data_source.cc
│ ├── user_stream_data_source.h
│ └── win/
│ ├── .gitattributes
│ ├── crash_other_program.cc
│ ├── crash_report_exception_handler.cc
│ ├── crash_report_exception_handler.h
│ ├── crashy_signal.cc
│ ├── crashy_test_program.cc
│ ├── crashy_test_z7_loader.cc
│ ├── fake_handler_that_crashes_at_startup.cc
│ ├── fastfail_test_program.cc
│ ├── hanging_program.cc
│ ├── heap_corrupting_program.cc
│ ├── loader_lock_dll.cc
│ ├── self_destroying_test_program.cc
│ ├── wer/
│ │ ├── BUILD.gn
│ │ ├── crashpad_wer.cc
│ │ ├── crashpad_wer.def
│ │ ├── crashpad_wer.h
│ │ ├── crashpad_wer.ver
│ │ ├── crashpad_wer_main.cc
│ │ └── crashpad_wer_module_unittest.cc
│ └── z7_test.cpp
├── infra/
│ └── config/
│ ├── PRESUBMIT.py
│ ├── generated/
│ │ ├── commit-queue.cfg
│ │ ├── cr-buildbucket.cfg
│ │ ├── luci-logdog.cfg
│ │ ├── luci-milo.cfg
│ │ ├── luci-scheduler.cfg
│ │ ├── project.cfg
│ │ └── realms.cfg
│ └── main.star
├── minidump/
│ ├── BUILD.gn
│ ├── minidump_annotation_writer.cc
│ ├── minidump_annotation_writer.h
│ ├── minidump_annotation_writer_test.cc
│ ├── minidump_byte_array_writer.cc
│ ├── minidump_byte_array_writer.h
│ ├── minidump_byte_array_writer_test.cc
│ ├── minidump_context.h
│ ├── minidump_context_writer.cc
│ ├── minidump_context_writer.h
│ ├── minidump_context_writer_test.cc
│ ├── minidump_crashpad_info_writer.cc
│ ├── minidump_crashpad_info_writer.h
│ ├── minidump_crashpad_info_writer_test.cc
│ ├── minidump_exception_writer.cc
│ ├── minidump_exception_writer.h
│ ├── minidump_exception_writer_test.cc
│ ├── minidump_extensions.cc
│ ├── minidump_extensions.h
│ ├── minidump_file_writer.cc
│ ├── minidump_file_writer.h
│ ├── minidump_file_writer_test.cc
│ ├── minidump_handle_writer.cc
│ ├── minidump_handle_writer.h
│ ├── minidump_handle_writer_test.cc
│ ├── minidump_memory_info_writer.cc
│ ├── minidump_memory_info_writer.h
│ ├── minidump_memory_info_writer_test.cc
│ ├── minidump_memory_writer.cc
│ ├── minidump_memory_writer.h
│ ├── minidump_memory_writer_test.cc
│ ├── minidump_misc_info_writer.cc
│ ├── minidump_misc_info_writer.h
│ ├── minidump_misc_info_writer_test.cc
│ ├── minidump_module_crashpad_info_writer.cc
│ ├── minidump_module_crashpad_info_writer.h
│ ├── minidump_module_crashpad_info_writer_test.cc
│ ├── minidump_module_writer.cc
│ ├── minidump_module_writer.h
│ ├── minidump_module_writer_test.cc
│ ├── minidump_rva_list_writer.cc
│ ├── minidump_rva_list_writer.h
│ ├── minidump_rva_list_writer_test.cc
│ ├── minidump_simple_string_dictionary_writer.cc
│ ├── minidump_simple_string_dictionary_writer.h
│ ├── minidump_simple_string_dictionary_writer_test.cc
│ ├── minidump_stream_writer.cc
│ ├── minidump_stream_writer.h
│ ├── minidump_string_writer.cc
│ ├── minidump_string_writer.h
│ ├── minidump_string_writer_test.cc
│ ├── minidump_system_info_writer.cc
│ ├── minidump_system_info_writer.h
│ ├── minidump_system_info_writer_test.cc
│ ├── minidump_thread_id_map.cc
│ ├── minidump_thread_id_map.h
│ ├── minidump_thread_id_map_test.cc
│ ├── minidump_thread_name_list_writer.cc
│ ├── minidump_thread_name_list_writer.h
│ ├── minidump_thread_name_list_writer_test.cc
│ ├── minidump_thread_writer.cc
│ ├── minidump_thread_writer.h
│ ├── minidump_thread_writer_test.cc
│ ├── minidump_unloaded_module_writer.cc
│ ├── minidump_unloaded_module_writer.h
│ ├── minidump_unloaded_module_writer_test.cc
│ ├── minidump_user_extension_stream_data_source.cc
│ ├── minidump_user_extension_stream_data_source.h
│ ├── minidump_user_stream_writer.cc
│ ├── minidump_user_stream_writer.h
│ ├── minidump_user_stream_writer_test.cc
│ ├── minidump_writable.cc
│ ├── minidump_writable.h
│ ├── minidump_writable_test.cc
│ ├── minidump_writer_util.cc
│ ├── minidump_writer_util.h
│ └── test/
│ ├── minidump_byte_array_writer_test_util.cc
│ ├── minidump_byte_array_writer_test_util.h
│ ├── minidump_context_test_util.cc
│ ├── minidump_context_test_util.h
│ ├── minidump_file_writer_test_util.cc
│ ├── minidump_file_writer_test_util.h
│ ├── minidump_memory_writer_test_util.cc
│ ├── minidump_memory_writer_test_util.h
│ ├── minidump_rva_list_test_util.cc
│ ├── minidump_rva_list_test_util.h
│ ├── minidump_string_writer_test_util.cc
│ ├── minidump_string_writer_test_util.h
│ ├── minidump_user_extension_stream_util.cc
│ ├── minidump_user_extension_stream_util.h
│ ├── minidump_writable_test_util.cc
│ └── minidump_writable_test_util.h
├── navbar.md
├── package.h
├── snapshot/
│ ├── BUILD.gn
│ ├── annotation_snapshot.cc
│ ├── annotation_snapshot.h
│ ├── capture_memory.cc
│ ├── capture_memory.h
│ ├── cpu_architecture.h
│ ├── cpu_context.cc
│ ├── cpu_context.h
│ ├── cpu_context_test.cc
│ ├── crashpad_info_client_options.cc
│ ├── crashpad_info_client_options.h
│ ├── crashpad_info_client_options_test.cc
│ ├── crashpad_info_client_options_test_module.cc
│ ├── crashpad_info_size_test_module.cc
│ ├── crashpad_info_size_test_note.S
│ ├── crashpad_types/
│ │ ├── crashpad_info_reader.cc
│ │ ├── crashpad_info_reader.h
│ │ ├── crashpad_info_reader_test.cc
│ │ ├── image_annotation_reader.cc
│ │ ├── image_annotation_reader.h
│ │ └── image_annotation_reader_test.cc
│ ├── elf/
│ │ ├── elf_dynamic_array_reader.cc
│ │ ├── elf_dynamic_array_reader.h
│ │ ├── elf_image_reader.cc
│ │ ├── elf_image_reader.h
│ │ ├── elf_image_reader_fuzzer.cc
│ │ ├── elf_image_reader_fuzzer_corpus/
│ │ │ ├── .gitattributes
│ │ │ └── ret42
│ │ ├── elf_image_reader_test.cc
│ │ ├── elf_image_reader_test_note.S
│ │ ├── elf_symbol_table_reader.cc
│ │ ├── elf_symbol_table_reader.h
│ │ ├── module_snapshot_elf.cc
│ │ ├── module_snapshot_elf.h
│ │ └── test_exported_symbols.sym
│ ├── exception_snapshot.h
│ ├── fuchsia/
│ │ ├── cpu_context_fuchsia.cc
│ │ ├── cpu_context_fuchsia.h
│ │ ├── exception_snapshot_fuchsia.cc
│ │ ├── exception_snapshot_fuchsia.h
│ │ ├── memory_map_fuchsia.cc
│ │ ├── memory_map_fuchsia.h
│ │ ├── memory_map_region_snapshot_fuchsia.cc
│ │ ├── memory_map_region_snapshot_fuchsia.h
│ │ ├── process_reader_fuchsia.cc
│ │ ├── process_reader_fuchsia.h
│ │ ├── process_reader_fuchsia_test.cc
│ │ ├── process_snapshot_fuchsia.cc
│ │ ├── process_snapshot_fuchsia.h
│ │ ├── process_snapshot_fuchsia_test.cc
│ │ ├── system_snapshot_fuchsia.cc
│ │ ├── system_snapshot_fuchsia.h
│ │ ├── thread_snapshot_fuchsia.cc
│ │ └── thread_snapshot_fuchsia.h
│ ├── handle_snapshot.cc
│ ├── handle_snapshot.h
│ ├── hash_types_test.cc
│ ├── ios/
│ │ ├── exception_snapshot_ios_intermediate_dump.cc
│ │ ├── exception_snapshot_ios_intermediate_dump.h
│ │ ├── intermediate_dump_reader_util.cc
│ │ ├── intermediate_dump_reader_util.h
│ │ ├── memory_snapshot_ios_intermediate_dump.cc
│ │ ├── memory_snapshot_ios_intermediate_dump.h
│ │ ├── memory_snapshot_ios_intermediate_dump_test.cc
│ │ ├── module_snapshot_ios_intermediate_dump.cc
│ │ ├── module_snapshot_ios_intermediate_dump.h
│ │ ├── process_snapshot_ios_intermediate_dump.cc
│ │ ├── process_snapshot_ios_intermediate_dump.h
│ │ ├── process_snapshot_ios_intermediate_dump_test.cc
│ │ ├── system_snapshot_ios_intermediate_dump.cc
│ │ ├── system_snapshot_ios_intermediate_dump.h
│ │ ├── testdata/
│ │ │ ├── crash-1fa088dda0adb41459d063078a0f384a0bb8eefa
│ │ │ ├── crash-5726011582644224
│ │ │ ├── crash-6605504629637120
│ │ │ └── crash-c44acfcbccd8c7a8
│ │ ├── thread_snapshot_ios_intermediate_dump.cc
│ │ └── thread_snapshot_ios_intermediate_dump.h
│ ├── linux/
│ │ ├── capture_memory_delegate_linux.cc
│ │ ├── capture_memory_delegate_linux.h
│ │ ├── cpu_context_linux.cc
│ │ ├── cpu_context_linux.h
│ │ ├── debug_rendezvous.cc
│ │ ├── debug_rendezvous.h
│ │ ├── debug_rendezvous_test.cc
│ │ ├── exception_snapshot_linux.cc
│ │ ├── exception_snapshot_linux.h
│ │ ├── exception_snapshot_linux_test.cc
│ │ ├── process_reader_linux.cc
│ │ ├── process_reader_linux.h
│ │ ├── process_reader_linux_test.cc
│ │ ├── process_snapshot_linux.cc
│ │ ├── process_snapshot_linux.h
│ │ ├── signal_context.h
│ │ ├── system_snapshot_linux.cc
│ │ ├── system_snapshot_linux.h
│ │ ├── system_snapshot_linux_test.cc
│ │ ├── test_modules.cc
│ │ ├── test_modules.h
│ │ ├── thread_snapshot_linux.cc
│ │ └── thread_snapshot_linux.h
│ ├── mac/
│ │ ├── cpu_context_mac.cc
│ │ ├── cpu_context_mac.h
│ │ ├── cpu_context_mac_test.cc
│ │ ├── exception_snapshot_mac.cc
│ │ ├── exception_snapshot_mac.h
│ │ ├── mach_o_image_annotations_reader.cc
│ │ ├── mach_o_image_annotations_reader.h
│ │ ├── mach_o_image_annotations_reader_test.cc
│ │ ├── mach_o_image_annotations_reader_test_module_crashy_initializer.cc
│ │ ├── mach_o_image_annotations_reader_test_no_op.cc
│ │ ├── mach_o_image_reader.cc
│ │ ├── mach_o_image_reader.h
│ │ ├── mach_o_image_reader_test.cc
│ │ ├── mach_o_image_segment_reader.cc
│ │ ├── mach_o_image_segment_reader.h
│ │ ├── mach_o_image_segment_reader_test.cc
│ │ ├── mach_o_image_symbol_table_reader.cc
│ │ ├── mach_o_image_symbol_table_reader.h
│ │ ├── module_snapshot_mac.cc
│ │ ├── module_snapshot_mac.h
│ │ ├── process_reader_mac.cc
│ │ ├── process_reader_mac.h
│ │ ├── process_reader_mac_test.cc
│ │ ├── process_snapshot_mac.cc
│ │ ├── process_snapshot_mac.h
│ │ ├── process_types/
│ │ │ ├── all.proctype
│ │ │ ├── annotation.proctype
│ │ │ ├── crashpad_info.proctype
│ │ │ ├── crashreporterclient.proctype
│ │ │ ├── custom.cc
│ │ │ ├── dyld_images.proctype
│ │ │ ├── flavors.h
│ │ │ ├── internal.h
│ │ │ ├── loader.proctype
│ │ │ ├── nlist.proctype
│ │ │ └── traits.h
│ │ ├── process_types.cc
│ │ ├── process_types.h
│ │ ├── process_types_test.cc
│ │ ├── system_snapshot_mac.cc
│ │ ├── system_snapshot_mac.h
│ │ ├── system_snapshot_mac_test.cc
│ │ ├── thread_snapshot_mac.cc
│ │ └── thread_snapshot_mac.h
│ ├── memory_map_region_snapshot.h
│ ├── memory_snapshot.cc
│ ├── memory_snapshot.h
│ ├── memory_snapshot_generic.h
│ ├── memory_snapshot_test.cc
│ ├── minidump/
│ │ ├── exception_snapshot_minidump.cc
│ │ ├── exception_snapshot_minidump.h
│ │ ├── memory_snapshot_minidump.cc
│ │ ├── memory_snapshot_minidump.h
│ │ ├── minidump_annotation_reader.cc
│ │ ├── minidump_annotation_reader.h
│ │ ├── minidump_context_converter.cc
│ │ ├── minidump_context_converter.h
│ │ ├── minidump_simple_string_dictionary_reader.cc
│ │ ├── minidump_simple_string_dictionary_reader.h
│ │ ├── minidump_stream.h
│ │ ├── minidump_string_list_reader.cc
│ │ ├── minidump_string_list_reader.h
│ │ ├── minidump_string_reader.cc
│ │ ├── minidump_string_reader.h
│ │ ├── module_snapshot_minidump.cc
│ │ ├── module_snapshot_minidump.h
│ │ ├── process_snapshot_minidump.cc
│ │ ├── process_snapshot_minidump.h
│ │ ├── process_snapshot_minidump_test.cc
│ │ ├── system_snapshot_minidump.cc
│ │ ├── system_snapshot_minidump.h
│ │ ├── thread_snapshot_minidump.cc
│ │ └── thread_snapshot_minidump.h
│ ├── module_snapshot.h
│ ├── posix/
│ │ ├── timezone.cc
│ │ ├── timezone.h
│ │ └── timezone_test.cc
│ ├── process_snapshot.h
│ ├── sanitized/
│ │ ├── memory_snapshot_sanitized.cc
│ │ ├── memory_snapshot_sanitized.h
│ │ ├── module_snapshot_sanitized.cc
│ │ ├── module_snapshot_sanitized.h
│ │ ├── process_snapshot_sanitized.cc
│ │ ├── process_snapshot_sanitized.h
│ │ ├── process_snapshot_sanitized_test.cc
│ │ ├── sanitization_information.cc
│ │ ├── sanitization_information.h
│ │ ├── sanitization_information_test.cc
│ │ ├── thread_snapshot_sanitized.cc
│ │ └── thread_snapshot_sanitized.h
│ ├── snapshot_constants.h
│ ├── system_snapshot.h
│ ├── test/
│ │ ├── test_cpu_context.cc
│ │ ├── test_cpu_context.h
│ │ ├── test_exception_snapshot.cc
│ │ ├── test_exception_snapshot.h
│ │ ├── test_memory_map_region_snapshot.cc
│ │ ├── test_memory_map_region_snapshot.h
│ │ ├── test_memory_snapshot.cc
│ │ ├── test_memory_snapshot.h
│ │ ├── test_module_snapshot.cc
│ │ ├── test_module_snapshot.h
│ │ ├── test_process_snapshot.cc
│ │ ├── test_process_snapshot.h
│ │ ├── test_system_snapshot.cc
│ │ ├── test_system_snapshot.h
│ │ ├── test_thread_snapshot.cc
│ │ └── test_thread_snapshot.h
│ ├── thread_snapshot.h
│ ├── unloaded_module_snapshot.cc
│ ├── unloaded_module_snapshot.h
│ ├── win/
│ │ ├── capture_memory_delegate_win.cc
│ │ ├── capture_memory_delegate_win.h
│ │ ├── cpu_context_win.cc
│ │ ├── cpu_context_win.h
│ │ ├── cpu_context_win_test.cc
│ │ ├── crashpad_snapshot_test_annotations.cc
│ │ ├── crashpad_snapshot_test_crashing_child.cc
│ │ ├── crashpad_snapshot_test_dump_without_crashing.cc
│ │ ├── crashpad_snapshot_test_extra_memory_ranges.cc
│ │ ├── crashpad_snapshot_test_image_reader.cc
│ │ ├── crashpad_snapshot_test_image_reader_module.cc
│ │ ├── end_to_end_test.py
│ │ ├── exception_snapshot_win.cc
│ │ ├── exception_snapshot_win.h
│ │ ├── exception_snapshot_win_test.cc
│ │ ├── extra_memory_ranges_test.cc
│ │ ├── memory_map_region_snapshot_win.cc
│ │ ├── memory_map_region_snapshot_win.h
│ │ ├── module_snapshot_win.cc
│ │ ├── module_snapshot_win.h
│ │ ├── module_snapshot_win_test.cc
│ │ ├── pe_image_annotations_reader.cc
│ │ ├── pe_image_annotations_reader.h
│ │ ├── pe_image_reader.cc
│ │ ├── pe_image_reader.h
│ │ ├── pe_image_reader_test.cc
│ │ ├── pe_image_resource_reader.cc
│ │ ├── pe_image_resource_reader.h
│ │ ├── process_reader_win.cc
│ │ ├── process_reader_win.h
│ │ ├── process_reader_win_test.cc
│ │ ├── process_snapshot_win.cc
│ │ ├── process_snapshot_win.h
│ │ ├── process_snapshot_win_test.cc
│ │ ├── process_subrange_reader.cc
│ │ ├── process_subrange_reader.h
│ │ ├── system_snapshot_win.cc
│ │ ├── system_snapshot_win.h
│ │ ├── system_snapshot_win_test.cc
│ │ ├── thread_snapshot_win.cc
│ │ └── thread_snapshot_win.h
│ └── x86/
│ ├── cpuid_reader.cc
│ └── cpuid_reader.h
├── test/
│ ├── BUILD.gn
│ ├── errors.cc
│ ├── errors.h
│ ├── file.cc
│ ├── file.h
│ ├── filesystem.cc
│ ├── filesystem.h
│ ├── fuchsia_crashpad_tests.cml
│ ├── gtest_death.h
│ ├── gtest_main.cc
│ ├── hex_string.cc
│ ├── hex_string.h
│ ├── hex_string_test.cc
│ ├── ios/
│ │ ├── BUILD.gn
│ │ ├── cptest_google_test_runner.mm
│ │ ├── cptest_google_test_runner_delegate.h
│ │ ├── crash_type_xctest.mm
│ │ ├── google_test_setup.h
│ │ ├── google_test_setup.mm
│ │ └── host/
│ │ ├── BUILD.gn
│ │ ├── Info.plist
│ │ ├── cptest_application_delegate.h
│ │ ├── cptest_application_delegate.mm
│ │ ├── cptest_crash_view_controller.h
│ │ ├── cptest_crash_view_controller.mm
│ │ ├── cptest_shared_object.h
│ │ ├── handler_forbidden_allocators.cc
│ │ ├── handler_forbidden_allocators.h
│ │ └── main.mm
│ ├── linux/
│ │ ├── fake_ptrace_connection.cc
│ │ ├── fake_ptrace_connection.h
│ │ ├── get_tls.cc
│ │ └── get_tls.h
│ ├── mac/
│ │ ├── dyld.cc
│ │ ├── dyld.h
│ │ ├── exception_swallower.cc
│ │ ├── exception_swallower.h
│ │ ├── mach_errors.cc
│ │ ├── mach_errors.h
│ │ ├── mach_multiprocess.cc
│ │ ├── mach_multiprocess.h
│ │ └── mach_multiprocess_test.cc
│ ├── main_arguments.cc
│ ├── main_arguments.h
│ ├── main_arguments_test.cc
│ ├── multiprocess.h
│ ├── multiprocess_exec.cc
│ ├── multiprocess_exec.h
│ ├── multiprocess_exec_fuchsia.cc
│ ├── multiprocess_exec_posix.cc
│ ├── multiprocess_exec_test.cc
│ ├── multiprocess_exec_test_child.cc
│ ├── multiprocess_exec_win.cc
│ ├── multiprocess_posix.cc
│ ├── multiprocess_posix_test.cc
│ ├── process_type.cc
│ ├── process_type.h
│ ├── scoped_guarded_page.h
│ ├── scoped_guarded_page_posix.cc
│ ├── scoped_guarded_page_test.cc
│ ├── scoped_guarded_page_win.cc
│ ├── scoped_module_handle.cc
│ ├── scoped_module_handle.h
│ ├── scoped_set_thread_name.h
│ ├── scoped_set_thread_name_fuchsia.cc
│ ├── scoped_set_thread_name_posix.cc
│ ├── scoped_set_thread_name_win.cc
│ ├── scoped_temp_dir.cc
│ ├── scoped_temp_dir.h
│ ├── scoped_temp_dir_posix.cc
│ ├── scoped_temp_dir_test.cc
│ ├── scoped_temp_dir_win.cc
│ ├── test_paths.cc
│ ├── test_paths.h
│ ├── test_paths_test.cc
│ ├── test_paths_test_data_root.txt
│ └── win/
│ ├── child_launcher.cc
│ ├── child_launcher.h
│ ├── win_child_process.cc
│ ├── win_child_process.h
│ ├── win_child_process_test.cc
│ ├── win_multiprocess.cc
│ ├── win_multiprocess.h
│ ├── win_multiprocess_test.cc
│ ├── win_multiprocess_with_temp_dir.cc
│ └── win_multiprocess_with_temp_dir.h
├── third_party/
│ ├── cpp-httplib/
│ │ ├── BUILD.gn
│ │ ├── README.crashpad
│ │ └── cpp-httplib/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── httplib.h
│ ├── edo/
│ │ ├── BUILD.gn
│ │ └── README.crashpad
│ ├── fuchsia/
│ │ ├── BUILD.gn
│ │ ├── README.crashpad
│ │ └── runner.py
│ ├── getopt/
│ │ ├── BUILD.gn
│ │ ├── LICENSE
│ │ ├── README.crashpad
│ │ ├── getopt.cc
│ │ └── getopt.h
│ ├── googletest/
│ │ ├── BUILD.gn
│ │ └── README.crashpad
│ ├── linux/
│ │ └── README.md
│ ├── lss/
│ │ ├── BUILD.gn
│ │ ├── README.crashpad
│ │ └── lss.h
│ ├── mini_chromium/
│ │ ├── BUILD.gn
│ │ └── README.crashpad
│ ├── ninja/
│ │ ├── README.crashpad
│ │ └── ninja
│ ├── xnu/
│ │ ├── APPLE_LICENSE
│ │ ├── BUILD.gn
│ │ ├── EXTERNAL_HEADERS/
│ │ │ └── mach-o/
│ │ │ └── loader.h
│ │ ├── README.crashpad
│ │ └── osfmk/
│ │ └── mach/
│ │ ├── exc.defs
│ │ ├── mach_exc.defs
│ │ ├── mach_types.defs
│ │ ├── machine/
│ │ │ └── machine_types.defs
│ │ └── std_types.defs
│ └── zlib/
│ ├── BUILD.gn
│ ├── README.crashpad
│ └── zlib_crashpad.h
├── tools/
│ ├── BUILD.gn
│ ├── base94_encoder.cc
│ ├── base94_encoder.md
│ ├── crashpad_database_util.cc
│ ├── crashpad_database_util.md
│ ├── crashpad_http_upload.cc
│ ├── crashpad_http_upload.md
│ ├── dump_minidump_annotations.cc
│ ├── generate_dump.cc
│ ├── generate_dump.md
│ ├── mac/
│ │ ├── catch_exception_tool.cc
│ │ ├── catch_exception_tool.md
│ │ ├── exception_port_tool.cc
│ │ ├── exception_port_tool.md
│ │ ├── on_demand_service_tool.md
│ │ ├── on_demand_service_tool.mm
│ │ └── sectaskaccess_info.plist
│ ├── run_with_crashpad.cc
│ ├── run_with_crashpad.md
│ ├── tool_support.cc
│ └── tool_support.h
└── util/
├── BUILD.gn
├── file/
│ ├── delimited_file_reader.cc
│ ├── delimited_file_reader.h
│ ├── delimited_file_reader_test.cc
│ ├── directory_reader.h
│ ├── directory_reader_posix.cc
│ ├── directory_reader_test.cc
│ ├── directory_reader_win.cc
│ ├── file_helper.cc
│ ├── file_helper.h
│ ├── file_io.cc
│ ├── file_io.h
│ ├── file_io_posix.cc
│ ├── file_io_test.cc
│ ├── file_io_win.cc
│ ├── file_reader.cc
│ ├── file_reader.h
│ ├── file_reader_test.cc
│ ├── file_seeker.cc
│ ├── file_seeker.h
│ ├── file_writer.cc
│ ├── file_writer.h
│ ├── filesystem.h
│ ├── filesystem_posix.cc
│ ├── filesystem_test.cc
│ ├── filesystem_win.cc
│ ├── output_stream_file_writer.cc
│ ├── output_stream_file_writer.h
│ ├── scoped_remove_file.cc
│ ├── scoped_remove_file.h
│ ├── string_file.cc
│ ├── string_file.h
│ └── string_file_test.cc
├── fuchsia/
│ ├── koid_utilities.cc
│ ├── koid_utilities.h
│ ├── scoped_task_suspend.cc
│ ├── scoped_task_suspend.h
│ └── traits.h
├── ios/
│ ├── ios_intermediate_dump_data.cc
│ ├── ios_intermediate_dump_data.h
│ ├── ios_intermediate_dump_format.h
│ ├── ios_intermediate_dump_interface.cc
│ ├── ios_intermediate_dump_interface.h
│ ├── ios_intermediate_dump_list.cc
│ ├── ios_intermediate_dump_list.h
│ ├── ios_intermediate_dump_map.cc
│ ├── ios_intermediate_dump_map.h
│ ├── ios_intermediate_dump_object.cc
│ ├── ios_intermediate_dump_object.h
│ ├── ios_intermediate_dump_reader.cc
│ ├── ios_intermediate_dump_reader.h
│ ├── ios_intermediate_dump_reader_test.cc
│ ├── ios_intermediate_dump_writer.cc
│ ├── ios_intermediate_dump_writer.h
│ ├── ios_intermediate_dump_writer_test.cc
│ ├── ios_system_data_collector.h
│ ├── ios_system_data_collector.mm
│ ├── raw_logging.cc
│ ├── raw_logging.h
│ ├── scoped_background_task.h
│ ├── scoped_background_task.mm
│ ├── scoped_vm_map.cc
│ ├── scoped_vm_map.h
│ ├── scoped_vm_map_test.cc
│ ├── scoped_vm_read.cc
│ ├── scoped_vm_read.h
│ └── scoped_vm_read_test.cc
├── linux/
│ ├── address_types.h
│ ├── auxiliary_vector.cc
│ ├── auxiliary_vector.h
│ ├── auxiliary_vector_test.cc
│ ├── checked_linux_address_range.h
│ ├── direct_ptrace_connection.cc
│ ├── direct_ptrace_connection.h
│ ├── exception_handler_client.cc
│ ├── exception_handler_client.h
│ ├── exception_handler_protocol.cc
│ ├── exception_handler_protocol.h
│ ├── exception_information.h
│ ├── initial_signal_dispositions.cc
│ ├── initial_signal_dispositions.h
│ ├── memory_map.cc
│ ├── memory_map.h
│ ├── memory_map_test.cc
│ ├── pac_helper.cc
│ ├── pac_helper.h
│ ├── proc_stat_reader.cc
│ ├── proc_stat_reader.h
│ ├── proc_stat_reader_test.cc
│ ├── proc_task_reader.cc
│ ├── proc_task_reader.h
│ ├── proc_task_reader_test.cc
│ ├── ptrace_broker.cc
│ ├── ptrace_broker.h
│ ├── ptrace_broker_test.cc
│ ├── ptrace_client.cc
│ ├── ptrace_client.h
│ ├── ptrace_connection.h
│ ├── ptracer.cc
│ ├── ptracer.h
│ ├── ptracer_test.cc
│ ├── scoped_pr_set_dumpable.cc
│ ├── scoped_pr_set_dumpable.h
│ ├── scoped_pr_set_ptracer.cc
│ ├── scoped_pr_set_ptracer.h
│ ├── scoped_ptrace_attach.cc
│ ├── scoped_ptrace_attach.h
│ ├── scoped_ptrace_attach_test.cc
│ ├── socket.cc
│ ├── socket.h
│ ├── socket_test.cc
│ ├── thread_info.cc
│ ├── thread_info.h
│ └── traits.h
├── mac/
│ ├── checked_mach_address_range.h
│ ├── checked_mach_address_range_test.cc
│ ├── launchd.h
│ ├── launchd.mm
│ ├── launchd_test.mm
│ ├── mac_util.cc
│ ├── mac_util.h
│ ├── mac_util_test.mm
│ ├── service_management.cc
│ ├── service_management.h
│ ├── service_management_test.mm
│ ├── sysctl.cc
│ ├── sysctl.h
│ ├── sysctl_test.cc
│ ├── xattr.cc
│ ├── xattr.h
│ └── xattr_test.cc
├── mach/
│ ├── bootstrap.cc
│ ├── bootstrap.h
│ ├── bootstrap_test.cc
│ ├── child_port.defs
│ ├── child_port_handshake.cc
│ ├── child_port_handshake.h
│ ├── child_port_handshake_test.cc
│ ├── child_port_server.cc
│ ├── child_port_server.h
│ ├── child_port_server_test.cc
│ ├── child_port_types.h
│ ├── composite_mach_message_server.cc
│ ├── composite_mach_message_server.h
│ ├── composite_mach_message_server_test.cc
│ ├── exc_client_variants.cc
│ ├── exc_client_variants.h
│ ├── exc_client_variants_test.cc
│ ├── exc_server_variants.cc
│ ├── exc_server_variants.h
│ ├── exc_server_variants_test.cc
│ ├── exception_behaviors.cc
│ ├── exception_behaviors.h
│ ├── exception_behaviors_test.cc
│ ├── exception_ports.cc
│ ├── exception_ports.h
│ ├── exception_ports_test.cc
│ ├── exception_types.cc
│ ├── exception_types.h
│ ├── exception_types_test.cc
│ ├── mach_extensions.cc
│ ├── mach_extensions.h
│ ├── mach_extensions_test.cc
│ ├── mach_message.cc
│ ├── mach_message.h
│ ├── mach_message_server.cc
│ ├── mach_message_server.h
│ ├── mach_message_server_test.cc
│ ├── mach_message_test.cc
│ ├── mig.py
│ ├── mig_fix.py
│ ├── mig_gen.py
│ ├── notify_server.cc
│ ├── notify_server.h
│ ├── notify_server_test.cc
│ ├── scoped_task_suspend.cc
│ ├── scoped_task_suspend.h
│ ├── scoped_task_suspend_test.cc
│ ├── symbolic_constants_mach.cc
│ ├── symbolic_constants_mach.h
│ ├── symbolic_constants_mach_test.cc
│ ├── task_for_pid.cc
│ └── task_for_pid.h
├── misc/
│ ├── address_sanitizer.h
│ ├── address_types.h
│ ├── arm64_pac_bti.S
│ ├── arraysize.h
│ ├── arraysize_test.cc
│ ├── as_underlying_type.h
│ ├── capture_context.h
│ ├── capture_context_linux.S
│ ├── capture_context_mac.S
│ ├── capture_context_test.cc
│ ├── capture_context_test_util.h
│ ├── capture_context_test_util_linux.cc
│ ├── capture_context_test_util_mac.cc
│ ├── capture_context_test_util_win.cc
│ ├── capture_context_win.asm
│ ├── capture_context_win_arm64.asm
│ ├── capture_context_win_arm64.obj
│ ├── clock.h
│ ├── clock_mac.cc
│ ├── clock_posix.cc
│ ├── clock_test.cc
│ ├── clock_win.cc
│ ├── elf_note_types.h
│ ├── from_pointer_cast.h
│ ├── from_pointer_cast_test.cc
│ ├── implicit_cast.h
│ ├── initialization_state.h
│ ├── initialization_state_dcheck.cc
│ ├── initialization_state_dcheck.h
│ ├── initialization_state_dcheck_test.cc
│ ├── initialization_state_test.cc
│ ├── lexing.cc
│ ├── lexing.h
│ ├── memory_sanitizer.h
│ ├── metrics.cc
│ ├── metrics.h
│ ├── no_cfi_icall.h
│ ├── no_cfi_icall_test.cc
│ ├── paths.h
│ ├── paths_fuchsia.cc
│ ├── paths_linux.cc
│ ├── paths_mac.cc
│ ├── paths_test.cc
│ ├── paths_win.cc
│ ├── pdb_structures.cc
│ ├── pdb_structures.h
│ ├── random_string.cc
│ ├── random_string.h
│ ├── random_string_test.cc
│ ├── range_set.cc
│ ├── range_set.h
│ ├── range_set_test.cc
│ ├── reinterpret_bytes.cc
│ ├── reinterpret_bytes.h
│ ├── reinterpret_bytes_test.cc
│ ├── scoped_forbid_return.cc
│ ├── scoped_forbid_return.h
│ ├── scoped_forbid_return_test.cc
│ ├── symbolic_constants_common.h
│ ├── time.cc
│ ├── time.h
│ ├── time_linux.cc
│ ├── time_test.cc
│ ├── time_win.cc
│ ├── tri_state.h
│ ├── uuid.cc
│ ├── uuid.h
│ ├── uuid_test.cc
│ ├── zlib.cc
│ └── zlib.h
├── net/
│ ├── generate_test_server_key.py
│ ├── http_body.cc
│ ├── http_body.h
│ ├── http_body_gzip.cc
│ ├── http_body_gzip.h
│ ├── http_body_gzip_test.cc
│ ├── http_body_test.cc
│ ├── http_body_test_util.cc
│ ├── http_body_test_util.h
│ ├── http_headers.h
│ ├── http_multipart_builder.cc
│ ├── http_multipart_builder.h
│ ├── http_multipart_builder_test.cc
│ ├── http_transport.cc
│ ├── http_transport.h
│ ├── http_transport_libcurl.cc
│ ├── http_transport_mac.mm
│ ├── http_transport_socket.cc
│ ├── http_transport_test.cc
│ ├── http_transport_test_server.cc
│ ├── http_transport_win.cc
│ ├── testdata/
│ │ ├── ascii_http_body.txt
│ │ ├── crashpad_util_test_cert.pem
│ │ └── crashpad_util_test_key.pem
│ ├── tls.gni
│ ├── url.cc
│ ├── url.h
│ └── url_test.cc
├── numeric/
│ ├── checked_address_range.cc
│ ├── checked_address_range.h
│ ├── checked_address_range_test.cc
│ ├── checked_range.h
│ ├── checked_range_test.cc
│ ├── checked_vm_address_range.h
│ ├── in_range_cast.h
│ ├── in_range_cast_test.cc
│ ├── int128.h
│ ├── int128_test.cc
│ └── safe_assignment.h
├── posix/
│ ├── close_multiple.cc
│ ├── close_multiple.h
│ ├── close_stdio.cc
│ ├── close_stdio.h
│ ├── drop_privileges.cc
│ ├── drop_privileges.h
│ ├── process_info.h
│ ├── process_info_linux.cc
│ ├── process_info_mac.cc
│ ├── process_info_test.cc
│ ├── scoped_dir.cc
│ ├── scoped_dir.h
│ ├── scoped_mmap.cc
│ ├── scoped_mmap.h
│ ├── scoped_mmap_test.cc
│ ├── signals.cc
│ ├── signals.h
│ ├── signals_test.cc
│ ├── spawn_subprocess.cc
│ ├── spawn_subprocess.h
│ ├── symbolic_constants_posix.cc
│ ├── symbolic_constants_posix.h
│ └── symbolic_constants_posix_test.cc
├── process/
│ ├── process_id.h
│ ├── process_memory.cc
│ ├── process_memory.h
│ ├── process_memory_fuchsia.cc
│ ├── process_memory_fuchsia.h
│ ├── process_memory_linux.cc
│ ├── process_memory_linux.h
│ ├── process_memory_mac.cc
│ ├── process_memory_mac.h
│ ├── process_memory_mac_test.cc
│ ├── process_memory_native.h
│ ├── process_memory_range.cc
│ ├── process_memory_range.h
│ ├── process_memory_range_test.cc
│ ├── process_memory_sanitized.cc
│ ├── process_memory_sanitized.h
│ ├── process_memory_sanitized_test.cc
│ ├── process_memory_test.cc
│ ├── process_memory_win.cc
│ └── process_memory_win.h
├── stdlib/
│ ├── aligned_allocator.cc
│ ├── aligned_allocator.h
│ ├── aligned_allocator_test.cc
│ ├── map_insert.h
│ ├── map_insert_test.cc
│ ├── objc.h
│ ├── string_number_conversion.cc
│ ├── string_number_conversion.h
│ ├── string_number_conversion_test.cc
│ ├── strlcpy.cc
│ ├── strlcpy.h
│ ├── strlcpy_test.cc
│ ├── strnlen.cc
│ ├── strnlen.h
│ ├── strnlen_test.cc
│ ├── thread_safe_vector.h
│ └── thread_safe_vector_test.cc
├── stream/
│ ├── base94_output_stream.cc
│ ├── base94_output_stream.h
│ ├── base94_output_stream_test.cc
│ ├── file_encoder.cc
│ ├── file_encoder.h
│ ├── file_encoder_test.cc
│ ├── file_output_stream.cc
│ ├── file_output_stream.h
│ ├── log_output_stream.cc
│ ├── log_output_stream.h
│ ├── log_output_stream_test.cc
│ ├── output_stream_interface.h
│ ├── test_output_stream.cc
│ ├── test_output_stream.h
│ ├── zlib_output_stream.cc
│ ├── zlib_output_stream.h
│ └── zlib_output_stream_test.cc
├── string/
│ ├── split_string.cc
│ ├── split_string.h
│ └── split_string_test.cc
├── synchronization/
│ ├── scoped_spin_guard.h
│ ├── scoped_spin_guard_test.cc
│ ├── semaphore.h
│ ├── semaphore_mac.cc
│ ├── semaphore_posix.cc
│ ├── semaphore_test.cc
│ └── semaphore_win.cc
├── thread/
│ ├── stoppable.h
│ ├── thread.cc
│ ├── thread.h
│ ├── thread_log_messages.cc
│ ├── thread_log_messages.h
│ ├── thread_log_messages_test.cc
│ ├── thread_posix.cc
│ ├── thread_test.cc
│ ├── thread_win.cc
│ ├── worker_thread.cc
│ ├── worker_thread.h
│ └── worker_thread_test.cc
└── win/
├── address_types.h
├── checked_win_address_range.h
├── command_line.cc
├── command_line.h
├── command_line_test.cc
├── context_wrappers.h
├── critical_section_with_debug_info.cc
├── critical_section_with_debug_info.h
├── critical_section_with_debug_info_test.cc
├── exception_codes.h
├── exception_handler_server.cc
├── exception_handler_server.h
├── exception_handler_server_test.cc
├── get_function.cc
├── get_function.h
├── get_function_test.cc
├── get_module_information.cc
├── get_module_information.h
├── handle.cc
├── handle.h
├── handle_test.cc
├── initial_client_data.cc
├── initial_client_data.h
├── initial_client_data_test.cc
├── loader_lock.cc
├── loader_lock.h
├── loader_lock_test.cc
├── loader_lock_test_dll.cc
├── module_version.cc
├── module_version.h
├── nt_internals.cc
├── nt_internals.h
├── ntstatus_logging.cc
├── ntstatus_logging.h
├── process_info.cc
├── process_info.h
├── process_info_test.cc
├── process_info_test_child.cc
├── process_structs.h
├── registration_protocol_win.cc
├── registration_protocol_win.h
├── registration_protocol_win_structs.h
├── registration_protocol_win_test.cc
├── safe_terminate_process.asm
├── safe_terminate_process.h
├── safe_terminate_process_test.cc
├── safe_terminate_process_test_child.cc
├── scoped_handle.cc
├── scoped_handle.h
├── scoped_local_alloc.cc
├── scoped_local_alloc.h
├── scoped_process_suspend.cc
├── scoped_process_suspend.h
├── scoped_process_suspend_test.cc
├── scoped_registry_key.h
├── scoped_set_event.cc
├── scoped_set_event.h
├── session_end_watcher.cc
├── session_end_watcher.h
├── session_end_watcher_test.cc
├── termination_codes.h
├── traits.h
└── xp_compat.h
Showing preview only (488K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (5517 symbols across 973 files)
FILE: build/fuchsia_envs.py
function main (line 23) | def main(args):
FILE: build/install_linux_sysroot.py
function main (line 36) | def main():
FILE: build/ios/convert_gn_xcodeproj.py
class Template (line 59) | class Template(string.Template):
function LoadSchemeTemplate (line 67) | def LoadSchemeTemplate(root, name):
function CreateIdentifier (line 74) | def CreateIdentifier(str_id):
function GenerateSchemeForTarget (line 79) | def GenerateSchemeForTarget(root, project, old_project, name, path, is_t...
class XcodeProject (line 155) | class XcodeProject(object):
method __init__ (line 157) | def __init__(self, objects, counter = 0):
method AddObject (line 161) | def AddObject(self, parent_name, obj):
method IterObjectsByIsa (line 173) | def IterObjectsByIsa(self, isa):
method IterNativeTargetByProductType (line 179) | def IterNativeTargetByProductType(self, product_types):
method UpdateBuildScripts (line 185) | def UpdateBuildScripts(self):
method UpdateBuildConfigurations (line 205) | def UpdateBuildConfigurations(self, configurations):
method GetHostMappingForXCTests (line 232) | def GetHostMappingForXCTests(self):
function check_output (line 261) | def check_output(command):
function CopyFileIfChanged (line 266) | def CopyFileIfChanged(source_path, target_path):
function CopyTreeIfChanged (line 276) | def CopyTreeIfChanged(source, target):
function LoadXcodeProjectAsJSON (line 288) | def LoadXcodeProjectAsJSON(project_dir):
function WriteXcodeProject (line 295) | def WriteXcodeProject(output_path, json_string):
function UpdateXcodeProject (line 306) | def UpdateXcodeProject(project_dir, old_project_dir, configurations, roo...
function CreateGroup (line 363) | def CreateGroup(project, parent_group, group_name, use_relative_paths):
class ObjectKey (line 379) | class ObjectKey(object):
method __init__ (line 396) | def __init__(self, obj, last):
method __lt__ (line 404) | def __lt__(self, other):
method __gt__ (line 411) | def __gt__(self, other):
method __eq__ (line 418) | def __eq__(self, other):
function SortFileReferencesByName (line 422) | def SortFileReferencesByName(project, group_object, products_group_ref):
function SortFileReferencesByNameWithSortKey (line 428) | def SortFileReferencesByNameWithSortKey(project, group_object, sort_key):
function AddMarkdownToProject (line 436) | def AddMarkdownToProject(project, root_dir, group_object, use_relative_p...
function GetFolderForPath (line 466) | def GetFolderForPath(project, group_object, path, use_relative_paths):
function ConvertGnXcodeProject (line 490) | def ConvertGnXcodeProject(root_dir, proj_name, input_dir, output_dir, co...
function Main (line 518) | def Main(args):
FILE: build/ios/setup_ios_gn.py
function HostCpuArch (line 47) | def HostCpuArch():
class ConfigParserWithStringInterpolation (line 56) | class ConfigParserWithStringInterpolation(configparser.ConfigParser):
method values (line 62) | def values(self, section):
method getstring (line 68) | def getstring(self, section, option, fallback=''):
method _UnquoteString (line 75) | def _UnquoteString(self, string):
method _ExpandEnvVar (line 80) | def _ExpandEnvVar(self, value):
class GnGenerator (line 89) | class GnGenerator(object):
method __init__ (line 119) | def __init__(self, settings, config, target):
method _GetGnArgs (line 126) | def _GetGnArgs(self):
method Generate (line 156) | def Generate(self, gn_path, proj_name, root_path, build_dir):
method CreateGnRules (line 161) | def CreateGnRules(self, gn_path, root_path, build_dir):
method WriteArgsGn (line 167) | def WriteArgsGn(self, build_dir, xcode_project_name=None):
method WriteBuildNinja (line 206) | def WriteBuildNinja(self, gn_command, build_dir):
method WriteBuildNinjaDeps (line 218) | def WriteBuildNinjaDeps(self, build_dir):
method GetGnCommand (line 222) | def GetGnCommand(self, gn_path, src_path, out_path, xcode_project_name...
function NinjaNeedEscape (line 245) | def NinjaNeedEscape(arg):
function NinjaEscapeCommand (line 250) | def NinjaEscapeCommand(command):
function FindGn (line 263) | def FindGn():
function GenerateXcodeProject (line 272) | def GenerateXcodeProject(gn_path, root_dir, proj_name, out_dir, settings):
function CreateLLDBInitFile (line 289) | def CreateLLDBInitFile(root_dir, out_dir, settings):
function GenerateGnBuildRules (line 331) | def GenerateGnBuildRules(gn_path, root_dir, out_dir, settings):
function Main (line 343) | def Main(args):
FILE: build/run_tests.py
function _FindGNFromBinaryDir (line 32) | def _FindGNFromBinaryDir(binary_dir):
function _GetGNArgument (line 64) | def _GetGNArgument(argument_name, binary_dir):
function _EnableVTProcessingOnWindowsConsole (line 87) | def _EnableVTProcessingOnWindowsConsole():
function _RunOnAndroidTarget (line 125) | def _RunOnAndroidTarget(binary_dir, test, android_device, extra_command_...
function _RunOnIOSTarget (line 302) | def _RunOnIOSTarget(binary_dir,
function main (line 402) | def main(args):
FILE: client/annotation.cc
type crashpad (line 22) | namespace crashpad {
FILE: client/annotation.h
function namespace (line 33) | namespace crashpad {
FILE: client/annotation_list.cc
type crashpad (line 20) | namespace crashpad {
function T (line 23) | T* AnnotationList::IteratorBase<T>::operator*() const {
function T (line 29) | T* AnnotationList::IteratorBase<T>::operator->() const {
class AnnotationList::IteratorBase<Annotation> (line 59) | class AnnotationList::IteratorBase<Annotation>
class AnnotationList::IteratorBase<const Annotation> (line 60) | class AnnotationList::IteratorBase<const Annotation>
function AnnotationList (line 72) | AnnotationList* AnnotationList::Get() {
function AnnotationList (line 77) | AnnotationList* AnnotationList::Register() {
FILE: client/annotation_list.h
function namespace (line 23) | namespace crashpad {
FILE: client/annotation_list_test.cc
type crashpad (line 29) | namespace crashpad {
type test (line 30) | namespace test {
function VerifyIsInputIterator (line 36) | void VerifyIsInputIterator(Iterator) {}
type IsLegacyIteratorImpl (line 39) | struct IsLegacyIteratorImpl {
type IsLegacyInputIteratorImpl (line 53) | struct IsLegacyInputIteratorImpl {
function VerifyIsInputIterator (line 74) | void VerifyIsInputIterator(Iterator) {
function TEST (line 79) | TEST(AnnotationListStatic, Register) {
class AnnotationList (line 94) | class AnnotationList : public testing::Test {
method SetUp (line 96) | void SetUp() override {
method TearDown (line 100) | void TearDown() override {
method AllAnnotations (line 114) | AllAnnotations CollectAnnotations() {
method ContainsNameValue (line 127) | bool ContainsNameValue(const AllAnnotations& annotations,
function TEST_F (line 138) | TEST_F(AnnotationList, SetAndClear) {
function TEST_F (line 162) | TEST_F(AnnotationList, DuplicateKeys) {
function TEST_F (line 180) | TEST_F(AnnotationList, IteratorSingleAnnotation) {
function TEST_F (line 202) | TEST_F(AnnotationList, IteratorMultipleAnnotationsInserted) {
function TEST_F (line 238) | TEST_F(AnnotationList, IteratorMultipleAnnotationsInsertedAndRemoved) {
function TEST_F (line 274) | TEST_F(AnnotationList, IteratorIsInputIterator) {
class RaceThread (line 291) | class RaceThread : public Thread {
method RaceThread (line 293) | explicit RaceThread(test::AnnotationList* test) : Thread(), test_(...
method ThreadMain (line 296) | void ThreadMain() override {
function TEST_F (line 311) | TEST_F(AnnotationList, MultipleThreads) {
FILE: client/annotation_test.cc
type crashpad (line 28) | namespace crashpad {
type test (line 29) | namespace test {
class SpinGuardAnnotation (line 32) | class SpinGuardAnnotation final : public Annotation {
method SpinGuardAnnotation (line 34) | SpinGuardAnnotation(Annotation::Type type, const char name[])
method Set (line 40) | bool Set(bool value, uint64_t spin_guard_timeout_ns) {
class ScopedSpinGuardUnlockThread (line 54) | class ScopedSpinGuardUnlockThread final : public Thread {
method ScopedSpinGuardUnlockThread (line 56) | ScopedSpinGuardUnlockThread(ScopedSpinGuard scoped_spin_guard,
method ThreadMain (line 62) | void ThreadMain() override {
class Annotation (line 76) | class Annotation : public testing::Test {
method SetUp (line 78) | void SetUp() override {
method TearDown (line 82) | void TearDown() override {
method AnnotationsCount (line 86) | size_t AnnotationsCount() {
function TEST_F (line 99) | TEST_F(Annotation, Basics) {
function TEST_F (line 131) | TEST_F(Annotation, StringType) {
function TEST_F (line 158) | TEST_F(Annotation, BaseAnnotationShouldNotSupportSpinGuard) {
function TEST_F (line 171) | TEST_F(Annotation, CustomAnnotationShouldSupportSpinGuardAndSet) {
function TEST_F (line 181) | TEST_F(Annotation, CustomAnnotationSetShouldFailIfRunConcurrently) {
function TEST_F (line 191) | TEST_F(Annotation,
function TEST (line 214) | TEST(StringAnnotation, ArrayOfString) {
function TEST (line 229) | TEST(AnnotationDeathTest, EmbeddedNUL) {
FILE: client/client_argv_handling.cc
type crashpad (line 19) | namespace crashpad {
function FormatArgumentString (line 23) | std::string FormatArgumentString(const std::string& name,
function BuildHandlerArgvStrings (line 30) | std::vector<std::string> BuildHandlerArgvStrings(
function StringVectorToCStringVector (line 70) | void StringVectorToCStringVector(const std::vector<std::string>& strings,
FILE: client/client_argv_handling.h
function namespace (line 24) | namespace crashpad {
FILE: client/crash_handler_base_ios.cc
type crashpad (line 10) | namespace crashpad {
type sigaction (line 79) | struct sigaction
FILE: client/crash_handler_base_ios.h
function namespace (line 21) | namespace crashpad {
FILE: client/crash_handler_ios.cc
function IsBeingDebugged (line 21) | bool IsBeingDebugged() {
type crashpad (line 33) | namespace crashpad {
function mach_port_t (line 44) | mach_port_t CrashHandler::ThreadSafeScopedMachPortWithReceiveRight::ge...
type sigaction (line 72) | struct sigaction
function CrashHandler (line 82) | CrashHandler* CrashHandler::Get() {
type sigaction (line 121) | struct sigaction
function kern_return_t (line 209) | kern_return_t CrashHandler::CatchMachException(
FILE: client/crash_handler_ios.h
function namespace (line 15) | namespace crashpad {
FILE: client/crash_handler_tvos.cc
type crashpad (line 12) | namespace crashpad {
type sigaction (line 29) | struct sigaction
function CrashHandler (line 39) | CrashHandler* CrashHandler::Get() {
type sigaction (line 76) | struct sigaction
FILE: client/crash_handler_tvos.h
function namespace (line 11) | namespace crashpad {
FILE: client/crash_report_database.cc
type crashpad (line 25) | namespace crashpad {
function AttachmentNameIsOK (line 31) | bool AttachmentNameIsOK(const std::string& name) {
function FileReaderInterface (line 86) | FileReaderInterface* CrashReportDatabase::NewReport::Reader() {
function FileWriter (line 95) | FileWriter* CrashReportDatabase::NewReport::AddAttachment(
FILE: client/crash_report_database.h
function namespace (line 34) | namespace crashpad {
FILE: client/crash_report_database_generic.cc
type crashpad (line 34) | namespace crashpad {
function ReplaceFinalExtension (line 38) | base::FilePath ReplaceFinalExtension(
function UUID (line 44) | UUID UUIDFromReportPath(const base::FilePath& path) {
type ReportMetadata (line 82) | struct ReportMetadata {
class ScopedLockFile (line 93) | class ScopedLockFile {
method ScopedLockFile (line 95) | ScopedLockFile() = default;
method ScopedLockFile (line 97) | ScopedLockFile(const ScopedLockFile&) = delete;
method ScopedLockFile (line 98) | ScopedLockFile& operator=(const ScopedLockFile&) = delete;
method ScopedLockFile (line 102) | ScopedLockFile& operator=(ScopedLockFile&& other) {
method ResetAcquire (line 109) | bool ResetAcquire(const base::FilePath& report_path) {
method is_valid (line 130) | bool is_valid() const { return lock_file_.is_valid(); }
method IsExpired (line 133) | static bool IsExpired(const base::FilePath& lock_path, time_t lockfi...
class CrashReportDatabaseGeneric (line 161) | class CrashReportDatabaseGeneric : public CrashReportDatabase {
method CrashReportDatabaseGeneric (line 165) | CrashReportDatabaseGeneric(const CrashReportDatabaseGeneric&) = delete;
method CrashReportDatabaseGeneric (line 166) | CrashReportDatabaseGeneric& operator=(const CrashReportDatabaseGener...
type LockfileUploadReport (line 194) | struct LockfileUploadReport : public UploadReport {
type ReportState (line 198) | enum ReportState : int32_t {
method Settings (line 262) | Settings& SettingsInternal() {
function Settings (line 308) | Settings* CrashReportDatabaseGeneric::GetSettings() {
function OperationStatus (line 313) | OperationStatus CrashReportDatabaseGeneric::PrepareNewCrashReport(
function OperationStatus (line 327) | OperationStatus CrashReportDatabaseGeneric::FinishedWritingCrashReport(
function OperationStatus (line 367) | OperationStatus CrashReportDatabaseGeneric::LookUpCrashReport(const UU...
function OperationStatus (line 376) | OperationStatus CrashReportDatabaseGeneric::GetPendingReports(
function OperationStatus (line 382) | OperationStatus CrashReportDatabaseGeneric::GetCompletedReports(
function OperationStatus (line 388) | OperationStatus CrashReportDatabaseGeneric::GetReportForUploading(
function OperationStatus (line 412) | OperationStatus CrashReportDatabaseGeneric::SkipReportUpload(
function OperationStatus (line 450) | OperationStatus CrashReportDatabaseGeneric::DeleteReport(const UUID& u...
function OperationStatus (line 474) | OperationStatus CrashReportDatabaseGeneric::RequestUpload(const UUID& ...
function OperationStatus (line 550) | OperationStatus CrashReportDatabaseGeneric::RecordUploadAttempt(
function OperationStatus (line 613) | OperationStatus CrashReportDatabaseGeneric::LocateAndLockReport(
function OperationStatus (line 646) | OperationStatus CrashReportDatabaseGeneric::CheckoutReport(
function OperationStatus (line 669) | OperationStatus CrashReportDatabaseGeneric::ReportsInState(
FILE: client/crash_report_database_test.cc
type crashpad (line 31) | namespace crashpad {
type test (line 32) | namespace test {
class CrashReportDatabaseTest (line 35) | class CrashReportDatabaseTest : public testing::Test {
method CrashReportDatabaseTest (line 37) | CrashReportDatabaseTest() {}
method CrashReportDatabaseTest (line 39) | CrashReportDatabaseTest(const CrashReportDatabaseTest&) = delete;
method CrashReportDatabaseTest (line 40) | CrashReportDatabaseTest& operator=(const CrashReportDatabaseTest&)...
method SetUp (line 44) | void SetUp() override {
method ResetDatabase (line 49) | void ResetDatabase() { db_.reset(); }
method CrashReportDatabase (line 51) | CrashReportDatabase* db() { return db_.get(); }
method path (line 52) | base::FilePath path() const {
method CreateCrashReport (line 56) | void CreateCrashReport(CrashReportDatabase::Report* report) {
method UploadReport (line 78) | void UploadReport(const UUID& uuid, bool successful, const std::st...
method ExpectPreparedCrashReport (line 103) | void ExpectPreparedCrashReport(const CrashReportDatabase::Report& ...
method RelocateDatabase (line 116) | void RelocateDatabase() {
method RequestUpload (line 122) | CrashReportDatabase::OperationStatus RequestUpload(const UUID& uui...
function TEST_F (line 137) | TEST_F(CrashReportDatabaseTest, Initialize) {
function TEST_F (line 192) | TEST_F(CrashReportDatabaseTest, Settings) {
function TEST_F (line 227) | TEST_F(CrashReportDatabaseTest, NewCrashReport) {
function TEST_F (line 252) | TEST_F(CrashReportDatabaseTest, LookUpCrashReport) {
function TEST_F (line 290) | TEST_F(CrashReportDatabaseTest, RecordUploadAttempt) {
function TEST_F (line 374) | TEST_F(CrashReportDatabaseTest, GetCompletedAndNotUploadedReports) {
function TEST_F (line 501) | TEST_F(CrashReportDatabaseTest, DuelingUploads) {
function TEST_F (line 519) | TEST_F(CrashReportDatabaseTest, InterruptedIOSUploads) {
function TEST_F (line 558) | TEST_F(CrashReportDatabaseTest, UploadAlreadyUploaded) {
function TEST_F (line 574) | TEST_F(CrashReportDatabaseTest, MoveDatabase) {
function TEST_F (line 590) | TEST_F(CrashReportDatabaseTest, ReportRemoved) {
function TEST_F (line 609) | TEST_F(CrashReportDatabaseTest, DeleteReport) {
function TEST_F (line 658) | TEST_F(CrashReportDatabaseTest, DeleteReportEmptyingDatabase) {
function TEST_F (line 676) | TEST_F(CrashReportDatabaseTest, ReadEmptyDatabase) {
function TEST_F (line 688) | TEST_F(CrashReportDatabaseTest, RequestUpload) {
function TEST_F (line 756) | TEST_F(CrashReportDatabaseTest, Attachments) {
function TEST_F (line 797) | TEST_F(CrashReportDatabaseTest, OrphanedAttachments) {
function TEST_F (line 867) | TEST_F(CrashReportDatabaseTest, CleanBrokenDatabase) {
function TEST_F (line 933) | TEST_F(CrashReportDatabaseTest, TotalSize_MainReportOnly) {
function TEST_F (line 954) | TEST_F(CrashReportDatabaseTest, GetReportSize_RightSizeWithAttachmen...
function TEST_F (line 988) | TEST_F(CrashReportDatabaseTest, InitializeFromLargerFileRetainsClien...
FILE: client/crash_report_database_win.cc
type crashpad (line 39) | namespace crashpad {
function AddStringToTable (line 59) | uint32_t AddStringToTable(std::string* string_table, const std::string...
function AddStringToTable (line 68) | uint32_t AddStringToTable(std::string* string_table, const std::wstrin...
function ReadRestOfFileAsString (line 73) | std::string ReadRestOfFileAsString(FileHandle file) {
function UUIDFromReportPath (line 87) | bool UUIDFromReportPath(const base::FilePath& path, UUID* uuid) {
type MetadataFileHeader (line 97) | struct MetadataFileHeader {
type ReportDisk (line 104) | struct ReportDisk
type ReportState (line 106) | enum class ReportState {
type MetadataFileReportRecord (line 123) | struct MetadataFileReportRecord {
method MetadataFileReportRecord (line 127) | MetadataFileReportRecord() {}
type ReportDisk (line 147) | struct ReportDisk : public CrashReportDatabase::Report {
class Metadata (line 210) | class Metadata {
method Metadata (line 212) | Metadata(const Metadata&) = delete;
method Metadata (line 213) | Metadata& operator=(const Metadata&) = delete;
function OperationStatus (line 364) | OperationStatus Metadata::FindReports(
function OperationStatus (line 377) | OperationStatus Metadata::FindSingleReport(
function OperationStatus (line 392) | OperationStatus Metadata::FindSingleReportAndMarkDirty(
function OperationStatus (line 410) | OperationStatus Metadata::DeleteReport(const UUID& uuid,
function OperationStatus (line 569) | OperationStatus Metadata::VerifyReportAnyState(const ReportDisk& repor...
function OperationStatus (line 579) | OperationStatus Metadata::VerifyReport(const ReportDisk& report_disk,
function EnsureDirectory (line 590) | bool EnsureDirectory(const base::FilePath& path) {
function CreateDirectoryIfNecessary (line 609) | bool CreateDirectoryIfNecessary(const base::FilePath& path) {
class CrashReportDatabaseWin (line 623) | class CrashReportDatabaseWin : public CrashReportDatabase {
method CrashReportDatabaseWin (line 627) | CrashReportDatabaseWin(const CrashReportDatabaseWin&) = delete;
method CrashReportDatabaseWin (line 628) | CrashReportDatabaseWin& operator=(const CrashReportDatabaseWin&) = d...
method Settings (line 665) | Settings& SettingsInternal() {
function Settings (line 712) | Settings* CrashReportDatabaseWin::GetSettings() {
function OperationStatus (line 717) | OperationStatus CrashReportDatabaseWin::PrepareNewCrashReport(
function OperationStatus (line 732) | OperationStatus CrashReportDatabaseWin::FinishedWritingCrashReport(
function OperationStatus (line 763) | OperationStatus CrashReportDatabaseWin::LookUpCrashReport(const UUID& ...
function OperationStatus (line 778) | OperationStatus CrashReportDatabaseWin::GetPendingReports(
function OperationStatus (line 787) | OperationStatus CrashReportDatabaseWin::GetCompletedReports(
function OperationStatus (line 796) | OperationStatus CrashReportDatabaseWin::GetReportForUploading(
function OperationStatus (line 824) | OperationStatus CrashReportDatabaseWin::RecordUploadAttempt(
function OperationStatus (line 864) | OperationStatus CrashReportDatabaseWin::DeleteReport(const UUID& uuid) {
function OperationStatus (line 886) | OperationStatus CrashReportDatabaseWin::SkipReportUpload(
function OperationStatus (line 913) | OperationStatus CrashReportDatabaseWin::RequestUpload(const UUID& uuid) {
function InitializeInternal (line 1030) | std::unique_ptr<CrashReportDatabase> InitializeInternal(
FILE: client/crashpad_client.h
function namespace (line 49) | namespace crashpad {
FILE: client/crashpad_client_fuchsia.cc
type crashpad (line 28) | namespace crashpad {
FILE: client/crashpad_client_ios.cc
type crashpad (line 26) | namespace crashpad {
FILE: client/crashpad_client_linux.cc
type crashpad (line 52) | namespace crashpad {
function FormatArgumentInt (line 56) | std::string FormatArgumentInt(const std::string& name, int value) {
function FormatArgumentAddress (line 60) | std::string FormatArgumentAddress(const std::string& name, const void*...
function BuildAppProcessArgs (line 66) | std::vector<std::string> BuildAppProcessArgs(
function BuildArgsToLaunchWithLinker (line 102) | std::vector<std::string> BuildArgsToLaunchWithLinker(
class SignalHandler (line 137) | class SignalHandler {
method SignalHandler (line 139) | SignalHandler(const SignalHandler&) = delete;
method SignalHandler (line 140) | SignalHandler& operator=(const SignalHandler&) = delete;
method SignalHandler (line 144) | static SignalHandler* Get() { return handler_; }
method Disable (line 149) | static void Disable() {
method SetFirstChanceHandler (line 155) | void SetFirstChanceHandler(CrashpadClient::FirstChanceHandler handle...
method SetLastChanceExceptionHandler (line 159) | void SetLastChanceExceptionHandler(LastChanceHandler handler) {
method HandleCrash (line 165) | void HandleCrash(int signo, siginfo_t* siginfo, void* context) {
method SignalHandler (line 179) | SignalHandler() = default;
method Install (line 182) | bool Install(const std::set<int>* unhandled_signals) {
method ExceptionInformation (line 195) | const ExceptionInformation& GetExceptionInfo() {
method HandleOrReraiseSignal (line 206) | static void HandleOrReraiseSignal(int signo,
method WaitForDumpDone (line 247) | void WaitForDumpDone() {
method WakeThreads (line 259) | void WakeThreads() {
class LaunchAtCrashHandler (line 282) | class LaunchAtCrashHandler : public SignalHandler {
method LaunchAtCrashHandler (line 284) | LaunchAtCrashHandler(const LaunchAtCrashHandler&) = delete;
method LaunchAtCrashHandler (line 285) | LaunchAtCrashHandler& operator=(const LaunchAtCrashHandler&) = delete;
method LaunchAtCrashHandler (line 287) | static LaunchAtCrashHandler* Get() {
method Initialize (line 292) | bool Initialize(std::vector<std::string>* argv_in,
method HandleCrashImpl (line 310) | void HandleCrashImpl() override {
method LaunchAtCrashHandler (line 333) | LaunchAtCrashHandler() = default;
class RequestCrashDumpHandler (line 344) | class RequestCrashDumpHandler : public SignalHandler {
method RequestCrashDumpHandler (line 346) | RequestCrashDumpHandler(const RequestCrashDumpHandler&) = delete;
method RequestCrashDumpHandler (line 347) | RequestCrashDumpHandler& operator=(const RequestCrashDumpHandler&) =...
method RequestCrashDumpHandler (line 349) | static RequestCrashDumpHandler* Get() {
method Initialize (line 362) | bool Initialize(ScopedFileHandle sock,
method GetHandlerSocket (line 384) | bool GetHandlerSocket(int* sock, pid_t* pid) {
method HandleCrashImpl (line 397) | void HandleCrashImpl() override {
method SetCrashLoopBefore (line 417) | void SetCrashLoopBefore(uint64_t crash_loop_before_time) {
method RequestCrashDumpHandler (line 423) | RequestCrashDumpHandler() = default;
method SetPtracerAtFork (line 427) | static void SetPtracerAtFork() {
FILE: client/crashpad_client_linux_test.cc
type crashpad (line 64) | namespace crashpad {
type test (line 65) | namespace test {
type CrashType (line 68) | enum class CrashType : uint32_t {
type StartHandlerForSelfTestOptions (line 77) | struct StartHandlerForSelfTestOptions {
class StartHandlerForSelfTest (line 87) | class StartHandlerForSelfTest
method StartHandlerForSelfTest (line 91) | StartHandlerForSelfTest() = default;
method StartHandlerForSelfTest (line 93) | StartHandlerForSelfTest(const StartHandlerForSelfTest&) = delete;
method StartHandlerForSelfTest (line 94) | StartHandlerForSelfTest& operator=(const StartHandlerForSelfTest&)...
method SetUp (line 98) | void SetUp() override {
method StartHandlerForSelfTestOptions (line 111) | const StartHandlerForSelfTestOptions& Options() const { return opt...
function InstallHandler (line 117) | bool InstallHandler(CrashpadClient* client,
function ValidateAttachment (line 150) | void ValidateAttachment(const CrashReportDatabase::UploadReport* rep...
function ValidateExtraMemory (line 159) | void ValidateExtraMemory(const StartHandlerForSelfTestOptions& options,
function ValidateDump (line 184) | void ValidateDump(const StartHandlerForSelfTestOptions& options,
function RecurseInfinitely (line 232) | __attribute__((optnone))
function HandleCrashSuccessfully (line 242) | bool HandleCrashSuccessfully(int, siginfo_t*, ucontext_t*) {
function HandleCrashSuccessfullyAfterReporting (line 250) | bool HandleCrashSuccessfullyAfterReporting(int, siginfo_t*, ucontext...
function DoCrash (line 254) | void DoCrash(const StartHandlerForSelfTestOptions& options,
class ScopedAltSignalStack (line 295) | class ScopedAltSignalStack {
method ScopedAltSignalStack (line 297) | ScopedAltSignalStack() = default;
method ScopedAltSignalStack (line 299) | ScopedAltSignalStack(const ScopedAltSignalStack&) = delete;
method ScopedAltSignalStack (line 300) | ScopedAltSignalStack& operator=(const ScopedAltSignalStack&) = del...
method Initialize (line 312) | void Initialize() {
class CrashThread (line 334) | class CrashThread : public Thread {
method CrashThread (line 336) | CrashThread(const StartHandlerForSelfTestOptions& options,
method CrashThread (line 340) | CrashThread(const CrashThread&) = delete;
method CrashThread (line 341) | CrashThread& operator=(const CrashThread&) = delete;
method ThreadMain (line 344) | void ThreadMain() override {
function CRASHPAD_CHILD_TEST_MAIN (line 362) | CRASHPAD_CHILD_TEST_MAIN(StartHandlerForSelfTestChild) {
class StartHandlerForSelfInChildTest (line 443) | class StartHandlerForSelfInChildTest : public MultiprocessExec {
method StartHandlerForSelfInChildTest (line 445) | StartHandlerForSelfInChildTest(const StartHandlerForSelfTestOption...
method StartHandlerForSelfInChildTest (line 477) | StartHandlerForSelfInChildTest(const StartHandlerForSelfInChildTes...
method StartHandlerForSelfInChildTest (line 479) | StartHandlerForSelfInChildTest& operator=(
method MultiprocessParent (line 483) | void MultiprocessParent() override {
function TEST_P (line 546) | TEST_P(StartHandlerForSelfTest, StartHandlerInChild) {
class StartHandlerForClientTest (line 603) | class StartHandlerForClientTest {
method StartHandlerForClientTest (line 605) | StartHandlerForClientTest() = default;
method StartHandlerForClientTest (line 607) | StartHandlerForClientTest(const StartHandlerForClientTest&) = delete;
method StartHandlerForClientTest (line 608) | StartHandlerForClientTest& operator=(const StartHandlerForClientTe...
method Initialize (line 613) | bool Initialize(bool sanitize) {
method StartHandlerOnDemand (line 619) | bool StartHandlerOnDemand() {
method ExpectReport (line 644) | void ExpectReport() {
method InstallHandler (line 664) | bool InstallHandler() {
class SandboxedHandler (line 672) | class SandboxedHandler {
method SandboxedHandler (line 674) | SandboxedHandler(const SandboxedHandler&) = delete;
method SandboxedHandler (line 675) | SandboxedHandler& operator=(const SandboxedHandler&) = delete;
method SandboxedHandler (line 677) | static SandboxedHandler* Get() {
method Initialize (line 682) | bool Initialize(FileHandle client_sock, bool sanitize) {
method SandboxedHandler (line 689) | SandboxedHandler() = default;
method HandleCrash (line 692) | static void HandleCrash(int signo, siginfo_t* siginfo, void* con...
class StartHandlerForChildTest (line 738) | class StartHandlerForChildTest : public Multiprocess {
method StartHandlerForChildTest (line 740) | StartHandlerForChildTest() = default;
method StartHandlerForChildTest (line 742) | StartHandlerForChildTest(const StartHandlerForChildTest&) = delete;
method StartHandlerForChildTest (line 743) | StartHandlerForChildTest& operator=(const StartHandlerForChildTest...
method Initialize (line 747) | bool Initialize(bool sanitize) {
method MultiprocessParent (line 753) | void MultiprocessParent() {
method MultiprocessChild (line 762) | [[noreturn]] void MultiprocessChild() {
function TEST (line 771) | TEST(CrashpadClient, StartHandlerForChild) {
function TEST (line 777) | TEST(CrashpadClient, SanitizedChild) {
FILE: client/crashpad_client_mac.cc
type crashpad (line 42) | namespace crashpad {
function FormatArgumentString (line 46) | std::string FormatArgumentString(const std::string& name,
function FormatArgumentInt (line 51) | std::string FormatArgumentInt(const std::string& name, int value) {
function SetCrashExceptionPorts (line 84) | bool SetCrashExceptionPorts(exception_handler_t exception_handler) {
class ScopedPthreadAttrDestroy (line 100) | class ScopedPthreadAttrDestroy {
method ScopedPthreadAttrDestroy (line 102) | explicit ScopedPthreadAttrDestroy(pthread_attr_t* pthread_attr)
method ScopedPthreadAttrDestroy (line 106) | ScopedPthreadAttrDestroy(const ScopedPthreadAttrDestroy&) = delete;
method ScopedPthreadAttrDestroy (line 107) | ScopedPthreadAttrDestroy& operator=(const ScopedPthreadAttrDestroy&)...
class HandlerStarter (line 119) | class HandlerStarter final : public NotifyServer::DefaultInterface {
method HandlerStarter (line 121) | HandlerStarter(const HandlerStarter&) = delete;
method HandlerStarter (line 122) | HandlerStarter& operator=(const HandlerStarter&) = delete;
method InitialStart (line 133) | static base::apple::ScopedMachSendRight InitialStart(
method kern_return_t (line 202) | kern_return_t DoMachNotifyPortDestroyed(notify_port_t notify,
method HandlerStarter (line 233) | HandlerStarter()
method CommonStart (line 264) | static bool CommonStart(const base::FilePath& handler,
method StartRestartThread (line 384) | bool StartRestartThread(const base::FilePath& handler,
FILE: client/crashpad_client_win.cc
type StartupState (line 87) | enum class StartupState : int {
function SetHandlerStartupState (line 107) | void SetHandlerStartupState(StartupState state) {
function StartupState (line 112) | StartupState BlockUntilHandlerStartedOrFailed() {
function LONG (line 127) | LONG WINAPI UnhandledExceptionHandler(EXCEPTION_POINTERS* exception_poin...
function LONG (line 191) | LONG WINAPI HandleHeapCorruption(EXCEPTION_POINTERS* exception_pointers) {
function HandleAbortSignal (line 201) | void HandleAbortSignal(int signum) {
function FormatArgumentString (line 219) | std::wstring FormatArgumentString(const std::string& name,
type ScopedProcThreadAttributeListTraits (line 224) | struct ScopedProcThreadAttributeListTraits {
method PPROC_THREAD_ATTRIBUTE_LIST (line 225) | static PPROC_THREAD_ATTRIBUTE_LIST InvalidValue() { return nullptr; }
method Free (line 227) | static void Free(PPROC_THREAD_ATTRIBUTE_LIST proc_thread_attribute_lis...
function IsInheritableHandle (line 241) | bool IsInheritableHandle(HANDLE handle) {
function AddHandleToListIfValidAndInheritable (line 263) | void AddHandleToListIfValidAndInheritable(std::vector<HANDLE>* handle_list,
function AddUint32 (line 275) | void AddUint32(std::vector<unsigned char>* data_vector, uint32_t data) {
function AddUint64 (line 282) | void AddUint64(std::vector<unsigned char>* data_vector, uint64_t data) {
function CreatePipe (line 293) | void CreatePipe(std::wstring* pipe_name, ScopedFileHANDLE* pipe_instance) {
FILE: client/crashpad_client_win_test.cc
type crashpad (line 28) | namespace crashpad {
type test (line 29) | namespace test {
function StartAndUseHandler (line 32) | void StartAndUseHandler(const base::FilePath& temp_dir) {
class StartWithInvalidHandles (line 48) | class StartWithInvalidHandles final : public WinMultiprocessWithTemp...
method StartWithInvalidHandles (line 50) | StartWithInvalidHandles() : WinMultiprocessWithTempDir() {}
method WinMultiprocessParent (line 54) | void WinMultiprocessParent() override {}
method WinMultiprocessChild (line 56) | void WinMultiprocessChild() override {
function TEST (line 69) | TEST(CrashpadClient, StartWithInvalidHandles) {
class StartWithSameStdoutStderr (line 73) | class StartWithSameStdoutStderr final : public WinMultiprocessWithTe...
method StartWithSameStdoutStderr (line 75) | StartWithSameStdoutStderr() : WinMultiprocessWithTempDir() {}
method WinMultiprocessParent (line 79) | void WinMultiprocessParent() override {}
method WinMultiprocessChild (line 81) | void WinMultiprocessChild() override {
function TEST (line 92) | TEST(CrashpadClient, StartWithSameStdoutStderr) {
function StartAndUseBrokenHandler (line 96) | void StartAndUseBrokenHandler(CrashpadClient* client) {
class HandlerLaunchFailureCrash (line 110) | class HandlerLaunchFailureCrash : public WinMultiprocess {
method HandlerLaunchFailureCrash (line 112) | HandlerLaunchFailureCrash() : WinMultiprocess() {}
method WinMultiprocessParent (line 115) | void WinMultiprocessParent() override {
method WinMultiprocessChild (line 119) | void WinMultiprocessChild() override {
function TEST (line 133) | TEST(CrashpadClient, MAYBE_HandlerLaunchFailureCrash) {
class HandlerLaunchFailureDumpAndCrash (line 137) | class HandlerLaunchFailureDumpAndCrash : public WinMultiprocess {
method HandlerLaunchFailureDumpAndCrash (line 139) | HandlerLaunchFailureDumpAndCrash() : WinMultiprocess() {}
method WinMultiprocessParent (line 142) | void WinMultiprocessParent() override {
method WinMultiprocessChild (line 146) | void WinMultiprocessChild() override {
function TEST (line 164) | TEST(CrashpadClient, MAYBE_HandlerLaunchFailureDumpAndCrash) {
class HandlerLaunchFailureDumpWithoutCrash (line 168) | class HandlerLaunchFailureDumpWithoutCrash : public WinMultiprocess {
method HandlerLaunchFailureDumpWithoutCrash (line 170) | HandlerLaunchFailureDumpWithoutCrash() : WinMultiprocess() {}
method WinMultiprocessParent (line 173) | void WinMultiprocessParent() override {
method WinMultiprocessChild (line 180) | void WinMultiprocessChild() override {
function TEST (line 191) | TEST(CrashpadClient, HandlerLaunchFailureDumpWithoutCrash) {
FILE: client/crashpad_info.cc
type crashpad (line 54) | namespace crashpad {
function CrashpadInfo (line 113) | CrashpadInfo* CrashpadInfo::GetCrashpadInfo() {
function UserDataMinidumpStreamHandle (line 148) | UserDataMinidumpStreamHandle* CrashpadInfo::AddUserDataMinidumpStream(
function UserDataMinidumpStreamHandle (line 160) | UserDataMinidumpStreamHandle* CrashpadInfo::UpdateUserDataMinidumpStream(
FILE: client/crashpad_info.h
function namespace (line 30) | namespace crashpad {
FILE: client/crashpad_info_test.cc
type crashpad (line 21) | namespace crashpad {
type test (line 22) | namespace test {
class CrashpadInfoTest (line 27) | class CrashpadInfoTest : public testing::Test {
method CrashpadInfo (line 29) | CrashpadInfo& crashpad_info() { return crashpad_info_; }
method SetUp (line 53) | void SetUp() override {
method TearDown (line 70) | void TearDown() override {
function TEST_F (line 99) | TEST_F(CrashpadInfoTest, UpdateUserDataMinidumpStreamHead) {
function TEST_F (line 113) | TEST_F(CrashpadInfoTest, UpdateUserDataMinidumpStreamTail) {
function TEST_F (line 124) | TEST_F(CrashpadInfoTest, UpdateUserDataMinidumpStreamMultipleTimes) {
FILE: client/ios_handler/exception_processor.h
function namespace (line 21) | namespace crashpad {
FILE: client/ios_handler/in_process_handler.cc
function CreateDirectory (line 34) | bool CreateDirectory(const base::FilePath& path) {
type crashpad (line 58) | namespace crashpad {
type internal (line 59) | namespace internal {
function IOSIntermediateDumpWriter (line 421) | IOSIntermediateDumpWriter* InProcessHandler::GetCachedWriter() {
FILE: client/ios_handler/in_process_handler.h
function namespace (line 40) | namespace crashpad {
FILE: client/ios_handler/in_process_handler_test.cc
type crashpad (line 23) | namespace crashpad {
type test (line 24) | namespace test {
function CreateFile (line 27) | bool CreateFile(const base::FilePath& file) {
class InProcessHandlerTest (line 34) | class InProcessHandlerTest : public testing::Test {
method SetUp (line 38) | void SetUp() override {
method CreateFiles (line 47) | void CreateFiles(int files, int other_files) {
method VerifyRemainingFileCount (line 64) | void VerifyRemainingFileCount(int expected_files_count,
method ClearFiles (line 88) | void ClearFiles() {
function TEST_F (line 107) | TEST_F(InProcessHandlerTest, TestPendingFileLimit) {
FILE: client/ios_handler/in_process_intermediate_dump_handler.cc
type crashpad (line 36) | namespace crashpad {
type internal (line 37) | namespace internal {
type crashreporter_annotations_t (line 54) | struct crashreporter_annotations_t {
class ScopedTaskThreads (line 83) | class ScopedTaskThreads {
method ScopedTaskThreads (line 85) | explicit ScopedTaskThreads(thread_act_array_t threads,
method ScopedTaskThreads (line 89) | ScopedTaskThreads(const ScopedTaskThreads&) = delete;
method ScopedTaskThreads (line 90) | ScopedTaskThreads& operator=(const ScopedTaskThreads&) = delete;
function WriteError (line 108) | void WriteError(IntermediateDumpKey key) {
function WriteProperty (line 129) | void WriteProperty(IOSIntermediateDumpWriter* writer,
function WritePropertyBytes (line 143) | void WritePropertyBytes(IOSIntermediateDumpWriter* writer,
function WritePropertyCString (line 157) | void WritePropertyCString(IOSIntermediateDumpWriter* writer,
function kern_return_t (line 165) | kern_return_t MachVMRegionRecurseDeepest(task_t task,
function LocateRedZone (line 230) | void LocateRedZone(vm_address_t* const start_address,
function vm_address_t (line 302) | vm_address_t CalculateStackRegion(vm_address_t stack_pointer,
function MaybeCaptureMemoryAround (line 417) | void MaybeCaptureMemoryAround(IOSIntermediateDumpWriter* writer,
function CaptureMemoryPointedToByThreadState (line 443) | void CaptureMemoryPointedToByThreadState(IOSIntermediateDumpWriter* ...
function WriteCrashpadSimpleAnnotationsDictionary (line 473) | void WriteCrashpadSimpleAnnotationsDictionary(IOSIntermediateDumpWri...
function WriteAppleCrashReporterAnnotations (line 510) | void WriteAppleCrashReporterAnnotations(
FILE: client/ios_handler/in_process_intermediate_dump_handler.h
function namespace (line 29) | namespace crashpad {
FILE: client/ios_handler/in_process_intermediate_dump_handler_test.cc
type crashpad (line 39) | namespace crashpad {
type test (line 40) | namespace test {
class ReadToString (line 45) | class ReadToString : public crashpad::MemorySnapshot::Delegate {
method MemorySnapshotDelegateRead (line 49) | bool MemorySnapshotDelegateRead(void* data, size_t size) override {
class InProcessIntermediateDumpHandlerTest (line 55) | class InProcessIntermediateDumpHandlerTest : public testing::Test {
method SetUp (line 59) | void SetUp() override {
method TearDown (line 66) | void TearDown() override {
method WriteReportAndCloseWriter (line 72) | void WriteReportAndCloseWriter() {
method WriteMachException (line 86) | void WriteMachException() {
method writer (line 104) | auto writer() const { return writer_.get(); }
method HasMacOSBrokeDYLDTaskInfo (line 111) | bool HasMacOSBrokeDYLDTaskInfo() {
function TEST_F (line 132) | TEST_F(InProcessIntermediateDumpHandlerTest, TestSystem) {
function TEST_F (line 159) | TEST_F(InProcessIntermediateDumpHandlerTest, TestAnnotations) {
function TEST_F (line 255) | TEST_F(InProcessIntermediateDumpHandlerTest, TestExtraMemoryRanges) {
function TEST_F (line 307) | TEST_F(InProcessIntermediateDumpHandlerTest,
function TEST_F (line 357) | TEST_F(InProcessIntermediateDumpHandlerTest, TestThreads) {
function TEST_F (line 378) | TEST_F(InProcessIntermediateDumpHandlerTest, TestProcess) {
function TEST_F (line 385) | TEST_F(InProcessIntermediateDumpHandlerTest, TestMachException) {
function TEST_F (line 391) | TEST_F(InProcessIntermediateDumpHandlerTest, TestSignalException) {
function TEST_F (line 397) | TEST_F(InProcessIntermediateDumpHandlerTest, TestNSException) {
function TEST_F (line 405) | TEST_F(InProcessIntermediateDumpHandlerTest,
FILE: client/ios_handler/prune_intermediate_dumps_and_crash_reports_thread.cc
type crashpad (line 24) | namespace crashpad {
function UnlockOldIntermediateDumps (line 60) | void UnlockOldIntermediateDumps(base::FilePath pending_path,
FILE: client/ios_handler/prune_intermediate_dumps_and_crash_reports_thread.h
function namespace (line 24) | namespace crashpad {
FILE: client/length_delimited_ring_buffer.h
function namespace (line 30) | namespace crashpad {
function RingBufferData (line 318) | RingBufferData final {
function LengthDelimitedRingBufferReader (line 413) | LengthDelimitedRingBufferReader final {
function LengthDelimitedRingBufferWriter (line 493) | LengthDelimitedRingBufferWriter final {
FILE: client/length_delimited_ring_buffer_test.cc
type crashpad (line 26) | namespace crashpad {
type test (line 27) | namespace test {
function TEST (line 87) | TEST(LengthDelimitedRingBufferTest,
function TEST (line 95) | TEST(LengthDelimitedRingBufferTest,
function TEST (line 103) | TEST(LengthDelimitedRingBufferTest,
function TEST (line 112) | TEST(LengthDelimitedRingBufferTest, PopOnEmptyBufferShouldFail) {
function TEST (line 119) | TEST(LengthDelimitedRingBufferTest, PushZeroLengthShouldFail) {
function TEST (line 125) | TEST(LengthDelimitedRingBufferTest, PushExactlyBufferSizeThenPopShou...
function TEST (line 137) | TEST(LengthDelimitedRingBufferTest, PushLargerThanBufferSizeShouldFa...
function TEST (line 143) | TEST(LengthDelimitedRingBufferTest,
function TEST (line 169) | TEST(LengthDelimitedRingBufferTest,
function TEST (line 195) | TEST(LengthDelimitedRingBufferDataTest, PushOnFullBufferShouldOverwr...
function TEST (line 219) | TEST(LengthDelimitedRingBufferDataTest,
function TEST (line 243) | TEST(LengthDelimitedRingBufferDataTest, PushThenPopWithLengthVarintT...
function TEST (line 258) | TEST(LengthDelimitedRingBufferDataTest, DeserializeFromTooShortShoul...
function TEST (line 263) | TEST(LengthDelimitedRingBufferDataTest, DeserializeFromTooLongShould...
function TEST (line 272) | TEST(LengthDelimitedRingBufferDataTest,
function TEST (line 281) | TEST(LengthDelimitedRingBufferDataTest,
function TEST (line 293) | TEST(LengthDelimitedRingBufferDataTest,
function TEST (line 306) | TEST(LengthDelimitedRingBufferDataTest,
function TEST (line 319) | TEST(LengthDelimitedRingBufferDataTest,
function TEST (line 333) | TEST(LengthDelimitedRingBufferDataTest,
FILE: client/prune_crash_reports.cc
type crashpad (line 27) | namespace crashpad {
function PruneCrashReportDatabase (line 29) | size_t PruneCrashReportDatabase(CrashReportDatabase* database,
FILE: client/prune_crash_reports.h
function namespace (line 25) | namespace crashpad {
FILE: client/prune_crash_reports_test.cc
type crashpad (line 32) | namespace crashpad {
type test (line 33) | namespace test {
class MockDatabase (line 36) | class MockDatabase : public CrashReportDatabase {
method OperationStatus (line 76) | OperationStatus FinishedWritingCrashReport(std::unique_ptr<NewRepo...
function time_t (line 82) | time_t NDaysAgo(int num_days) {
function TEST (line 86) | TEST(PruneCrashReports, AgeCondition) {
function TEST (line 102) | TEST(PruneCrashReports, SizeCondition) {
class StaticCondition (line 150) | class StaticCondition final : public PruneCondition {
method StaticCondition (line 152) | explicit StaticCondition(bool value) : value_(value), did_execute_...
method StaticCondition (line 154) | StaticCondition(const StaticCondition&) = delete;
method StaticCondition (line 155) | StaticCondition& operator=(const StaticCondition&) = delete;
method ShouldPruneReport (line 159) | bool ShouldPruneReport(const CrashReportDatabase::Report& report) ...
method did_execute (line 164) | bool did_execute() const { return did_execute_; }
function TEST (line 171) | TEST(PruneCrashReports, BinaryCondition) {
function TEST (line 224) | TEST(PruneCrashReports, PruneOrder) {
FILE: client/pthread_create_linux.cc
type StartParams (line 27) | struct StartParams {
function pthread_create (line 46) | __attribute__((visibility("default"))) int pthread_create(
FILE: client/ring_buffer_annotation.h
function namespace (line 23) | namespace crashpad {
FILE: client/ring_buffer_annotation_load_test_main.cc
type crashpad (line 49) | namespace crashpad {
type test (line 51) | namespace test {
type RingBufferAnnotationSnapshotParams (line 59) | struct RingBufferAnnotationSnapshotParams final {
type Mode (line 60) | enum class Mode {
class RingBufferAnnotationSnapshot (line 77) | class RingBufferAnnotationSnapshot final {
type State (line 80) | struct State final {
method State (line 81) | State()
method State (line 90) | State(const State&) = delete;
method State (line 91) | State& operator=(const State&) = delete;
class Thread (line 101) | class Thread final : public crashpad::Thread {
method Thread (line 103) | Thread(std::function<void()> thread_main)
method ThreadMain (line 107) | void ThreadMain() override { thread_main_(); }
method RingBufferAnnotationSnapshot (line 113) | RingBufferAnnotationSnapshot(const RingBufferAnnotationSnapshotPar...
method RingBufferAnnotationSnapshot (line 122) | RingBufferAnnotationSnapshot(const RingBufferAnnotationSnapshot&) ...
method RingBufferAnnotationSnapshot (line 123) | RingBufferAnnotationSnapshot& operator=(const RingBufferAnnotation...
method Start (line 126) | void Start() {
method Stop (line 132) | void Stop() {
method MainLoopThreadMain (line 139) | void MainLoopThreadMain() {
method ProducerThreadMain (line 178) | void ProducerThreadMain() {
method Produce (line 224) | bool Produce(uint64_t value) {
method ConsumerThreadMain (line 237) | void ConsumerThreadMain() {
method Snapshot (line 278) | void Snapshot() {
function Usage (line 352) | void Usage(const base::FilePath& me) {
function TestMain (line 370) | int TestMain(int argc, char** argv) {
function main (line 466) | int main(int argc, char** argv) {
function wmain (line 472) | int wmain(int argc, wchar_t* argv[]) {
FILE: client/ring_buffer_annotation_test.cc
type crashpad (line 26) | namespace crashpad {
type test (line 27) | namespace test {
class RingBufferAnnotationTest (line 33) | class RingBufferAnnotationTest : public testing::Test {
method SetUp (line 35) | void SetUp() override {
method TearDown (line 39) | void TearDown() override {
method AnnotationsCount (line 43) | size_t AnnotationsCount() {
function TEST_F (line 56) | TEST_F(RingBufferAnnotationTest, Basics) {
function TEST_F (line 101) | TEST_F(RingBufferAnnotationTest, MultiplePushesWithoutWrapping) {
function TEST_F (line 140) | TEST_F(RingBufferAnnotationTest,
FILE: client/settings.cc
type crashpad (line 29) | namespace crashpad {
type internal (line 105) | namespace internal {
type SettingsReader::Data (line 119) | struct SettingsReader::Data {
type Options (line 127) | enum Options : uint32_t {
method Data (line 131) | Data() : magic(kSettingsMagic),
function FileHandle (line 345) | FileHandle Settings::GetHandleFromOptions(
FILE: client/settings.h
function namespace (line 31) | namespace crashpad {
FILE: client/settings_test.cc
type crashpad (line 23) | namespace crashpad {
type test (line 24) | namespace test {
class SettingsTest (line 27) | class SettingsTest : public testing::Test {
method SettingsTest (line 29) | SettingsTest()
method SettingsTest (line 34) | SettingsTest(const SettingsTest&) = delete;
method SettingsTest (line 35) | SettingsTest& operator=(const SettingsTest&) = delete;
method settings_path (line 37) | base::FilePath settings_path() { return settings_path_; }
method Settings (line 39) | Settings* settings() { return &settings_; }
method InitializeBadFile (line 41) | void InitializeBadFile() {
method SetUp (line 55) | void SetUp() override { ASSERT_TRUE(settings()->Initialize()); }
function TEST_F (line 63) | TEST_F(SettingsTest, ClientID) {
function TEST_F (line 75) | TEST_F(SettingsTest, UploadsEnabled) {
function TEST_F (line 100) | TEST_F(SettingsTest, LastUploadAttemptTime) {
function TEST_F (line 118) | TEST_F(SettingsTest, ReadOnly) {
function TEST_F (line 143) | TEST_F(SettingsTest, BadFileOnInitialize) {
function TEST_F (line 150) | TEST_F(SettingsTest, BadFileOnGet) {
function TEST_F (line 164) | TEST_F(SettingsTest, BadFileOnSet) {
function TEST_F (line 173) | TEST_F(SettingsTest, UnlinkFile) {
FILE: client/simple_address_range_bag.h
function namespace (line 29) | namespace crashpad {
function Insert (line 121) | bool Insert(CheckedRange<uint64_t> range) {
function Insert (line 144) | bool Insert(void* base, size_t size) {
function Remove (line 158) | bool Remove(CheckedRange<uint64_t> range) {
function Remove (line 180) | bool Remove(void* base, size_t size) {
FILE: client/simple_address_range_bag_test.cc
type crashpad (line 20) | namespace crashpad {
type test (line 21) | namespace test {
function TEST (line 24) | TEST(SimpleAddressRangeBag, Entry) {
function TEST (line 43) | TEST(SimpleAddressRangeBag, SimpleAddressRangeBag) {
function TEST (line 70) | TEST(SimpleAddressRangeBag, CopyAndAssign) {
function TEST (line 97) | TEST(SimpleAddressRangeBag, OutOfSpace) {
FILE: client/simple_string_dictionary.h
function namespace (line 28) | namespace crashpad {
function class (line 77) | class Iterator {
function GetCount (line 119) | size_t GetCount() const {
function SetKeyValue (line 162) | void SetKeyValue(std::string_view key, std::string_view value) {
function RemoveKey (line 222) | void RemoveKey(std::string_view key) {
function EntryKeyEquals (line 248) | static bool EntryKeyEquals(std::string_view key, const Entry& entry) {
function Entry (line 261) | const Entry* GetConstEntryForKey(std::string_view key) const {
FILE: client/simple_string_dictionary_test.cc
type crashpad (line 23) | namespace crashpad {
type test (line 24) | namespace test {
function TEST (line 27) | TEST(SimpleStringDictionary, Entry) {
function TEST (line 55) | TEST(SimpleStringDictionary, SimpleStringDictionary) {
function TEST (line 84) | TEST(SimpleStringDictionary, CopyAndAssign) {
function TEST (line 119) | TEST(SimpleStringDictionary, Iterator) {
function TEST (line 224) | TEST(SimpleStringDictionary, AddRemove) {
function TEST (line 250) | TEST(SimpleStringDictionary, OutOfSpace) {
function TEST (line 261) | TEST(SimpleStringDictionaryDeathTest, SetKeyValueWithNullKey) {
function TEST (line 267) | TEST(SimpleStringDictionaryDeathTest, GetValueForKeyWithNullKey) {
function TEST (line 277) | TEST(SimpleStringDictionaryDeathTest, GetValueForKeyWithoutNullKey) {
FILE: client/simulate_crash_mac.cc
type crashpad (line 33) | namespace crashpad {
function DeliverException (line 57) | bool DeliverException(thread_t thread,
function SimulateCrash (line 188) | void SimulateCrash(const NativeCPUContext& cpu_context) {
FILE: client/simulate_crash_mac.h
function namespace (line 24) | namespace crashpad {
FILE: client/simulate_crash_mac_test.cc
type crashpad (line 37) | namespace crashpad {
type test (line 38) | namespace test {
class TestSimulateCrashMac (line 41) | class TestSimulateCrashMac final : public MachMultiprocess,
type ExceptionPortsTarget (line 46) | enum ExceptionPortsTarget {
method TestSimulateCrashMac (line 72) | TestSimulateCrashMac(ExceptionPortsTarget target,
method TestSimulateCrashMac (line 83) | TestSimulateCrashMac(const TestSimulateCrashMac&) = delete;
method TestSimulateCrashMac (line 84) | TestSimulateCrashMac& operator=(const TestSimulateCrashMac&) = del...
method kern_return_t (line 89) | kern_return_t CatchMachException(exception_behavior_t behavior,
method MachMultiprocessParent (line 265) | void MachMultiprocessParent() override {
method MachMultiprocessChild (line 303) | void MachMultiprocessChild() override {
function TEST (line 333) | TEST(SimulateCrash, SimulateCrash) {
FILE: client/upload_behavior_ios.h
function UploadBehavior (line 21) | enum class UploadBehavior {
FILE: compat/android/dlfcn_internal.cc
type crashpad (line 30) | namespace crashpad {
type internal (line 31) | namespace internal {
class ScopedSigactionRestore (line 38) | class ScopedSigactionRestore {
method ScopedSigactionRestore (line 40) | ScopedSigactionRestore() : old_action_(), signo_(-1), valid_(false...
method Reset (line 44) | bool Reset() {
method ResetAndInstallHandler (line 57) | bool ResetAndInstallHandler(int signo,
method PrintErrmsg (line 75) | void PrintErrmsg(int err) {
type sigaction (line 92) | struct sigaction
function IsKitKat (line 97) | bool IsKitKat() {
class ScopedSetTID (line 112) | class ScopedSetTID {
method ScopedSetTID (line 114) | explicit ScopedSetTID(pid_t* tid) : tid_(tid) { *tid_ = syscall(SY...
function HandleSIGFPE (line 126) | void HandleSIGFPE(int signo, siginfo_t* siginfo, void* context) {
FILE: compat/android/dlfcn_internal.h
function namespace (line 18) | namespace crashpad {
FILE: compat/android/elf.h
type Elf32_Nhdr (line 45) | typedef struct {
type Elf64_Nhdr (line 51) | typedef struct {
FILE: compat/android/sys/epoll.cc
function epoll_create1 (line 28) | int epoll_create1(int flags) {
FILE: compat/android/sys/mman_mmap.cc
function T (line 39) | T Align(T value, size_t alignment) {
FILE: compat/linux/sys/mman_memfd_create.cc
function memfd_create (line 27) | int memfd_create(const char* name, unsigned int flags) __THROW {
FILE: compat/non_mac/mach/machine.h
type cpu_type_t (line 18) | typedef int cpu_type_t;
type cpu_subtype_t (line 19) | typedef int cpu_subtype_t;
FILE: compat/non_mac/mach/vm_prot.h
type vm_prot_t (line 18) | typedef int vm_prot_t;
FILE: compat/non_win/dbghelp.h
type RVA (line 43) | typedef uint32_t RVA;
type RVA64 (line 52) | typedef uint64_t RVA64;
type MINIDUMP_LOCATION_DESCRIPTOR (line 55) | struct __attribute__((packed, aligned(4))) MINIDUMP_LOCATION_DESCRIPTOR {
type MINIDUMP_LOCATION_DESCRIPTOR64 (line 65) | struct __attribute__((packed, aligned(4))) MINIDUMP_LOCATION_DESCRIPTOR64 {
type MINIDUMP_MEMORY_DESCRIPTOR (line 78) | struct __attribute__((packed, aligned(4))) MINIDUMP_MEMORY_DESCRIPTOR {
type MINIDUMP_HEADER (line 96) | struct __attribute__((packed, aligned(4))) MINIDUMP_HEADER {
type MINIDUMP_DIRECTORY (line 130) | struct __attribute__((packed, aligned(4))) MINIDUMP_DIRECTORY {
type MINIDUMP_STRING (line 145) | struct __attribute__((packed, aligned(4))) MINIDUMP_STRING {
type MINIDUMP_STREAM_TYPE (line 162) | enum MINIDUMP_STREAM_TYPE {
type MINIDUMP_SYSTEM_INFO (line 254) | struct __attribute__((packed, aligned(4))) MINIDUMP_SYSTEM_INFO {
type MINIDUMP_THREAD (line 371) | struct __attribute__((packed, aligned(4))) MINIDUMP_THREAD {
type MINIDUMP_THREAD_LIST (line 428) | struct __attribute__((packed, aligned(4))) MINIDUMP_THREAD_LIST {
type MINIDUMP_EXCEPTION (line 437) | struct __attribute__((packed, aligned(4))) MINIDUMP_EXCEPTION {
type MINIDUMP_EXCEPTION_STREAM (line 513) | struct __attribute__((packed, aligned(4))) MINIDUMP_EXCEPTION_STREAM {
type MINIDUMP_MODULE (line 541) | struct __attribute__((packed, aligned(4))) MINIDUMP_MODULE {
type MINIDUMP_MODULE_LIST (line 632) | struct __attribute__((packed, aligned(4))) MINIDUMP_MODULE_LIST {
type MINIDUMP_MEMORY_LIST (line 647) | struct __attribute__((packed, aligned(4))) MINIDUMP_MEMORY_LIST {
type MINIDUMP_HANDLE_DESCRIPTOR (line 660) | struct __attribute__((packed, aligned(4))) MINIDUMP_HANDLE_DESCRIPTOR {
function MINIDUMP_HANDLE_DESCRIPTOR (line 692) | struct __attribute__((packed, aligned(4))) MINIDUMP_HANDLE_DESCRIPTOR_2
type MINIDUMP_HANDLE_DATA_STREAM (line 707) | struct __attribute((packed, aligned(4))) MINIDUMP_HANDLE_DATA_STREAM {
type MINIDUMP_UNLOADED_MODULE (line 730) | struct __attribute__((packed, aligned(4))) MINIDUMP_UNLOADED_MODULE {
type MINIDUMP_UNLOADED_MODULE_LIST (line 763) | struct __attribute__((packed, aligned(4))) MINIDUMP_UNLOADED_MODULE_LIST {
type XSTATE_CONFIG_FEATURE_MSC_INFO (line 778) | struct __attribute__((packed, aligned(4))) XSTATE_CONFIG_FEATURE_MSC_INFO {
type MINIDUMP_MISC_INFO (line 870) | struct __attribute__((packed, aligned(4))) MINIDUMP_MISC_INFO {
function MINIDUMP_MISC_INFO (line 911) | struct __attribute__((packed, aligned(4))) MINIDUMP_MISC_INFO_2
function MINIDUMP_MISC_INFO_2 (line 943) | struct __attribute__((packed, aligned(4))) MINIDUMP_MISC_INFO_3
function MINIDUMP_MISC_INFO_3 (line 1005) | struct __attribute__((packed, aligned(4))) MINIDUMP_MISC_INFO_4
function MINIDUMP_MISC_INFO_4 (line 1037) | struct __attribute__((packed, aligned(4))) MINIDUMP_MISC_INFO_5
type MINIDUMP_MISC_INFO_5 (line 1050) | typedef MINIDUMP_MISC_INFO_5 MINIDUMP_MISC_INFO_N;
type MINIDUMP_MEMORY_INFO (line 1053) | struct __attribute__((packed, aligned(4))) MINIDUMP_MEMORY_INFO {
type MINIDUMP_MEMORY_INFO_LIST (line 1091) | struct __attribute__((packed, aligned(4))) MINIDUMP_MEMORY_INFO_LIST {
type MINIDUMP_THREAD_NAME (line 1106) | struct __attribute__((packed, aligned(4))) MINIDUMP_THREAD_NAME {
type MINIDUMP_THREAD_NAME_LIST (line 1116) | struct __attribute__((packed, aligned(4))) MINIDUMP_THREAD_NAME_LIST {
type MINIDUMP_TYPE (line 1128) | enum MINIDUMP_TYPE {
FILE: compat/non_win/minwinbase.h
type SYSTEMTIME (line 21) | struct SYSTEMTIME {
FILE: compat/non_win/timezoneapi.h
type TIME_ZONE_INFORMATION (line 23) | struct TIME_ZONE_INFORMATION {
FILE: compat/non_win/verrsrc.h
type VS_FIXEDFILEINFO (line 109) | struct VS_FIXEDFILEINFO {
FILE: compat/non_win/winnt.h
type XSTATE_FEATURE (line 170) | struct XSTATE_FEATURE {
type IMAGE_DEBUG_MISC (line 204) | struct IMAGE_DEBUG_MISC {
FILE: compat/win/strings.cc
function strcasecmp (line 21) | int strcasecmp(const char* s1, const char* s2) {
FILE: compat/win/time.cc
type tm (line 19) | struct tm
type tm (line 19) | struct tm
type tm (line 25) | struct tm
type tm (line 25) | struct tm
type tm (line 31) | struct tm
function time_t (line 36) | time_t timegm(struct tm* tm) {
FILE: compat/win/time.h
type tm (line 25) | struct tm
type tm (line 25) | struct tm
type tm (line 27) | struct tm
type tm (line 27) | struct tm
type tm (line 29) | struct tm
type tm (line 31) | struct tm
FILE: compat/win/winnt.h
type PROCESSOR_POWER_INFORMATION (line 23) | struct PROCESSOR_POWER_INFORMATION {
FILE: compat/win/winternl.h
type CLIENT_ID (line 23) | typedef struct _CLIENT_ID CLIENT_ID;
FILE: doc/appengine/src/crashpad-home/main.go
function main (line 33) | func main() {
function init (line 37) | func init() {
function handler (line 41) | func handler(w http.ResponseWriter, r *http.Request) {
function contentType (line 147) | func contentType(file string) string {
FILE: doc/support/generate_doxygen.py
function main (line 25) | def main(args):
FILE: handler/crash_report_upload_rate_limit.cc
type crashpad (line 23) | namespace crashpad {
function ShouldRateLimitResult (line 25) | ShouldRateLimitResult ShouldRateLimit(time_t now,
FILE: handler/crash_report_upload_rate_limit.h
function namespace (line 24) | namespace crashpad {
FILE: handler/crash_report_upload_rate_limit_test.cc
type crashpad::test (line 24) | namespace crashpad::test {
function TEST (line 32) | TEST(CrashReportUploadRateLimitTest, ShouldRateLimit_OnePerHour) {
FILE: handler/crash_report_upload_thread.cc
type crashpad (line 52) | namespace crashpad {
class ScopedFunctionInvoker (line 71) | class ScopedFunctionInvoker final {
method ScopedFunctionInvoker (line 73) | ScopedFunctionInvoker(const std::function<void()>& function)
method ScopedFunctionInvoker (line 75) | ScopedFunctionInvoker(const ScopedFunctionInvoker&) = delete;
method ScopedFunctionInvoker (line 76) | ScopedFunctionInvoker& operator=(const ScopedFunctionInvoker&) = del...
FILE: handler/crash_report_upload_thread.h
function namespace (line 30) | namespace crashpad {
FILE: handler/crashpad_handler_main.cc
type crashpad (line 17) | namespace crashpad {
function CrashpadHandlerMain (line 21) | __attribute__((visibility("default"), used)) int CrashpadHandlerMain(
FILE: handler/crashpad_handler_test.cc
type crashpad (line 33) | namespace crashpad {
type test (line 34) | namespace test {
function StartAndCrashWithExtendedHandler (line 39) | void StartAndCrashWithExtendedHandler(const base::FilePath& temp_dir) {
class CrashWithExtendedHandler (line 63) | class CrashWithExtendedHandler final : public WinMultiprocessWithTem...
method CrashWithExtendedHandler (line 65) | CrashWithExtendedHandler() : WinMultiprocessWithTempDir() {}
method WinMultiprocessParent (line 71) | void WinMultiprocessParent() override {
method WinMultiprocessChild (line 75) | void WinMultiprocessChild() override {
method WinMultiprocessParentAfterChild (line 79) | void WinMultiprocessParentAfterChild(HANDLE child) override {
function TEST (line 142) | TEST(CrashpadHandler, MAYBE_ExtensibilityCalloutsWork) {
FILE: handler/crashpad_handler_test_extended_handler.cc
class TestUserStreamDataSource (line 28) | class TestUserStreamDataSource : public crashpad::UserStreamDataSource {
method TestUserStreamDataSource (line 30) | TestUserStreamDataSource() {}
method TestUserStreamDataSource (line 32) | TestUserStreamDataSource(const TestUserStreamDataSource&) = delete;
method TestUserStreamDataSource (line 33) | TestUserStreamDataSource& operator=(const TestUserStreamDataSource&) =...
function ExtendedHandlerMain (line 48) | int ExtendedHandlerMain(int argc, char* argv[]) {
function main (line 60) | int main(int argc, char* argv[]) {
function wmain (line 66) | int wmain(int argc, wchar_t* argv[]) {
FILE: handler/handler_main.cc
type crashpad (line 91) | namespace crashpad {
function Usage (line 101) | void Usage(const base::FilePath& me) {
type Options (line 221) | struct Options {
function AddKeyValueToMap (line 265) | bool AddKeyValueToMap(std::map<std::string, std::string>* map,
function MetricsRecordExit (line 288) | void MetricsRecordExit(Metrics::LifetimeMilestone milestone) {
function ExitFailure (line 303) | int ExitFailure() {
class CallMetricsRecordNormalExit (line 308) | class CallMetricsRecordNormalExit {
method CallMetricsRecordNormalExit (line 310) | CallMetricsRecordNormalExit() {}
method CallMetricsRecordNormalExit (line 312) | CallMetricsRecordNormalExit(const CallMetricsRecordNormalExit&) = de...
method CallMetricsRecordNormalExit (line 313) | CallMetricsRecordNormalExit& operator=(const CallMetricsRecordNormal...
function HandleCrashSignal (line 324) | void HandleCrashSignal(int sig, siginfo_t* siginfo, void* context) {
function HandleTerminateSignal (line 361) | void HandleTerminateSignal(int sig, siginfo_t* siginfo, void* context) {
function ReinstallCrashHandler (line 366) | void ReinstallCrashHandler() {
function InstallCrashHandler (line 375) | void InstallCrashHandler() {
type ResetSIGTERMTraits (line 384) | struct ResetSIGTERMTraits {
type sigaction (line 385) | struct sigaction
method Free (line 389) | static void Free(struct sigaction* sa) {
type sigaction (line 395) | struct sigaction
function HandleSIGTERM (line 400) | void HandleSIGTERM(int sig, siginfo_t* siginfo, void* context) {
function LONG (line 414) | LONG WINAPI UnhandledExceptionHandler(EXCEPTION_POINTERS* exception_po...
function BOOL (line 425) | BOOL WINAPI ConsoleHandler(DWORD console_event) {
class TerminateHandler (line 431) | class TerminateHandler final : public SessionEndWatcher {
method TerminateHandler (line 433) | TerminateHandler() : SessionEndWatcher() {}
method TerminateHandler (line 435) | TerminateHandler(const TerminateHandler&) = delete;
method TerminateHandler (line 436) | TerminateHandler& operator=(const TerminateHandler&) = delete;
method SessionEnding (line 442) | void SessionEnding() override {
function ReinstallCrashHandler (line 447) | void ReinstallCrashHandler() {
function InstallCrashHandler (line 456) | void InstallCrashHandler() {
function MonitorSelf (line 469) | void MonitorSelf(const Options& options) {
class ScopedStoppable (line 530) | class ScopedStoppable {
method ScopedStoppable (line 532) | ScopedStoppable() = default;
method ScopedStoppable (line 534) | ScopedStoppable(const ScopedStoppable&) = delete;
method ScopedStoppable (line 535) | ScopedStoppable& operator=(const ScopedStoppable&) = delete;
method Reset (line 543) | void Reset(Stoppable* stoppable) { stoppable_.reset(stoppable); }
method Stoppable (line 545) | Stoppable* Get() { return stoppable_.get(); }
function InitCrashpadLogging (line 551) | void InitCrashpadLogging() {
function HandlerMain (line 567) | int HandlerMain(int argc,
FILE: handler/handler_main.h
function namespace (line 21) | namespace crashpad {
FILE: handler/linux/capture_snapshot.cc
type crashpad (line 24) | namespace crashpad {
function CaptureSnapshot (line 26) | bool CaptureSnapshot(
FILE: handler/linux/capture_snapshot.h
function namespace (line 30) | namespace crashpad {
FILE: handler/linux/crash_report_exception_handler.cc
type crashpad (line 43) | namespace crashpad {
class Logger (line 46) | class Logger final : public LogOutputStream::Delegate {
method Logger (line 48) | Logger() = default;
method Logger (line 50) | Logger(const Logger&) = delete;
method Logger (line 51) | Logger& operator=(const Logger&) = delete;
method Log (line 56) | bool Log(const char* buf) override {
method OutputCap (line 61) | size_t OutputCap() override {
method LineWidth (line 67) | size_t LineWidth() override {
method Log (line 75) | bool Log(const char* buf) override { return false; }
method OutputCap (line 76) | size_t OutputCap() override { return 0; }
method LineWidth (line 77) | size_t LineWidth() override { return 0; }
function WriteMinidumpLogFromFile (line 81) | bool WriteMinidumpLogFromFile(FileReaderInterface* file_reader) {
FILE: handler/linux/crash_report_exception_handler.h
function namespace (line 30) | namespace crashpad {
FILE: handler/linux/cros_crash_report_exception_handler.cc
type crashpad (line 38) | namespace crashpad {
function GetProcessNameFromPid (line 43) | const std::string GetProcessNameFromPid(pid_t pid) {
function WriteAnnotationsAndMinidump (line 62) | bool WriteAnnotationsAndMinidump(
FILE: handler/linux/cros_crash_report_exception_handler.h
function namespace (line 31) | namespace crashpad {
FILE: handler/linux/exception_handler_server.cc
type crashpad (line 40) | namespace crashpad {
function LogSocketError (line 45) | void LogSocketError(int sock) {
type PtraceScope (line 56) | enum class PtraceScope {
function PtraceScope (line 64) | PtraceScope GetPtraceScope() {
function HaveCapSysPtrace (line 96) | bool HaveCapSysPtrace() {
function SendMessageToClient (line 113) | bool SendMessageToClient(
function tgkill (line 125) | int tgkill(pid_t pid, pid_t tid, int signo) {
function SendSIGCONT (line 129) | void SendSIGCONT(pid_t pid, pid_t tid) {
function SendCredentials (line 148) | bool SendCredentials(int client_sock) {
class PtraceStrategyDeciderImpl (line 156) | class PtraceStrategyDeciderImpl : public PtraceStrategyDecider {
method PtraceStrategyDeciderImpl (line 158) | PtraceStrategyDeciderImpl() : PtraceStrategyDecider() {}
method Strategy (line 161) | Strategy ChooseStrategy(int sock,
method Strategy (line 217) | static Strategy TryForkingBroker(int client_sock) {
FILE: handler/linux/exception_handler_server.h
function class (line 35) | class PtraceStrategyDecider {
FILE: handler/linux/exception_handler_server_test.cc
type crashpad (line 37) | namespace crashpad {
type test (line 38) | namespace test {
class RunServerThread (line 42) | class RunServerThread : public Thread {
method RunServerThread (line 44) | RunServerThread(ExceptionHandlerServer* server,
method RunServerThread (line 48) | RunServerThread(const RunServerThread&) = delete;
method RunServerThread (line 49) | RunServerThread& operator=(const RunServerThread&) = delete;
method JoinWithTimeout (line 53) | bool JoinWithTimeout(double timeout) {
method ThreadMain (line 63) | void ThreadMain() override {
class ScopedStopServerAndJoinThread (line 73) | class ScopedStopServerAndJoinThread {
method ScopedStopServerAndJoinThread (line 75) | ScopedStopServerAndJoinThread(ExceptionHandlerServer* server,
method ScopedStopServerAndJoinThread (line 79) | ScopedStopServerAndJoinThread(const ScopedStopServerAndJoinThread&...
method ScopedStopServerAndJoinThread (line 80) | ScopedStopServerAndJoinThread& operator=(
class TestDelegate (line 93) | class TestDelegate : public ExceptionHandlerServer::Delegate {
method TestDelegate (line 95) | TestDelegate()
method TestDelegate (line 98) | TestDelegate(const TestDelegate&) = delete;
method TestDelegate (line 99) | TestDelegate& operator=(const TestDelegate&) = delete;
method WaitForException (line 103) | bool WaitForException(double timeout_seconds,
method HandleException (line 115) | bool HandleException(pid_t client_process_id,
method HandleExceptionWithBroker (line 148) | bool HandleExceptionWithBroker(
class MockPtraceStrategyDecider (line 170) | class MockPtraceStrategyDecider : public PtraceStrategyDecider {
method MockPtraceStrategyDecider (line 172) | MockPtraceStrategyDecider(PtraceStrategyDecider::Strategy strategy)
method MockPtraceStrategyDecider (line 175) | MockPtraceStrategyDecider(const MockPtraceStrategyDecider&) = delete;
method MockPtraceStrategyDecider (line 176) | MockPtraceStrategyDecider& operator=(const MockPtraceStrategyDecid...
method Strategy (line 181) | Strategy ChooseStrategy(int sock,
class ExceptionHandlerServerTest (line 211) | class ExceptionHandlerServerTest : public testing::TestWithParam<boo...
method ExceptionHandlerServerTest (line 213) | ExceptionHandlerServerTest()
method ExceptionHandlerServerTest (line 220) | ExceptionHandlerServerTest(const ExceptionHandlerServerTest&) = de...
method ExceptionHandlerServerTest (line 221) | ExceptionHandlerServerTest& operator=(const ExceptionHandlerServer...
method SockToHandler (line 226) | int SockToHandler() { return sock_to_handler_.get(); }
method TestDelegate (line 228) | TestDelegate* Delegate() { return &delegate_; }
method Hangup (line 230) | void Hangup() { sock_to_handler_.reset(); }
method RunServerThread (line 232) | RunServerThread* ServerThread() { return &server_thread_; }
method ExceptionHandlerServer (line 234) | ExceptionHandlerServer* Server() { return &server_; }
class CrashDumpTest (line 236) | class CrashDumpTest : public Multiprocess {
method CrashDumpTest (line 238) | CrashDumpTest(ExceptionHandlerServerTest* server_test, bool succ...
method CrashDumpTest (line 241) | CrashDumpTest(const CrashDumpTest&) = delete;
method CrashDumpTest (line 242) | CrashDumpTest& operator=(const CrashDumpTest&) = delete;
method MultiprocessParent (line 246) | void MultiprocessParent() override {
method MultiprocessChild (line 266) | void MultiprocessChild() override {
method ExpectCrashDumpUsingStrategy (line 288) | void ExpectCrashDumpUsingStrategy(PtraceStrategyDecider::Strategy ...
method UsingMultiClientSocket (line 300) | bool UsingMultiClientSocket() const { return use_multi_client_sock...
method SetUp (line 303) | void SetUp() override {
function TEST_P (line 322) | TEST_P(ExceptionHandlerServerTest, ShutdownWithNoClients) {
function TEST_P (line 328) | TEST_P(ExceptionHandlerServerTest, StopWithClients) {
function TEST_P (line 334) | TEST_P(ExceptionHandlerServerTest, StopBeforeRun) {
function TEST_P (line 340) | TEST_P(ExceptionHandlerServerTest, MultipleStops) {
function TEST_P (line 347) | TEST_P(ExceptionHandlerServerTest, RequestCrashDumpDefault) {
function TEST_P (line 355) | TEST_P(ExceptionHandlerServerTest, RequestCrashDumpNoPtrace) {
function TEST_P (line 360) | TEST_P(ExceptionHandlerServerTest, RequestCrashDumpForkBroker) {
function TEST_P (line 370) | TEST_P(ExceptionHandlerServerTest, RequestCrashDumpDirectPtrace) {
function TEST_P (line 375) | TEST_P(ExceptionHandlerServerTest, RequestCrashDumpError) {
FILE: handler/linux/handler_trampoline.cc
function main (line 24) | int main(int argc, char* argv[]) {
FILE: handler/mac/crash_report_exception_handler.cc
type crashpad (line 48) | namespace crashpad {
function kern_return_t (line 65) | kern_return_t CrashReportExceptionHandler::CatchMachException(
FILE: handler/mac/crash_report_exception_handler.h
function namespace (line 30) | namespace crashpad {
FILE: handler/mac/exception_handler_server.cc
type crashpad (line 28) | namespace crashpad {
class ExceptionHandlerServerRun (line 32) | class ExceptionHandlerServerRun : public UniversalMachExcServer::Inter...
method ExceptionHandlerServerRun (line 35) | ExceptionHandlerServerRun(
method ExceptionHandlerServerRun (line 54) | ExceptionHandlerServerRun(const ExceptionHandlerServerRun&) = delete;
method ExceptionHandlerServerRun (line 55) | ExceptionHandlerServerRun& operator=(const ExceptionHandlerServerRun...
method Run (line 61) | void Run() {
method kern_return_t (line 126) | kern_return_t CatchMachException(exception_behavior_t behavior,
method kern_return_t (line 163) | kern_return_t DoMachNotifyNoSenders(
FILE: handler/mac/exception_handler_server.h
function namespace (line 23) | namespace crashpad {
FILE: handler/mac/file_limit_annotation.cc
type crashpad (line 33) | namespace crashpad {
function FormatFromSysctl (line 42) | std::string FormatFromSysctl(int rv, const int* value, const size_t* s...
function CountOpenFileDescriptors (line 57) | std::string CountOpenFileDescriptors() {
function StringForRLim (line 84) | std::string StringForRLim(rlim_t limit) {
function RecordFileLimitAnnotation (line 94) | void RecordFileLimitAnnotation() {
FILE: handler/mac/file_limit_annotation.h
function namespace (line 18) | namespace crashpad {
FILE: handler/main.cc
function main (line 27) | int main(int argc, char* argv[]) {
function HandlerMainAdaptor (line 35) | int HandlerMainAdaptor(int argc, char* argv[]) {
function wWinMain (line 44) | int APIENTRY wWinMain(HINSTANCE, HINSTANCE, wchar_t*, int) {
function wmain (line 50) | int wmain(int argc, wchar_t* argv[]) {
FILE: handler/minidump_to_upload_parameters.cc
type crashpad (line 23) | namespace crashpad {
function InsertOrReplaceMapEntry (line 27) | void InsertOrReplaceMapEntry(std::map<std::string, std::string>* map,
function BreakpadHTTPFormParametersFromMinidump (line 39) | std::map<std::string, std::string> BreakpadHTTPFormParametersFromMinid...
FILE: handler/minidump_to_upload_parameters.h
function namespace (line 21) | namespace crashpad {
FILE: handler/minidump_to_upload_parameters_test.cc
type crashpad (line 22) | namespace crashpad {
type test (line 23) | namespace test {
function TEST (line 26) | TEST(MinidumpToUploadParameters, PrecedenceRules) {
FILE: handler/prune_crash_reports_thread.cc
type crashpad (line 21) | namespace crashpad {
FILE: handler/prune_crash_reports_thread.h
function namespace (line 23) | namespace crashpad {
FILE: handler/user_stream_data_source.cc
type crashpad (line 22) | namespace crashpad {
function AddUserExtensionStreams (line 24) | void AddUserExtensionStreams(
FILE: handler/user_stream_data_source.h
function namespace (line 21) | namespace crashpad {
FILE: handler/win/crash_other_program.cc
type crashpad (line 31) | namespace crashpad {
type test (line 32) | namespace test {
function CrashAndDumpTarget (line 37) | bool CrashAndDumpTarget(HANDLE process) {
function CrashOtherProgram (line 78) | int CrashOtherProgram(int argc, wchar_t* argv[]) {
function wmain (line 139) | int wmain(int argc, wchar_t* argv[]) {
FILE: handler/win/crash_report_exception_handler.cc
type crashpad (line 34) | namespace crashpad {
FILE: handler/win/crash_report_exception_handler.h
function namespace (line 26) | namespace crashpad {
FILE: handler/win/crashy_signal.cc
type crashpad (line 23) | namespace crashpad {
type WhereToSignalFrom (line 26) | enum WhereToSignalFrom {
function WhereToSignalFrom (line 32) | WhereToSignalFrom MainOrBackground(wchar_t* name) {
function DWORD (line 40) | DWORD WINAPI BackgroundThread(void* arg) {
function CrashySignalMain (line 44) | int CrashySignalMain(int argc, wchar_t* argv[]) {
function wmain (line 87) | int wmain(int argc, wchar_t* argv[]) {
FILE: handler/win/crashy_test_program.cc
type crashpad (line 42) | namespace crashpad {
function ULONG (line 56) | ULONG RtlNtStatusToDosError(NTSTATUS status) {
function AllocateMemoryOfVariousProtections (line 62) | void AllocateMemoryOfVariousProtections() {
function DWORD (line 101) | DWORD WINAPI NullThreadProc(void* param) {
function CreateThreadWithRegisterPointingToTestMemory (line 107) | bool CreateThreadWithRegisterPointingToTestMemory() {
function SomeCrashyFunction (line 136) | __declspec(noinline) void SomeCrashyFunction() {
function AllocateExtraMemoryToBeSaved (line 147) | void AllocateExtraMemoryToBeSaved(
function AllocateExtraUnsavedMemory (line 160) | void AllocateExtraUnsavedMemory(crashpad::SimpleAddressRangeBag* extra...
function CrashyMain (line 178) | int CrashyMain(int argc, wchar_t* argv[]) {
function wmain (line 264) | int wmain(int argc, wchar_t* argv[]) {
FILE: handler/win/crashy_test_z7_loader.cc
type crashpad (line 28) | namespace crashpad {
function CrashyLoadZ7Main (line 31) | int CrashyLoadZ7Main(int argc, wchar_t* argv[]) {
function wmain (line 66) | int wmain(int argc, wchar_t* argv[]) {
FILE: handler/win/fake_handler_that_crashes_at_startup.cc
function wmain (line 17) | int wmain() {
FILE: handler/win/fastfail_test_program.cc
type crashpad (line 30) | namespace crashpad {
function CallRffeManyTimes (line 35) | int CallRffeManyTimes() {
function IndirectCall (line 44) | void IndirectCall(FuncType* func) {
function CfgCrash (line 49) | void CfgCrash() {
function FastFailCrash (line 64) | void FastFailCrash() {
function CrashyMain (line 68) | int CrashyMain(int argc, wchar_t* argv[]) {
function wmain (line 150) | int wmain(int argc, wchar_t* argv[]) {
FILE: handler/win/hanging_program.cc
function DWORD (line 31) | [[noreturn]] DWORD WINAPI Thread1(LPVOID context) {
function DWORD (line 46) | [[noreturn]] DWORD WINAPI Thread2(LPVOID dummy) {
function DWORD (line 51) | [[noreturn]] DWORD WINAPI Thread3(LPVOID context) {
function wmain (line 69) | int wmain(int argc, wchar_t* argv[]) {
FILE: handler/win/heap_corrupting_program.cc
type crashpad (line 28) | namespace crashpad {
function HeapCorruptionCrash (line 31) | void HeapCorruptionCrash() {
function CrashyMain (line 53) | int CrashyMain(int argc, wchar_t* argv[]) {
function wmain (line 95) | int wmain(int argc, wchar_t* argv[]) {
FILE: handler/win/loader_lock_dll.cc
function LogFatal (line 25) | __declspec(noreturn) void LogFatal(const char* file,
function BOOL (line 83) | BOOL WINAPI DllMain(HINSTANCE, DWORD reason, LPVOID) {
FILE: handler/win/self_destroying_test_program.cc
type crashpad (line 24) | namespace crashpad {
function FreeOwnStackAndBreak (line 37) | __declspec(noinline) bool FreeOwnStackAndBreak() {
function SelfDestroyingMain (line 72) | __declspec(noinline) int SelfDestroyingMain(int argc, wchar_t* argv[]) {
function wmain (line 99) | int wmain(int argc, wchar_t* argv[]) {
FILE: handler/win/wer/crashpad_wer.cc
type crashpad::wer (line 27) | namespace crashpad::wer {
type WER_RUNTIME_EXCEPTION_INFORMATION_19041 (line 32) | struct WER_RUNTIME_EXCEPTION_INFORMATION_19041 {
class ScopedHandle (line 44) | class ScopedHandle {
method ScopedHandle (line 46) | ScopedHandle() : handle_(INVALID_HANDLE_VALUE) {}
method ScopedHandle (line 47) | ScopedHandle(HANDLE from) : handle_(from) {}
method IsValid (line 52) | bool IsValid() {
method HANDLE (line 57) | HANDLE Get() { return handle_; }
function ScopedHandle (line 63) | ScopedHandle DuplicateFromTarget(HANDLE target_process, HANDLE target_...
method ScopedHandle (line 46) | ScopedHandle() : handle_(INVALID_HANDLE_VALUE) {}
method ScopedHandle (line 47) | ScopedHandle(HANDLE from) : handle_(from) {}
method IsValid (line 52) | bool IsValid() {
method HANDLE (line 57) | HANDLE Get() { return handle_; }
function ProcessException (line 77) | bool ProcessException(const DWORD* handled_exceptions,
function ExceptionEvent (line 197) | bool ExceptionEvent(
FILE: handler/win/wer/crashpad_wer.h
function namespace (line 21) | namespace crashpad::wer {
FILE: handler/win/wer/crashpad_wer_main.cc
function BOOL (line 25) | BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved) {
function HRESULT (line 32) | HRESULT OutOfProcessExceptionEventCallback(
function HRESULT (line 61) | HRESULT OutOfProcessExceptionEventSignatureCallback(
function HRESULT (line 75) | HRESULT OutOfProcessExceptionEventDebuggerLaunchCallback(
FILE: handler/win/wer/crashpad_wer_module_unittest.cc
type crashpad (line 25) | namespace crashpad {
type test (line 26) | namespace test {
function ModulePath (line 28) | base::FilePath ModulePath() {
function TEST (line 35) | TEST(CrashpadWerModule, Basic) {
FILE: handler/win/z7_test.cpp
function CrashMe (line 24) | __declspec(dllexport) void CrashMe() {
function BOOL (line 29) | BOOL WINAPI DllMain(HINSTANCE hinstance, DWORD reason, LPVOID) {
FILE: infra/config/PRESUBMIT.py
function CheckChangedLUCIConfigs (line 20) | def CheckChangedLUCIConfigs(input_api, output_api):
function CheckLucicfgGenOutputMain (line 25) | def CheckLucicfgGenOutputMain(input_api, output_api):
FILE: minidump/minidump_annotation_writer.cc
type crashpad (line 24) | namespace crashpad {
FILE: minidump/minidump_annotation_writer.h
function namespace (line 27) | namespace crashpad {
FILE: minidump/minidump_annotation_writer_test.cc
type crashpad (line 27) | namespace crashpad {
type test (line 28) | namespace test {
function MinidumpAnnotationList (line 31) | const MinidumpAnnotationList* MinidumpAnnotationListAtStart(
function TEST (line 42) | TEST(MinidumpAnnotationWriter, EmptyList) {
function TEST (line 58) | TEST(MinidumpAnnotationWriter, OneItem) {
function TEST (line 95) | TEST(MinidumpAnnotationWriter, ThreeItems) {
function TEST (line 142) | TEST(MinidumpAnnotationWriter, DuplicateNames) {
FILE: minidump/minidump_byte_array_writer.cc
type crashpad (line 22) | namespace crashpad {
FILE: minidump/minidump_byte_array_writer.h
function namespace (line 24) | namespace crashpad {
FILE: minidump/minidump_byte_array_writer_test.cc
type crashpad (line 26) | namespace crashpad {
type test (line 27) | namespace test {
function TEST (line 30) | TEST(MinidumpByteArrayWriter, Write) {
function TEST (line 63) | TEST(MinidumpByteArrayWriter, SetData) {
FILE: minidump/minidump_context.h
function namespace (line 24) | namespace crashpad {
FILE: minidump/minidump_context_writer.cc
type crashpad (line 30) | namespace crashpad {
FILE: minidump/minidump_context_writer.h
type CPUContext (line 27) | struct CPUContext
type CPUContextX86 (line 28) | struct CPUContextX86
type CPUContextX86_64 (line 29) | struct CPUContextX86_64
function class (line 34) | class MinidumpContextWriter : public internal::MinidumpWritable {
function class (line 116) | class MinidumpXSaveFeatureAMD64 {
FILE: minidump/minidump_context_writer_test.cc
type crashpad (line 31) | namespace crashpad {
type test (line 32) | namespace test {
function EmptyContextTest (line 36) | void EmptyContextTest(void (*expect_context)(uint32_t, const Context...
class TestTypeNames (line 49) | class TestTypeNames {
method GetName (line 52) | static std::string GetName(int) {
class MinidumpContextWriter (line 59) | class MinidumpContextWriter : public ::testing::Test {}
function TYPED_TEST (line 64) | TYPED_TEST(MinidumpContextWriter, MinidumpContextX86Writer) {
function TYPED_TEST (line 97) | TYPED_TEST(MinidumpContextWriter, MinidumpContextAMD64Writer) {
function TYPED_TEST (line 140) | TYPED_TEST(MinidumpContextWriter, MinidumpContextRISCV64Writer) {
function FromSnapshotTest (line 184) | void FromSnapshotTest(const CPUContext& snapshot_context,
function TYPED_TEST (line 201) | TYPED_TEST(MinidumpContextWriter, X86_FromSnapshot) {
function TYPED_TEST (line 211) | TYPED_TEST(MinidumpContextWriter, AMD64_FromSnapshot) {
function TYPED_TEST (line 221) | TYPED_TEST(MinidumpContextWriter, AMD64_CetFromSnapshot) {
function TYPED_TEST (line 246) | TYPED_TEST(MinidumpContextWriter, ARM_Zeros) {
function TYPED_TEST (line 251) | TYPED_TEST(MinidumpContextWriter, ARM64_Zeros) {
function TYPED_TEST (line 256) | TYPED_TEST(MinidumpContextWriter, ARM_FromSnapshot) {
function TYPED_TEST (line 266) | TYPED_TEST(MinidumpContextWriter, ARM64_FromSnapshot) {
function TYPED_TEST (line 276) | TYPED_TEST(MinidumpContextWriter, MIPS_Zeros) {
function TYPED_TEST (line 281) | TYPED_TEST(MinidumpContextWriter, MIPS64_Zeros) {
function TYPED_TEST (line 287) | TYPED_TEST(MinidumpContextWriter, MIPS_FromSnapshot) {
function TYPED_TEST (line 297) | TYPED_TEST(MinidumpContextWriter, MIPS64_FromSnapshot) {
function TYPED_TEST (line 308) | TYPED_TEST(MinidumpContextWriter, RISCV64_Zeros) {
function TYPED_TEST (line 314) | TYPED_TEST(MinidumpContextWriter, RISCV64_FromSnapshot) {
FILE: minidump/minidump_crashpad_info_writer.cc
type crashpad (line 26) | namespace crashpad {
function MinidumpStreamType (line 148) | MinidumpStreamType MinidumpCrashpadInfoWriter::StreamType() const {
FILE: minidump/minidump_crashpad_info_writer.h
function namespace (line 27) | namespace crashpad {
FILE: minidump/minidump_crashpad_info_writer_test.cc
type crashpad (line 36) | namespace crashpad {
type test (line 37) | namespace test {
function GetCrashpadInfoStream (line 40) | void GetCrashpadInfoStream(
function TEST (line 66) | TEST(MinidumpCrashpadInfoWriter, Empty) {
function TEST (line 90) | TEST(MinidumpCrashpadInfoWriter, ReportAndClientID) {
function TEST (line 125) | TEST(MinidumpCrashpadInfoWriter, AddressMask) {
function TEST (line 168) | TEST(MinidumpCrashpadInfoWriter, EmptyAddressMask) {
function TEST (line 196) | TEST(MinidumpCrashpadInfoWriter, SimpleAnnotations) {
function TEST (line 243) | TEST(MinidumpCrashpadInfoWriter, CrashpadModuleList) {
function TEST (line 290) | TEST(MinidumpCrashpadInfoWriter, InitializeFromSnapshot) {
FILE: minidump/minidump_exception_writer.cc
type crashpad (line 26) | namespace crashpad {
function MinidumpStreamType (line 124) | MinidumpStreamType MinidumpExceptionWriter::StreamType() const {
FILE: minidump/minidump_exception_writer.h
function namespace (line 29) | namespace crashpad {
FILE: minidump/minidump_exception_writer_test.cc
type crashpad (line 34) | namespace crashpad {
type test (line 35) | namespace test {
function GetExceptionStream (line 39) | void GetExceptionStream(const std::string& file_contents,
function ExpectExceptionStream (line 66) | void ExpectExceptionStream(const MINIDUMP_EXCEPTION_STREAM* expected,
function TEST (line 99) | TEST(MinidumpExceptionWriter, Minimal) {
function TEST (line 131) | TEST(MinidumpExceptionWriter, Standard) {
function TEST (line 202) | TEST(MinidumpExceptionWriter, InitializeFromSnapshot) {
function TEST (line 262) | TEST(MinidumpExceptionWriterDeathTest, NoContext) {
function TEST (line 273) | TEST(MinidumpExceptionWriterDeathTest, TooMuchInformation) {
FILE: minidump/minidump_extensions.cc
type crashpad (line 17) | namespace crashpad {
FILE: minidump/minidump_extensions.h
function namespace (line 43) | namespace crashpad {
type alignas (line 296) | struct alignas
type alignas (line 305) | struct alignas
type alignas (line 322) | struct alignas
type alignas (line 345) | struct alignas
type alignas (line 395) | struct alignas
type alignas (line 422) | struct alignas
type alignas (line 441) | struct alignas
FILE: minidump/minidump_file_writer.cc
type crashpad (line 44) | namespace crashpad {
FILE: minidump/minidump_file_writer.h
function namespace (line 31) | namespace crashpad {
FILE: minidump/minidump_file_writer_test.cc
type crashpad (line 43) | namespace crashpad {
type test (line 44) | namespace test {
function TEST (line 47) | TEST(MinidumpFileWriter, Empty) {
class TestStream (line 60) | class TestStream final : public internal::MinidumpStreamWriter {
method TestStream (line 62) | TestStream(MinidumpStreamType stream_type,
method TestStream (line 67) | TestStream(const TestStream&) = delete;
method TestStream (line 68) | TestStream& operator=(const TestStream&) = delete;
method MinidumpStreamType (line 73) | MinidumpStreamType StreamType() const override {
method SizeOfObject (line 79) | size_t SizeOfObject() override {
method WriteObject (line 84) | bool WriteObject(FileWriterInterface* file_writer) override {
class StringFileOutputStream (line 94) | class StringFileOutputStream : public OutputStreamInterface {
method StringFileOutputStream (line 96) | StringFileOutputStream() = default;
method StringFileOutputStream (line 98) | StringFileOutputStream(const StringFileOutputStream&) = delete;
method StringFileOutputStream (line 99) | StringFileOutputStream& operator=(const StringFileOutputStream&) =...
method Write (line 102) | bool Write(const uint8_t* data, size_t size) override {
method Flush (line 105) | bool Flush() override { return true; }
method StringFile (line 106) | const StringFile& string_file() const { return string_file_; }
function TEST (line 112) | TEST(MinidumpFileWriter, OneStream) {
function TEST (line 153) | TEST(MinidumpFileWriter, AddUserExtensionStream) {
function TEST (line 199) | TEST(MinidumpFileWriter, AddEmptyUserExtensionStream) {
function TEST (line 232) | TEST(MinidumpFileWriter, ThreeStreams) {
function TEST (line 325) | TEST(MinidumpFileWriter, ZeroLengthStream) {
function TEST (line 356) | TEST(MinidumpFileWriter, InitializeFromSnapshot_Basic) {
function TEST (line 416) | TEST(MinidumpFileWriter, InitializeFromSnapshot_Exception) {
function TEST (line 489) | TEST(MinidumpFileWriter, InitializeFromSnapshot_CrashpadInfo) {
function TEST (line 557) | TEST(MinidumpFileWriter, SameStreamType) {
function TEST (line 603) | TEST(MinidumpFileWriter, WriteMinidumpDisallowSeek) {
FILE: minidump/minidump_handle_writer.cc
type crashpad (line 25) | namespace crashpad {
function MinidumpStreamType (line 124) | MinidumpStreamType MinidumpHandleDataWriter::StreamType() const {
FILE: minidump/minidump_handle_writer.h
function namespace (line 31) | namespace crashpad {
FILE: minidump/minidump_handle_writer_test.cc
type crashpad (line 29) | namespace crashpad {
type test (line 30) | namespace test {
function GetHandleDataStream (line 34) | void GetHandleDataStream(
function TEST (line 59) | TEST(MinidumpHandleDataWriter, Empty) {
function TEST (line 78) | TEST(MinidumpHandleDataWriter, OneHandle) {
function TEST (line 126) | TEST(MinidumpHandleDataWriter, RepeatedTypeName) {
FILE: minidump/minidump_memory_info_writer.cc
type crashpad (line 21) | namespace crashpad {
function MinidumpStreamType (line 81) | MinidumpStreamType MinidumpMemoryInfoListWriter::StreamType() const {
FILE: minidump/minidump_memory_info_writer.h
function namespace (line 28) | namespace crashpad {
FILE: minidump/minidump_memory_info_writer_test.cc
type crashpad (line 28) | namespace crashpad {
type test (line 29) | namespace test {
function GetMemoryInfoListStream (line 33) | void GetMemoryInfoListStream(
function TEST (line 59) | TEST(MinidumpMemoryInfoWriter, Empty) {
function TEST (line 84) | TEST(MinidumpMemoryInfoWriter, OneRegion) {
FILE: minidump/minidump_memory_writer.cc
type crashpad (line 27) | namespace crashpad {
function MINIDUMP_MEMORY_DESCRIPTOR (line 69) | const MINIDUMP_MEMORY_DESCRIPTOR*
function MinidumpStreamType (line 289) | MinidumpStreamType MinidumpMemoryListWriter::StreamType() const {
FILE: minidump/minidump_memory_writer.h
function namespace (line 31) | namespace crashpad {
FILE: minidump/minidump_memory_writer_test.cc
type crashpad (line 31) | namespace crashpad {
type test (line 32) | namespace test {
function GetMemoryListStream (line 41) | void GetMemoryListStream(const std::string& file_contents,
function TEST (line 75) | TEST(MinidumpMemoryWriter, EmptyMemoryList) {
function TEST (line 95) | TEST(MinidumpMemoryWriter, OneMemoryRegion) {
function TEST (line 130) | TEST(MinidumpMemoryWriter, TwoMemoryRegions) {
function TEST (line 192) | TEST(MinidumpMemoryWriter, RegionReadFails) {
class TestMemoryStream (line 233) | class TestMemoryStream final : public internal::MinidumpStreamWriter {
method TestMemoryStream (line 235) | TestMemoryStream(uint64_t base_address, size_t size, uint8_t value)
method TestMemoryStream (line 238) | TestMemoryStream(const TestMemoryStream&) = delete;
method TestMemoryStream (line 239) | TestMemoryStream& operator=(const TestMemoryStream&) = delete;
method TestMinidumpMemoryWriter (line 243) | TestMinidumpMemoryWriter* memory() {
method MinidumpStreamType (line 248) | MinidumpStreamType StreamType() const override {
method SizeOfObject (line 254) | size_t SizeOfObject() override {
method Children (line 259) | std::vector<MinidumpWritable*> Children() override {
method WriteObject (line 265) | bool WriteObject(FileWriterInterface* file_writer) override {
function TEST (line 274) | TEST(MinidumpMemoryWriter, ExtraMemory) {
function TEST (line 343) | TEST(MinidumpMemoryWriter, AddFromSnapshot) {
function TEST (line 398) | TEST(MinidumpMemoryWriter, CoalesceExplicitMultiple) {
type TestRange (line 482) | struct TestRange {
method TestRange (line 483) | TestRange(uint64_t base, size_t size) : base(base), size(size) {}
function ParseCoalesceSpec (line 490) | std::vector<TestRange> ParseCoalesceSpec(const char* spec) {
function TEST (line 517) | TEST(MinidumpMemoryWriter, CoalesceSpecHelperParse) {
function CoalesceTest (line 557) | void CoalesceTest(const char* r1_spec,
function TEST (line 616) | TEST(MinidumpMemoryWriter, CoalescePairsVariousCases) {
FILE: minidump/minidump_misc_info_writer.cc
type crashpad (line 43) | namespace crashpad {
function TimevalToRoundedSeconds (line 46) | uint32_t TimevalToRoundedSeconds(const timeval& tv) {
function BuildString (line 60) | std::string BuildString(const SystemSnapshot* system_snapshot) {
function AvailabilityVersionToMacOSVersionNumber (line 81) | int AvailabilityVersionToMacOSVersionNumber(int availability) {
function MaybeSetXStateData (line 101) | bool MaybeSetXStateData(const ProcessSnapshot* process_snapshot,
type internal (line 140) | namespace internal {
function MinidumpMiscInfoDebugBuildString (line 146) | std::string MinidumpMiscInfoDebugBuildString() {
function MinidumpStreamType (line 442) | MinidumpStreamType MinidumpMiscInfoWriter::StreamType() const {
FILE: minidump/minidump_misc_info_writer.h
function namespace (line 35) | namespace internal {
function HasXStateData (line 122) | bool HasXStateData() const;
FILE: minidump/minidump_misc_info_writer_test.cc
type crashpad (line 35) | namespace crashpad {
type test (line 36) | namespace test {
function GetMiscInfoStream (line 40) | void GetMiscInfoStream(const std::string& file_contents, const T** m...
function ExpectNULPaddedString16Equal (line 63) | void ExpectNULPaddedString16Equal(const char16_t* expected,
function ExpectSystemTimeEqual (line 71) | void ExpectSystemTimeEqual(const SYSTEMTIME* expected,
function TEST (line 204) | TEST(MinidumpMiscInfoWriter, Empty) {
function TEST (line 221) | TEST(MinidumpMiscInfoWriter, ProcessId) {
function TEST (line 244) | TEST(MinidumpMiscInfoWriter, ProcessTimes) {
function TEST (line 272) | TEST(MinidumpMiscInfoWriter, ProcessorPowerInfo) {
function TEST (line 307) | TEST(MinidumpMiscInfoWriter, ProcessIntegrityLevel) {
function TEST (line 330) | TEST(MinidumpMiscInfoWriter, ProcessExecuteFlags) {
function TEST (line 353) | TEST(MinidumpMiscInfoWriter, ProtectedProcess) {
function TEST (line 376) | TEST(MinidumpMiscInfoWriter, TimeZone) {
function TEST (line 432) | TEST(MinidumpMiscInfoWriter, TimeZoneStringsOverflow) {
function TEST (line 492) | TEST(MinidumpMiscInfoWriter, BuildStrings) {
function TEST (line 525) | TEST(MinidumpMiscInfoWriter, BuildStringsOverflow) {
function TEST (line 561) | TEST(MinidumpMiscInfoWriter, XStateData) {
function TEST (line 595) | TEST(MinidumpMiscInfoWriter, ProcessCookie) {
function TEST (line 618) | TEST(MinidumpMiscInfoWriter, Everything) {
function TEST (line 725) | TEST(MinidumpMiscInfoWriter, InitializeFromSnapshot) {
FILE: minidump/minidump_module_crashpad_info_writer.cc
type crashpad (line 27) | namespace crashpad {
FILE: minidump/minidump_module_crashpad_info_writer.h
function namespace (line 28) | namespace crashpad {
FILE: minidump/minidump_module_crashpad_info_writer_test.cc
type crashpad (line 33) | namespace crashpad {
type test (line 34) | namespace test {
function MinidumpModuleCrashpadInfoList (line 37) | const MinidumpModuleCrashpadInfoList* MinidumpModuleCrashpadInfoList...
function TEST (line 61) | TEST(MinidumpModuleCrashpadInfoWriter, EmptyList) {
function TEST (line 77) | TEST(MinidumpModuleCrashpadInfoWriter, EmptyModule) {
function TEST (line 113) | TEST(MinidumpModuleCrashpadInfoWriter, FullModule) {
function TEST (line 222) | TEST(MinidumpModuleCrashpadInfoWriter, ThreeModules) {
function TEST (line 426) | TEST(MinidumpModuleCrashpadInfoWriter, InitializeFromSnapshot) {
FILE: minidump/minidump_module_writer.cc
type crashpad (line 33) | namespace crashpad {
type internal (line 37) | namespace internal {
class internal::MinidumpModuleCodeViewRecordPDBLinkWriter<
CodeViewRecordPDB20> (line 80) | class internal::MinidumpModuleCodeViewRecordPDBLinkWriter<
class internal::MinidumpModuleCodeViewRecordPDBLinkWriter<
CodeViewRecordPDB70> (line 97) | class internal::MinidumpModuleCodeViewRecordPDBLinkWriter<
function MINIDUMP_MODULE (line 296) | const MINIDUMP_MODULE* MinidumpModuleWriter::MinidumpModule() const {
function MinidumpStreamType (line 493) | MinidumpStreamType MinidumpModuleListWriter::StreamType() const {
FILE: minidump/minidump_module_writer.h
function namespace (line 36) | namespace internal {
function class (line 42) | class MinidumpModuleCodeViewRecordWriter : public internal::MinidumpWrit...
function namespace (line 55) | namespace internal {
FILE: minidump/minidump_module_writer_test.cc
type crashpad (line 37) | namespace crashpad {
type test (line 38) | namespace test {
function GetModuleListStream (line 41) | void GetModuleListStream(const std::string& file_contents,
function TEST (line 65) | TEST(MinidumpModuleWriter, EmptyModuleList) {
function ExpectCodeViewRecord (line 90) | void ExpectCodeViewRecord(const MINIDUMP_LOCATION_DESCRIPTOR* codevi...
function ExpectMiscellaneousDebugRecord (line 146) | void ExpectMiscellaneousDebugRecord(
function ExpectModule (line 205) | void ExpectModule(const MINIDUMP_MODULE* expected,
function ExpectModuleWithBuildIDCv (line 282) | void ExpectModuleWithBuildIDCv(const MINIDUMP_MODULE* expected,
function TEST (line 340) | TEST(MinidumpModuleWriter, EmptyModule) {
function TEST (line 379) | TEST(MinidumpModuleWriter, OneModule) {
function TEST (line 497) | TEST(MinidumpModuleWriter, OneModule_CodeViewUsesPDB20_MiscUsesUTF16) {
function TEST (line 559) | TEST(MinidumpModuleWriter, OneModule_CodeViewBuildID) {
function TEST (line 603) | TEST(MinidumpModuleWriter, ThreeModules) {
function InitializeTestModuleSnapshotFromMinidumpModule (line 753) | void InitializeTestModuleSnapshotFromMinidumpModule(
function TEST (line 794) | TEST(MinidumpModuleWriter, InitializeFromSnapshot) {
function TEST (line 933) | TEST(MinidumpModuleWriterDeathTest, NoModuleName) {
FILE: minidump/minidump_rva_list_writer.cc
type crashpad (line 24) | namespace crashpad {
type internal (line 25) | namespace internal {
FILE: minidump/minidump_rva_list_writer.h
function namespace (line 27) | namespace crashpad {
FILE: minidump/minidump_rva_list_writer_test.cc
type crashpad (line 27) | namespace crashpad {
type test (line 28) | namespace test {
class TestMinidumpRVAListWriter (line 31) | class TestMinidumpRVAListWriter final : public internal::MinidumpRVA...
method TestMinidumpRVAListWriter (line 33) | TestMinidumpRVAListWriter() : MinidumpRVAListWriter() {}
method TestMinidumpRVAListWriter (line 35) | TestMinidumpRVAListWriter(const TestMinidumpRVAListWriter&) = delete;
method TestMinidumpRVAListWriter (line 36) | TestMinidumpRVAListWriter& operator=(const TestMinidumpRVAListWrit...
method AddChild (line 41) | void AddChild(uint32_t value) {
function TEST (line 47) | TEST(MinidumpRVAListWriter, Empty) {
function TEST (line 59) | TEST(MinidumpRVAListWriter, OneChild) {
function TEST (line 78) | TEST(MinidumpRVAListWriter, ThreeChildren) {
FILE: minidump/minidump_simple_string_dictionary_writer.cc
type crashpad (line 24) | namespace crashpad {
function MinidumpSimpleStringDictionaryEntry (line 35) | const MinidumpSimpleStringDictionaryEntry*
FILE: minidump/minidump_simple_string_dictionary_writer.h
function namespace (line 29) | namespace crashpad {
FILE: minidump/minidump_simple_string_dictionary_writer_test.cc
type crashpad (line 26) | namespace crashpad {
type test (line 27) | namespace test {
function MinidumpSimpleStringDictionary (line 30) | const MinidumpSimpleStringDictionary* MinidumpSimpleStringDictionary...
function TEST (line 42) | TEST(MinidumpSimpleStringDictionaryWriter, EmptySimpleStringDictiona...
function TEST (line 59) | TEST(MinidumpSimpleStringDictionaryWriter, EmptyKeyValue) {
function TEST (line 89) | TEST(MinidumpSimpleStringDictionaryWriter, OneKeyValue) {
function TEST (line 123) | TEST(MinidumpSimpleStringDictionaryWriter, ThreeKeysValues) {
function TEST (line 194) | TEST(MinidumpSimpleStringDictionaryWriter, DuplicateKeyValue) {
function TEST (line 234) | TEST(MinidumpSimpleStringDictionaryWriter, InitializeFromMap) {
FILE: minidump/minidump_stream_writer.cc
type crashpad (line 19) | namespace crashpad {
type internal (line 20) | namespace internal {
function MINIDUMP_DIRECTORY (line 25) | const MINIDUMP_DIRECTORY* MinidumpStreamWriter::DirectoryListEntry()...
FILE: minidump/minidump_stream_writer.h
function namespace (line 24) | namespace crashpad {
FILE: minidump/minidump_string_writer.cc
type crashpad (line 25) | namespace crashpad {
type internal (line 26) | namespace internal {
class MinidumpStringWriter<MinidumpStringWriterUTF16Traits> (line 84) | class MinidumpStringWriter<MinidumpStringWriterUTF16Traits>
class MinidumpStringWriter<MinidumpStringWriterUTF8Traits> (line 85) | class MinidumpStringWriter<MinidumpStringWriterUTF8Traits>
class MinidumpStringListWriter<MinidumpUTF16StringWriter> (line 135) | class MinidumpStringListWriter<MinidumpUTF16StringWriter>
class MinidumpStringListWriter<MinidumpUTF8StringWriter> (line 136) | class MinidumpStringListWriter<MinidumpUTF8StringWriter>
FILE: minidump/minidump_string_writer.h
function namespace (line 30) | namespace crashpad {
FILE: minidump/minidump_string_writer_test.cc
type crashpad (line 31) | namespace crashpad {
type test (line 32) | namespace test {
class TestTypeNames (line 35) | class TestTypeNames {
method GetName (line 38) | static std::string GetName(int) {
class MinidumpStringWriter (line 45) | class MinidumpStringWriter : public ::testing::Test {}
function TYPED_TEST (line 50) | TYPED_TEST(MinidumpStringWriter, MinidumpUTF16StringWriter) {
function TYPED_TEST (line 119) | TYPED_TEST(MinidumpStringWriter, ConvertInvalidUTF8ToUTF16) {
function TYPED_TEST (line 158) | TYPED_TEST(MinidumpStringWriter, MinidumpUTF8StringWriter) {
type MinidumpUTF16StringListWriterTraits (line 217) | struct MinidumpUTF16StringListWriterTraits {
method ExpectationForUTF8 (line 219) | static std::u16string ExpectationForUTF8(const std::string& utf8) {
method ObservationAtRVA (line 222) | static std::u16string ObservationAtRVA(const std::string& file_con...
type MinidumpUTF8StringListWriterTraits (line 228) | struct MinidumpUTF8StringListWriterTraits {
method ExpectationForUTF8 (line 230) | static std::string ExpectationForUTF8(const std::string& utf8) {
method ObservationAtRVA (line 233) | static std::string ObservationAtRVA(const std::string& file_contents,
function MinidumpStringListTest (line 240) | void MinidumpStringListTest() {
function TYPED_TEST (line 267) | TYPED_TEST(MinidumpStringWriter, MinidumpUTF16StringList) {
function TYPED_TEST (line 271) | TYPED_TEST(MinidumpStringWriter, MinidumpUTF8StringList) {
FILE: minidump/minidump_system_info_writer.cc
type crashpad (line 29) | namespace crashpad {
function AMD64FeaturesFromSystemSnapshot (line 33) | uint64_t AMD64FeaturesFromSystemSnapshot(
function MinidumpStreamType (line 318) | MinidumpStreamType MinidumpSystemInfoWriter::StreamType() const {
FILE: minidump/minidump_system_info_writer.h
function namespace (line 31) | namespace crashpad {
FILE: minidump/minidump_system_info_writer_test.cc
type crashpad (line 32) | namespace crashpad {
type test (line 33) | namespace test {
function GetSystemInfoStream (line 36) | void GetSystemInfoStream(const std::string& file_contents,
function TEST (line 76) | TEST(MinidumpSystemInfoWriter, Empty) {
function TEST (line 119) | TEST(MinidumpSystemInfoWriter, X86_Win) {
function TEST (line 190) | TEST(MinidumpSystemInfoWriter, AMD64_Mac) {
function TEST (line 245) | TEST(MinidumpSystemInfoWriter, X86_CPUVendorFromRegisters) {
function TEST (line 280) | TEST(MinidumpSystemInfoWriter, InitializeFromSnapshot_X86) {
function TEST (line 382) | TEST(MinidumpSystemInfoWriter, InitializeFromSnapshot_AMD64) {
function TEST (line 475) | TEST(MinidumpSystemInfoWriterDeathTest, NoCSDVersion) {
FILE: minidump/minidump_thread_id_map.cc
type crashpad (line 25) | namespace crashpad {
function BuildMinidumpThreadIDMap (line 27) | void BuildMinidumpThreadIDMap(
FILE: minidump/minidump_thread_id_map.h
function namespace (line 23) | namespace crashpad {
FILE: minidump/minidump_thread_id_map_test.cc
type crashpad (line 25) | namespace crashpad {
type test (line 26) | namespace test {
class MinidumpThreadIDMapTest (line 29) | class MinidumpThreadIDMapTest : public testing::Test {
method MinidumpThreadIDMapTest (line 31) | MinidumpThreadIDMapTest()
method MinidumpThreadIDMapTest (line 37) | MinidumpThreadIDMapTest(const MinidumpThreadIDMapTest&) = delete;
method MinidumpThreadIDMapTest (line 38) | MinidumpThreadIDMapTest& operator=(const MinidumpThreadIDMapTest&)...
method SetUp (line 43) | void SetUp() override {
method MapHasKeyValue (line 50) | static bool MapHasKeyValue(
method SetThreadID (line 64) | void SetThreadID(size_t index, uint64_t thread_id) {
function TEST_F (line 78) | TEST_F(MinidumpThreadIDMapTest, NoThreads) {
function TEST_F (line 89) | TEST_F(MinidumpThreadIDMapTest, SimpleMapping) {
function TEST_F (line 107) | TEST_F(MinidumpThreadIDMapTest, Truncation) {
function TEST_F (line 125) | TEST_F(MinidumpThreadIDMapTest, DuplicateThreadID) {
function TEST_F (line 142) | TEST_F(MinidumpThreadIDMapTest, Collision) {
function TEST_F (line 160) | TEST_F(MinidumpThreadIDMapTest, DuplicateAndCollision) {
function TEST_F (line 177) | TEST_F(MinidumpThreadIDMapTest, AllDuplicates) {
FILE: minidump/minidump_thread_name_list_writer.cc
type crashpad (line 26) | namespace crashpad {
function RVA64 (line 44) | RVA64 MinidumpThreadNameWriter::RvaOfThreadName() const {
function MinidumpStreamType (line 188) | MinidumpStreamType MinidumpThreadNameListWriter::StreamType() const {
FILE: minidump/minidump_thread_name_list_writer.h
function SetThreadId (line 60) | void SetThreadId(uint32_t thread_id) { thread_id_ = thread_id; }
function ThreadId (line 65) | uint32_t ThreadId() const;
FILE: minidump/minidump_thread_name_list_writer_test.cc
type crashpad (line 34) | namespace crashpad {
type test (line 35) | namespace test {
function GetThreadNameListStream (line 39) | void GetThreadNameListStream(
function TEST (line 66) | TEST(MinidumpThreadNameListWriter, EmptyThreadNameList) {
function ExpectThreadName (line 90) | void ExpectThreadName(const MINIDUMP_THREAD_NAME* expected,
function TEST (line 110) | TEST(MinidumpThreadNameListWriter, OneThread) {
function TEST (line 150) | TEST(MinidumpThreadNameListWriter, OneThreadWithLeadingPadding) {
function TEST (line 208) | TEST(MinidumpThreadNameListWriter, TwoThreads_DifferentNames) {
function TEST (line 263) | TEST(MinidumpThreadNameListWriter, TwoThreads_SameNames) {
FILE: minidump/minidump_thread_writer.cc
type crashpad (line 28) | namespace crashpad {
function MINIDUMP_THREAD (line 64) | const MINIDUMP_THREAD* MinidumpThreadWriter::MinidumpThread() const {
function MinidumpStreamType (line 234) | MinidumpStreamType MinidumpThreadListWriter::StreamType() const {
FILE: minidump/minidump_thread_writer.h
function namespace (line 30) | namespace crashpad {
FILE: minidump/minidump_thread_writer_test.cc
type crashpad (line 38) | namespace crashpad {
type test (line 39) | namespace test {
function GetThreadListStream (line 45) | void GetThreadListStream(const std::string& file_contents,
function TEST (line 79) | TEST(MinidumpThreadWriter, EmptyThreadList) {
function ExpectThread (line 106) | void ExpectThread(const MINIDUMP_THREAD* expected,
function TEST (line 148) | TEST(MinidumpThreadWriter, OneThread_x86_NoStack) {
function TEST (line 207) | TEST(MinidumpThreadWriter, OneThread_AMD64_Stack) {
function TEST (line 282) | TEST(MinidumpThreadWriter, ThreeThreads_x86_MemoryList) {
type InitializeFromSnapshotX86Traits (line 495) | struct InitializeFromSnapshotX86Traits {
method InitializeCPUContext (line 497) | static void InitializeCPUContext(CPUContext* context, uint32_t see...
method ExpectMinidumpContext (line 500) | static void ExpectMinidumpContext(
type InitializeFromSnapshotAMD64Traits (line 506) | struct InitializeFromSnapshotAMD64Traits {
method InitializeCPUContext (line 508) | static void InitializeCPUContext(CPUContext* context, uint32_t see...
method ExpectMinidumpContext (line 511) | static void ExpectMinidumpContext(uint32_t expect_seed,
type InitializeFromSnapshotNoContextTraits (line 518) | struct InitializeFromSnapshotNoContextTraits {
method InitializeCPUContext (line 520) | static void InitializeCPUContext(CPUContext* context, uint32_t see...
method ExpectMinidumpContext (line 523) | static void ExpectMinidumpContext(uint32_t expect_seed,
function RunInitializeFromSnapshotTest (line 531) | void RunInitializeFromSnapshotTest(bool thread_id_collision) {
function TEST (line 690) | TEST(MinidumpThreadWriter, InitializeFromSnapshot_x86) {
function TEST (line 694) | TEST(MinidumpThreadWriter, InitializeFromSnapshot_AMD64) {
function TEST (line 698) | TEST(MinidumpThreadWriter, InitializeFromSnapshot_ThreadIDCollision) {
function TEST (line 702) | TEST(MinidumpThreadWriterDeathTest, NoContext) {
function TEST (line 716) | TEST(MinidumpThreadWriterDeathTest, InitializeFromSnapshot_NoContext) {
FILE: minidump/minidump_unloaded_module_writer.cc
type crashpad (line 26) | namespace crashpad {
function MINIDUMP_UNLOADED_MODULE (line 48) | const MINIDUMP_UNLOADED_MODULE*
function MinidumpStreamType (line 201) | MinidumpStreamType MinidumpUnloadedModuleListWriter::StreamType() const {
FILE: minidump/minidump_unloaded_module_writer.h
function namespace (line 31) | namespace crashpad {
FILE: minidump/minidump_unloaded_module_writer_test.cc
type crashpad (line 25) | namespace crashpad {
type test (line 26) | namespace test {
function ExpectUnloadedModule (line 29) | void ExpectUnloadedModule(const MINIDUMP_UNLOADED_MODULE* expected,
function GetUnloadedModuleListStream (line 45) | void GetUnloadedModuleListStream(
function TEST (line 71) | TEST(MinidumpUnloadedModuleWriter, EmptyModule) {
function TEST (line 110) | TEST(MinidumpUnloadedModuleWriter, OneModule) {
FILE: minidump/minidump_user_extension_stream_data_source.cc
type crashpad (line 17) | namespace crashpad {
FILE: minidump/minidump_user_extension_stream_data_source.h
function namespace (line 24) | namespace crashpad {
FILE: minidump/minidump_user_stream_writer.cc
type crashpad (line 20) | namespace crashpad {
class MinidumpUserStreamWriter::ContentsWriter (line 22) | class MinidumpUserStreamWriter::ContentsWriter {
class MinidumpUserStreamWriter::SnapshotContentsWriter (line 29) | class MinidumpUserStreamWriter::SnapshotContentsWriter final
method SnapshotContentsWriter (line 33) | explicit SnapshotContentsWriter(const MemorySnapshot* snapshot)
method SnapshotContentsWriter (line 36) | SnapshotContentsWriter(const SnapshotContentsWriter&) = delete;
method SnapshotContentsWriter (line 37) | SnapshotContentsWriter& operator=(const SnapshotContentsWriter&) = d...
method WriteContents (line 39) | bool WriteContents(FileWriterInterface* writer) override {
method GetSize (line 49) | size_t GetSize() const override { return snapshot_ ? snapshot_->Size...
method MemorySnapshotDelegateRead (line 51) | bool MemorySnapshotDelegateRead(void* data, size_t size) override {
class MinidumpUserStreamWriter::ExtensionStreamContentsWriter (line 60) | class MinidumpUserStreamWriter::ExtensionStreamContentsWriter final
method ExtensionStreamContentsWriter (line 64) | explicit ExtensionStreamContentsWriter(
method ExtensionStreamContentsWriter (line 68) | ExtensionStreamContentsWriter(const ExtensionStreamContentsWriter&) ...
method ExtensionStreamContentsWriter (line 69) | ExtensionStreamContentsWriter& operator=(
method WriteContents (line 72) | bool WriteContents(FileWriterInterface* writer) override {
method GetSize (line 79) | size_t GetSize() const override { return data_source_->StreamDataSiz...
method ExtensionStreamDataSourceRead (line 81) | bool ExtensionStreamDataSourceRead(const void* data, size_t size) ov...
function MinidumpStreamType (line 138) | MinidumpStreamType MinidumpUserStreamWriter::StreamType() const {
FILE: minidump/minidump_user_stream_writer.h
function namespace (line 31) | namespace crashpad {
FILE: minidump/minidump_user_stream_writer_test.cc
type crashpad (line 28) | namespace crashpad {
type test (line 29) | namespace test {
function GetUserStream (line 33) | void GetUserStream(const std::string& file_contents,
function TEST (line 58) | TEST(MinidumpUserStreamWriter, InitializeFromSnapshotNoData) {
function TEST (line 76) | TEST(MinidumpUserStreamWriter, InitializeFromUserExtensionStreamNoDa...
function TEST (line 95) | TEST(MinidumpUserStreamWriter, InitializeFromSnapshotOneStream) {
function TEST (line 122) | TEST(MinidumpUserStreamWriter, InitializeFromBufferOneStream) {
FILE: minidump/minidump_writable.cc
type crashpad (line 32) | namespace crashpad {
type internal (line 33) | namespace internal {
FILE: minidump/minidump_writable.h
function namespace (line 27) | namespace crashpad {
FILE: minidump/minidump_writable_test.cc
type crashpad (line 23) | namespace crashpad {
type test (line 24) | namespace test {
class BaseTestMinidumpWritable (line 27) | class BaseTestMinidumpWritable : public crashpad::internal::Minidump...
method BaseTestMinidumpWritable (line 29) | BaseTestMinidumpWritable()
method BaseTestMinidumpWritable (line 39) | BaseTestMinidumpWritable(const BaseTestMinidumpWritable&) = delete;
method BaseTestMinidumpWritable (line 40) | BaseTestMinidumpWritable& operator=(const BaseTestMinidumpWritable...
method SetAlignment (line 44) | void SetAlignment(size_t alignment) {
method AddChild (line 49) | void AddChild(BaseTestMinidumpWritable* child) { children_.push_ba...
method SetPhaseLate (line 51) | void SetPhaseLate() {
method Verify (line 56) | void Verify() {
method Freeze (line 65) | bool Freeze() override {
method Alignment (line 73) | size_t Alignment() override {
method Children (line 78) | std::vector<MinidumpWritable*> Children() override {
method Phase (line 90) | Phase WritePhase() override {
method WillWriteAtOffsetImpl (line 94) | bool WillWriteAtOffsetImpl(FileOffset offset) override {
method WriteObject (line 102) | bool WriteObject(FileWriterInterface* file_writer) override {
class TestStringMinidumpWritable (line 120) | class TestStringMinidumpWritable final : public BaseTestMinidumpWrit...
method TestStringMinidumpWritable (line 122) | TestStringMinidumpWritable() : BaseTestMinidumpWritable(), data_() {}
method TestStringMinidumpWritable (line 124) | TestStringMinidumpWritable(const TestStringMinidumpWritable&) = de...
method TestStringMinidumpWritable (line 125) | TestStringMinidumpWritable& operator=(const TestStringMinidumpWrit...
method SetData (line 130) | void SetData(const std::string& string) { data_ = string; }
method SizeOfObject (line 133) | size_t SizeOfObject() override {
method WriteObject (line 138) | bool WriteObject(FileWriterInterface* file_writer) override {
function TEST (line 149) | TEST(MinidumpWritable, MinidumpWritable) {
class TTestRVAMinidumpWritable (line 489) | class TTestRVAMinidumpWritable final : public BaseTestMinidumpWritab...
method TTestRVAMinidumpWritable (line 491) | TTestRVAMinidumpWritable() : BaseTestMinidumpWritable(), rva_() {}
method TTestRVAMinidumpWritable (line 493) | TTestRVAMinidumpWritable(const TTestRVAMinidumpWritable&) = delete;
method TTestRVAMinidumpWritable (line 494) | TTestRVAMinidumpWritable& operator=(const TTestRVAMinidumpWritable...
method SetRVA (line 498) | void SetRVA(MinidumpWritable* other) { other->RegisterRVA(&rva_); }
method SizeOfObject (line 501) | size_t SizeOfObject() override {
method WriteObject (line 506) | bool WriteObject(FileWriterInterface* file_writer) override {
function RVAType (line 517) | RVAType TRVAAtIndex(const std::string& string, size_t index) {
type TestNames (line 522) | struct TestNames {}
type TestNames<RVA> (line 525) | struct TestNames<RVA> {
type TestNames<RVA64> (line 530) | struct TestNames<RVA64> {
class TestTypeNames (line 534) | class TestTypeNames {
method GetName (line 537) | static std::string GetName(int) {
class MinidumpWritable (line 543) | class MinidumpWritable : public ::testing::Test {}
function TYPED_TEST (line 548) | TYPED_TEST(MinidumpWritable, RVA) {
class TTestLocationDescriptorMinidumpWritable (line 653) | class TTestLocationDescriptorMinidumpWritable final
method TTestLocationDescriptorMinidumpWritable (line 656) | TTestLocationDescriptorMinidumpWritable()
method TTestLocationDescriptorMinidumpWritable (line 659) | TTestLocationDescriptorMinidumpWritable(
method TTestLocationDescriptorMinidumpWritable (line 661) | TTestLocationDescriptorMinidumpWritable& operator=(
method SetLocationDescriptor (line 666) | void SetLocationDescriptor(MinidumpWritable* other) {
method SetString (line 670) | void SetString(const std::string& string) { string_ = string; }
method SizeOfObject (line 673) | size_t SizeOfObject() override {
method WriteObject (line 679) | bool WriteObject(FileWriterInterface* file_writer) override {
type TLocationDescriptorAndData (line 699) | struct TLocationDescriptorAndData {
function TLDDAtIndex (line 705) | TLocationDescriptorAndData<MinidumpLocationDescriptorType> TLDDAtIndex(
class MinidumpWritableLocationDescriptor (line 723) | class MinidumpWritableLocationDescriptor : public ::testing::Test {}
type TestNames<MINIDUMP_LOCATION_DESCRIPTOR> (line 726) | struct TestNames<MINIDUMP_LOCATION_DESCRIPTOR> {
type TestNames<MINIDUMP_LOCATION_DESCRIPTOR64> (line 731) | struct TestNames<MINIDUMP_LOCATION_DESCRIPTOR64> {
function TYPED_TEST (line 742) | TYPED_TEST(MinidumpWritableLocationDescriptor, LocationDescriptor) {
FILE: minidump/minidump_writer_util.cc
type crashpad (line 22) | namespace crashpad {
type internal (line 23) | namespace internal {
FILE: minidump/minidump_writer_util.h
function namespace (line 25) | namespace crashpad {
FILE: minidump/test/minidump_byte_array_writer_test_util.cc
type crashpad (line 19) | namespace crashpad {
type test (line 20) | namespace test {
function MinidumpByteArrayAtRVA (line 22) | std::vector<uint8_t> MinidumpByteArrayAtRVA(const std::string& file_...
FILE: minidump/test/minidump_byte_array_writer_test_util.h
function namespace (line 25) | namespace crashpad {
FILE: minidump/test/minidump_context_test_util.cc
type crashpad (line 29) | namespace crashpad {
type test (line 30) | namespace test {
function InitializeMinidumpContextX86 (line 32) | void InitializeMinidumpContextX86(MinidumpContextX86* context, uint3...
function InitializeMinidumpContextAMD64 (line 75) | void InitializeMinidumpContextAMD64(MinidumpContextAMD64* context,
function InitializeMinidumpContextARM (line 144) | void InitializeMinidumpContextARM(MinidumpContextARM* context, uint3...
function InitializeMinidumpContextARM64 (line 172) | void InitializeMinidumpContextARM64(MinidumpContextARM64* context,
function InitializeMinidumpContextMIPS (line 201) | void InitializeMinidumpContextMIPS(MinidumpContextMIPS* context,
function InitializeMinidumpContextMIPS64 (line 239) | void InitializeMinidumpContextMIPS64(MinidumpContextMIPS64* context,
function InitializeMinidumpContextRISCV64 (line 275) | void InitializeMinidumpContextRISCV64(MinidumpContextRISCV64* context,
function ExpectMinidumpContextFxsave (line 307) | void ExpectMinidumpContextFxsave(const FxsaveType* expected,
function ExpectMinidumpContextX86 (line 353) | void ExpectMinidumpContextX86(
function ExpectMinidumpContextAMD64 (line 406) | void ExpectMinidumpContextAMD64(
function ExpectMinidumpContextARM (line 516) | void ExpectMinidumpContextARM(uint32_t expect_seed,
function ExpectMinidumpContextARM64 (line 543) | void ExpectMinidumpContextARM64(uint32_t expect_seed,
function ExpectMinidumpContextMIPS (line 564) | void ExpectMinidumpContextMIPS(uint32_t expect_seed,
function ExpectMinidumpContextMIPS64 (line 597) | void ExpectMinidumpContextMIPS64(uint32_t expect_seed,
function ExpectMinidumpContextRISCV64 (line 629) | void ExpectMinidumpContextRISCV64(uint32_t expect_seed,
FILE: minidump/test/minidump_context_test_util.h
function namespace (line 22) | namespace crashpad {
FILE: minidump/test/minidump_file_writer_test_util.cc
type crashpad (line 20) | namespace crashpad {
type test (line 21) | namespace test {
function MINIDUMP_HEADER (line 23) | const MINIDUMP_HEADER* MinidumpHeaderAtStart(
function VerifyMinidumpHeader (line 47) | void VerifyMinidumpHeader(const MINIDUMP_HEADER* header,
FILE: minidump/test/minidump_file_writer_test_util.h
function namespace (line 24) | namespace crashpad {
FILE: minidump/test/minidump_memory_writer_test_util.cc
type crashpad (line 19) | namespace crashpad {
type test (line 20) | namespace test {
function ExpectMinidumpMemoryDescriptor (line 38) | void ExpectMinidumpMemoryDescriptor(
function ExpectMinidumpMemoryDescriptorAndContents (line 59) | void ExpectMinidumpMemoryDescriptorAndContents(
FILE: minidump/test/minidump_memory_writer_test_util.h
function namespace (line 30) | namespace crashpad {
FILE: minidump/test/minidump_rva_list_test_util.cc
type crashpad (line 24) | namespace crashpad {
type test (line 25) | namespace test {
function MinidumpRVAList (line 27) | const MinidumpRVAList* MinidumpRVAListAtStart(const std::string& fil...
FILE: minidump/test/minidump_rva_list_test_util.h
function namespace (line 22) | namespace crashpad {
FILE: minidump/test/minidump_string_writer_test_util.cc
type crashpad (line 23) | namespace crashpad {
type test (line 24) | namespace test {
function T (line 32) | const T* TMinidumpStringAtRVA(const std::string& file_contents, RVAT...
function StringType (line 72) | StringType TMinidumpStringAtRVAAsString(const std::string& file_cont...
function MINIDUMP_STRING (line 91) | const MINIDUMP_STRING* MinidumpStringAtRVA(const std::string& file_c...
function MINIDUMP_STRING (line 98) | const MINIDUMP_STRING* MinidumpStringAtRVA(const std::string& file_c...
function MinidumpUTF8String (line 106) | const MinidumpUTF8String* MinidumpUTF8StringAtRVA(
function MinidumpUTF8String (line 114) | const MinidumpUTF8String* MinidumpUTF8StringAtRVA(
function MinidumpStringAtRVAAsString (line 123) | std::u16string MinidumpStringAtRVAAsString(const std::string& file_c...
function MinidumpStringAtRVAAsString (line 132) | std::u16string MinidumpStringAtRVAAsString(const std::string& file_c...
function MinidumpUTF8StringAtRVAAsString (line 141) | std::string MinidumpUTF8StringAtRVAAsString(const std::string& file_...
function MinidumpUTF8StringAtRVAAsString (line 150) | std::string MinidumpUTF8StringAtRVAAsString(const std::string& file_...
FILE: minidump/test/minidump_string_writer_test_util.h
function namespace (line 28) | namespace crashpad {
FILE: minidump/test/minidump_user_extension_stream_util.cc
type crashpad (line 19) | namespace crashpad {
type test (line 20) | namespace test {
FILE: minidump/test/minidump_user_extension_stream_util.h
function namespace (line 25) | namespace crashpad {
FILE: minidump/test/minidump_writable_test_util.cc
type crashpad (line 26) | namespace crashpad {
type test (line 27) | namespace test {
function IMAGE_DEBUG_MISC (line 113) | const IMAGE_DEBUG_MISC* MinidumpWritableAtLocationDescriptor<IMAGE_D...
function MINIDUMP_HEADER (line 163) | const MINIDUMP_HEADER* MinidumpWritableAtLocationDescriptor<MINIDUMP...
type MinidumpMemoryListTraits (line 187) | struct MinidumpMemoryListTraits {
method ElementCount (line 190) | static size_t ElementCount(const ListType* list) {
type MinidumpModuleListTraits (line 195) | struct MinidumpModuleListTraits {
method ElementCount (line 198) | static size_t ElementCount(const ListType* list) {
type MinidumpUnloadedModuleListTraits (line 203) | struct MinidumpUnloadedModuleListTraits {
method ElementCount (line 206) | static size_t ElementCount(const ListType* list) {
type MinidumpThreadListTraits (line 211) | struct MinidumpThreadListTraits {
method ElementCount (line 214) | static size_t ElementCount(const ListType* list) {
type MinidumpThreadNameListTraits (line 219) | struct MinidumpThreadNameListTraits {
method ElementCount (line 222) | static size_t ElementCount(const ListType* list) {
type MinidumpHandleDataStreamTraits (line 227) | struct MinidumpHandleDataStreamTraits {
method ElementCount (line 230) | static size_t ElementCount(const ListType* list) {
type MinidumpMemoryInfoListTraits (line 235) | struct MinidumpMemoryInfoListTraits {
method ElementCount (line 238) | static size_t ElementCount(const ListType* list) {
type MinidumpModuleCrashpadInfoListTraits (line 243) | struct MinidumpModuleCrashpadInfoListTraits {
method ElementCount (line 246) | static size_t ElementCount(const ListType* list) { return list->co...
type MinidumpSimpleStringDictionaryListTraits (line 249) | struct MinidumpSimpleStringDictionaryListTraits {
method ElementCount (line 252) | static size_t ElementCount(const ListType* list) { return list->co...
type MinidumpAnnotationListObjectsTraits (line 255) | struct MinidumpAnnotationListObjectsTraits {
method ElementCount (line 258) | static size_t ElementCount(const ListType* list) { return list->co...
function MINIDUMP_MEMORY_LIST (line 285) | const MINIDUMP_MEMORY_LIST*
function MINIDUMP_MODULE_LIST (line 294) | const MINIDUMP_MODULE_LIST*
function MINIDUMP_UNLOADED_MODULE_LIST (line 303) | const MINIDUMP_UNLOADED_MODULE_LIST*
function MINIDUMP_THREAD_LIST (line 312) | const MINIDUMP_THREAD_LIST*
function MINIDUMP_THREAD_NAME_LIST (line 321) | const MINIDUMP_THREAD_NAME_LIST*
function MINIDUMP_HANDLE_DATA_STREAM (line 330) | const MINIDUMP_HANDLE_DATA_STREAM*
function MINIDUMP_MEMORY_INFO_LIST (line 339) | const MINIDUMP_MEMORY_INFO_LIST*
function MinidumpModuleCrashpadInfoList (line 348) | const MinidumpModuleCrashpadInfoList*
function MinidumpSimpleStringDictionary (line 357) | const MinidumpSimpleStringDictionary*
function MinidumpAnnotationList (line 366) | const MinidumpAnnotationList*
function T (line 377) | const T* MinidumpCVPDBAtLocationDescriptor(
function CodeViewRecordPDB20 (line 403) | const CodeViewRecordPDB20*
function CodeViewRecordPDB70 (line 412) | const CodeViewRecordPDB70*
function CodeViewRecordBuildID (line 421) | const CodeViewRecordBuildID*
FILE: minidump/test/minidump_writable_test_util.h
function namespace (line 29) | namespace crashpad {
FILE: snapshot/annotation_snapshot.cc
type crashpad (line 17) | namespace crashpad {
FILE: snapshot/annotation_snapshot.h
function namespace (line 23) | namespace crashpad {
FILE: snapshot/capture_memory.cc
type crashpad (line 31) | namespace crashpad {
type internal (line 32) | namespace internal {
function MaybeCaptureMemoryAround (line 36) | void MaybeCaptureMemoryAround(CaptureMemory::Delegate* delegate,
function CaptureAtPointersInRange (line 61) | void CaptureAtPointersInRange(uint8_t* buffer,
FILE: snapshot/capture_memory.h
function namespace (line 25) | namespace crashpad {
FILE: snapshot/cpu_architecture.h
function namespace (line 18) | namespace crashpad {
FILE: snapshot/cpu_context.cc
type crashpad (line 27) | namespace crashpad {
FILE: snapshot/cpu_context.h
function namespace (line 23) | namespace crashpad {
FILE: snapshot/cpu_context_test.cc
type crashpad (line 26) | namespace crashpad {
type test (line 27) | namespace test {
type ExponentValue (line 30) | enum ExponentValue {
type FractionValue (line 36) | enum FractionValue {
function SetX87Register (line 54) | void SetX87Register(CPUContextX86::X87Register* st,
function SetX87OrMMXRegister (line 87) | void SetX87OrMMXRegister(CPUContextX86::X87OrMMXRegister* st_mm,
function TEST (line 95) | TEST(CPUContextX86, FxsaveToFsave) {
function TEST (line 160) | TEST(CPUContextX86, FsaveToFxsave) {
function TEST (line 236) | TEST(CPUContextX86, FxsaveToFsaveTagWord) {
function TEST (line 335) | TEST(CPUContextX86, FsaveToFxsaveTagWord) {
FILE: snapshot/crashpad_info_client_options.cc
type crashpad (line 19) | namespace crashpad {
function TriState (line 22) | TriState CrashpadInfoClientOptions::TriStateFromCrashpadInfo(
FILE: snapshot/crashpad_info_client_options.h
function namespace (line 22) | namespace crashpad {
FILE: snapshot/crashpad_info_client_options_test.cc
type crashpad (line 38) | namespace crashpad {
type test (line 39) | namespace test {
function TEST (line 42) | TEST(CrashpadInfoClientOptions, TriStateFromCrashpadInfo) {
class ScopedUnsetCrashpadInfoOptions (line 59) | class ScopedUnsetCrashpadInfoOptions {
method ScopedUnsetCrashpadInfoOptions (line 61) | explicit ScopedUnsetCrashpadInfoOptions(CrashpadInfo* crashpad_info)
method ScopedUnsetCrashpadInfoOptions (line 65) | ScopedUnsetCrashpadInfoOptions(const ScopedUnsetCrashpadInfoOption...
method ScopedUnsetCrashpadInfoOptions (line 67) | ScopedUnsetCrashpadInfoOptions& operator=(
function CrashpadInfoClientOptions (line 81) | CrashpadInfoClientOptions SelfProcessSnapshotAndGetCrashpadOptions() {
function TEST (line 101) | TEST(CrashpadInfoClientOptions, OneModule) {
function TEST (line 151) | TEST(CrashpadInfoClientOptions, TwoModules) {
class CrashpadInfoSizes_ClientOptions (line 241) | class CrashpadInfoSizes_ClientOptions
function CrashpadInfo (line 253) | [[clang::no_sanitize("function")]]
function TEST_P (line 260) | TEST_P(CrashpadInfoSizes_ClientOptions, DifferentlySizedStruct) {
FILE: snapshot/crashpad_info_client_options_test_module.cc
function EXPORT (line 37) | EXPORT crashpad::CrashpadInfo* TestModule_GetCrashpadInfo() {
function BOOL (line 44) | BOOL WINAPI DllMain(HINSTANCE hinstance, DWORD reason, LPVOID reserved) {
FILE: snapshot/crashpad_info_size_test_module.cc
type TestCrashpadInfo (line 41) | struct TestCrashpadInfo {
function BOOL (line 133) | BOOL WINAPI DllMain(HINSTANCE hinstance, DWORD reason, LPVOID reserved) {
FILE: snapshot/crashpad_types/crashpad_info_reader.cc
type crashpad (line 31) | namespace crashpad {
function UnsetIfNotValidTriState (line 35) | void UnsetIfNotValidTriState(TriState* value) {
class CrashpadInfoReader::InfoContainer (line 48) | class CrashpadInfoReader::InfoContainer {
method InfoContainer (line 55) | InfoContainer() = default;
class CrashpadInfoReader::InfoContainerSpecific (line 59) | class CrashpadInfoReader::InfoContainerSpecific : public InfoContainer {
method InfoContainerSpecific (line 61) | InfoContainerSpecific() : InfoContainer() {}
method Read (line 64) | bool Read(const ProcessMemoryRange* memory, VMAddress address) overr...
FILE: snapshot/crashpad_types/crashpad_info_reader.h
function namespace (line 27) | namespace crashpad {
FILE: snapshot/crashpad_types/crashpad_info_reader_test.cc
type crashpad (line 37) | namespace crashpad {
type test (line 38) | namespace test {
class ScopedUnsetCrashpadInfo (line 47) | class ScopedUnsetCrashpadInfo {
method ScopedUnsetCrashpadInfo (line 49) | explicit ScopedUnsetCrashpadInfo(CrashpadInfo* crashpad_info)
method ScopedUnsetCrashpadInfo (line 52) | ScopedUnsetCrashpadInfo(const ScopedUnsetCrashpadInfo&) = delete;
method ScopedUnsetCrashpadInfo (line 53) | ScopedUnsetCrashpadInfo& operator=(const ScopedUnsetCrashpadInfo&)...
class CrashpadInfoTestDataSetup (line 69) | class CrashpadInfoTestDataSetup {
method CrashpadInfoTestDataSetup (line 71) | CrashpadInfoTestDataSetup() {
method CrashpadInfoTestDataSetup (line 84) | CrashpadInfoTestDataSetup(const CrashpadInfoTestDataSetup&) = delete;
method CrashpadInfoTestDataSetup (line 85) | CrashpadInfoTestDataSetup& operator=(const CrashpadInfoTestDataSet...
method GetAddresses (line 88) | void GetAddresses(VMAddress* info_address,
function ExpectCrashpadInfo (line 106) | void ExpectCrashpadInfo(ProcessType process,
function TEST (line 138) | TEST(CrashpadInfoReader, ReadFromSelf) {
function CRASHPAD_CHILD_TEST_MAIN (line 162) | CRASHPAD_CHILD_TEST_MAIN(ReadFromChildTestMain) {
class ReadFromChildTest (line 184) | class ReadFromChildTest : public MultiprocessExec {
method ReadFromChildTest (line 186) | ReadFromChildTest() : MultiprocessExec() {
method ReadFromChildTest (line 190) | ReadFromChildTest(const ReadFromChildTest&) = delete;
method ReadFromChildTest (line 191) | ReadFromChildTest& operator=(const ReadFromChildTest&) = delete;
method MultiprocessParent (line 196) | void MultiprocessParent() {
function TEST (line 226) | TEST(CrashpadInfoReader, ReadFromChild) {
FILE: snapshot/crashpad_types/image_annotation_reader.cc
type crashpad (line 35) | namespace crashpad {
type process_types (line 37) | namespace process_types {
type Annotation (line 40) | struct Annotation {
type AnnotationList (line 51) | struct AnnotationList {
FILE: snapshot/crashpad_types/image_annotation_reader.h
function namespace (line 26) | namespace crashpad {
FILE: snapshot/crashpad_types/image_annotation_reader_test.cc
type crashpad (line 39) | namespace crashpad {
type test (line 40) | namespace test {
function ExpectSimpleMap (line 43) | void ExpectSimpleMap(const std::map<std::string, std::string>& map,
function ExpectAnnotationList (line 51) | void ExpectAnnotationList(const std::vector<AnnotationSnapshot>& list,
function BuildTestStructures (line 67) | void BuildTestStructures(
function ExpectAnnotations (line 93) | void ExpectAnnotations(ProcessType process,
function TEST (line 126) | TEST(ImageAnnotationReader, ReadFromSelf) {
function CRASHPAD_CHILD_TEST_MAIN (line 144) | CRASHPAD_CHILD_TEST_MAIN(ReadAnnotationsFromChildTestMain) {
class ReadFromChildTest (line 160) | class ReadFromChildTest : public MultiprocessExec {
method ReadFromChildTest (line 162) | ReadFromChildTest() : MultiprocessExec() {
method ReadFromChildTest (line 166) | ReadFromChildTest(const ReadFromChildTest&) = delete;
method ReadFromChildTest (line 167) | ReadFromChildTest& operator=(const ReadFromChildTest&) = delete;
method MultiprocessParent (line 172) | void MultiprocessParent() {
function TEST (line 190) | TEST(ImageAnnotationReader, ReadFromChild) {
FILE: snapshot/elf/elf_dynamic_array_reader.cc
type crashpad (line 23) | namespace crashpad {
function Read (line 28) | bool Read(const ProcessMemoryRange& memory,
FILE: snapshot/elf/elf_dynamic_array_reader.h
function namespace (line 27) | namespace crashpad {
FILE: snapshot/elf/elf_image_reader.cc
type crashpad (line 30) | namespace crashpad {
class ElfImageReader::ProgramHeaderTable (line 32) | class ElfImageReader::ProgramHeaderTable {
method ProgramHeaderTable (line 53) | ProgramHeaderTable() {}
class ElfImageReader::ProgramHeaderTableSpecific (line 57) | class ElfImageReader::ProgramHeaderTableSpecific
method ProgramHeaderTableSpecific (line 60) | ProgramHeaderTableSpecific() {}
method ProgramHeaderTableSpecific (line 62) | ProgramHeaderTableSpecific(
method Initialize (line 69) | bool Initialize(const ProcessMemoryRange& memory,
method VerifyLoadSegments (line 87) | bool VerifyLoadSegments(bool verbose) const override {
method Size (line 112) | size_t Size() const override { return sizeof(PhdrType) * table_.size...
method GetPreferredElfHeaderAddress (line 114) | bool GetPreferredElfHeaderAddress(VMAddress* address,
method GetPreferredLoadedMemoryRange (line 127) | bool GetPreferredLoadedMemoryRange(VMAddress* base,
method GetDynamicSegment (line 153) | bool GetDynamicSegment(VMAddress* address, VMSize* size) const overr...
method GetProgramHeader (line 164) | bool GetProgramHeader(uint32_t type, const PhdrType** header_out) co...
method GetNoteSegment (line 175) | bool GetNoteSegment(size_t* start_index,
function VMAddress (line 634) | VMAddress ElfImageReader::GetProgramHeaderTableAddress() {
function ProcessMemoryRange (line 858) | const ProcessMemoryRange* ElfImageReader::Memory() const {
FILE: snapshot/elf/elf_image_reader.h
function Result (line 54) | enum class Result {
FILE: snapshot/elf/elf_image_reader_fuzzer.cc
class FakeProcessMemory (line 23) | class FakeProcessMemory : public ProcessMemory {
method FakeProcessMemory (line 25) | FakeProcessMemory(const uint8_t* data, size_t size, VMAddress fake_base)
method ReadUpTo (line 28) | ssize_t ReadUpTo(VMAddress address,
function LLVMFuzzerInitialize (line 46) | int LLVMFuzzerInitialize(int* argc, char*** argv) {
function LLVMFuzzerTestOneInput (line 55) | int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
FILE: snapshot/elf/elf_image_reader_test.cc
function ElfImageReaderTestExportedSymbol (line 51) | __attribute__((visibility("default"))) void ElfImageReaderTestExportedSy...
type crashpad (line 55) | namespace crashpad {
type test (line 56) | namespace test {
function LocateExecutable (line 61) | void LocateExecutable(const ProcessType& process,
function LocateExecutable (line 88) | void LocateExecutable(PtraceConnection* connection,
function ExpectSymbol (line 108) | void ExpectSymbol(ElfImageReader* reader,
function ReadThisExecutableInTarget (line 121) | void ReadThisExecutableInTarget(ProcessType process,
function ReadLibcInTarget (line 185) | void ReadLibcInTarget(ProcessType process,
function TEST (line 212) | TEST(ElfImageReader, MainExecutableSelf) {
function CRASHPAD_CHILD_TEST_MAIN (line 218) | CRASHPAD_CHILD_TEST_MAIN(ReadExecutableChild) {
class ReadExecutableChildTest (line 228) | class ReadExecutableChildTest : public MultiprocessExec {
method ReadExecutableChildTest (line 230) | ReadExecutableChildTest() : MultiprocessExec() {}
method MultiprocessParent (line 233) | void MultiprocessParent() {
function TEST (line 247) | TEST(ElfImageReader, MainExecutableChild) {
function TEST (line 253) | TEST(ElfImageReader, OneModuleSelf) {
function CRASHPAD_CHILD_TEST_MAIN (line 262) | CRASHPAD_CHILD_TEST_MAIN(ReadLibcChild) {
class ReadLibcChildTest (line 282) | class ReadLibcChildTest : public MultiprocessExec {
method ReadLibcChildTest (line 284) | ReadLibcChildTest() : MultiprocessExec() {}
method MultiprocessParent (line 288) | void MultiprocessParent() {
function TEST (line 297) | TEST(ElfImageReader, OneModuleChild) {
function TEST (line 320) | TEST(ElfImageReader, DtHashAndDtGnuHashMatch) {
FILE: snapshot/elf/elf_symbol_table_reader.cc
type crashpad (line 21) | namespace crashpad {
function GetBinding (line 25) | uint8_t GetBinding(const Elf32_Sym& sym) {
function GetBinding (line 29) | uint8_t GetBinding(const Elf64_Sym& sym) {
function GetType (line 33) | uint8_t GetType(const Elf32_Sym& sym) {
function GetType (line 37) | uint8_t GetType(const Elf64_Sym& sym) {
function GetVisibility (line 41) | uint8_t GetVisibility(const Elf32_Sym& sym) {
function GetVisibility (line 45) | uint8_t GetVisibility(const Elf64_Sym& sym) {
FILE: snapshot/elf/elf_symbol_table_reader.h
function namespace (line 25) | namespace crashpad {
FILE: snapshot/elf/module_snapshot_elf.cc
type crashpad (line 26) | namespace crashpad {
type internal (line 27) | namespace internal {
function time_t (line 121) | time_t ModuleSnapshotElf::Timestamp() const {
FILE: snapshot/elf/module_snapshot_elf.h
function namespace (line 32) | namespace crashpad {
FILE: snapshot/exception_snapshot.h
function namespace (line 24) | namespace crashpad {
FILE: snapshot/fuchsia/cpu_context_fuchsia.cc
type crashpad (line 19) | namespace crashpad {
type internal (line 20) | namespace internal {
function InitializeCPUContextX86_64 (line 24) | void InitializeCPUContextX86_64(
function InitializeCPUContextARM64 (line 64) | void InitializeCPUContextARM64(
function InitializeCPUContextRISCV64 (line 108) | void InitializeCPUContextRISCV64(
FILE: snapshot/fuchsia/cpu_context_fuchsia.h
function namespace (line 24) | namespace crashpad {
FILE: snapshot/fuchsia/exception_snapshot_fuchsia.cc
type crashpad (line 21) | namespace crashpad {
type internal (line 22) | namespace internal {
function CPUContext (line 115) | const CPUContext* ExceptionSnapshotFuchsia::Context() const {
FILE: snapshot/fuchsia/exception_snapshot_fuchsia.h
function namespace (line 27) | namespace crashpad {
FILE: snapshot/fuchsia/memory_map_fuchsia.cc
type crashpad (line 20) | namespace crashpad {
FILE: snapshot/fuchsia/memory_map_fuchsia.h
function namespace (line 25) | namespace crashpad {
FILE: snapshot/fuchsia/memory_map_region_snapshot_fuchsia.cc
type crashpad (line 21) | namespace crashpad {
type internal (line 22) | namespace internal {
function MmuFlagsToProtectFlags (line 27) | uint32_t MmuFlagsToProtectFlags(zx_vm_option_t flags) {
function MINIDUMP_MEMORY_INFO (line 79) | const MINIDUMP_MEMORY_INFO&
FILE: snapshot/fuchsia/memory_map_region_snapshot_fuchsia.h
function namespace (line 22) | namespace crashpad {
FILE: snapshot/fuchsia/process_reader_fuchsia.cc
type crashpad (line 27) | namespace crashpad {
function GetStackRegions (line 36) | void GetStackRegions(
function MemoryMapFuchsia (line 152) | const MemoryMapFuchsia* ProcessReaderFuchsia::MemoryMap() {
FILE: snapshot/fuchsia/process_reader_fuchsia.h
function namespace (line 33) | namespace crashpad {
function ProcessMemory (line 119) | const ProcessMemory* Memory() const { return process_memory_.get(); }
FILE: snapshot/fuchsia/process_reader_fuchsia_test.cc
type crashpad (line 32) | namespace crashpad {
type test (line 33) | namespace test {
function TEST (line 36) | TEST(ProcessReaderFuchsia, SelfBasic) {
function CRASHPAD_CHILD_TEST_MAIN (line 87) | CRASHPAD_CHILD_TEST_MAIN(ProcessReaderBasicChildTestMain) {
class BasicChildTest (line 95) | class BasicChildTest : public MultiprocessExec {
method BasicChildTest (line 97) | BasicChildTest() : MultiprocessExec() {
method BasicChildTest (line 101) | BasicChildTest(const BasicChildTest&) = delete;
method BasicChildTest (line 102) | BasicChildTest& operator=(const BasicChildTest&) = delete;
method MultiprocessParent (line 107) | void MultiprocessParent() override {
function TEST (line 120) | TEST(ProcessReaderFuchsia, ChildBasic) {
type ThreadData (line 125) | struct ThreadData {
function CRASHPAD_CHILD_TEST_MAIN (line 140) | CRASHPAD_CHILD_TEST_MAIN(ProcessReaderChildThreadsTestMain) {
class ThreadsChildTest (line 178) | class ThreadsChildTest : public MultiprocessExec {
method ThreadsChildTest (line 180) | ThreadsChildTest() : MultiprocessExec() {
method ThreadsChildTest (line 184) | ThreadsChildTest(const ThreadsChildTest&) = delete;
method ThreadsChildTest (line 185) | ThreadsChildTest& operator=(const ThreadsChildTest&) = delete;
method MultiprocessParent (line 190) | void MultiprocessParent() override {
function TEST (line 218) | TEST(ProcessReaderFuchsia, DISABLED_ChildThreads) {
FILE: snapshot/fuchsia/process_snapshot_fuchsia.cc
type crashpad (line 20) | namespace crashpad {
function SystemSnapshot (line 156) | const SystemSnapshot* ProcessSnapshotFuchsia::System() const {
function ExceptionSnapshot (line 186) | const ExceptionSnapshot* ProcessSnapshotFuchsia::Exception() const {
function ProcessMemory (line 211) | const ProcessMemory* ProcessSnapshotFuchsia::Memory() const {
FILE: snapshot/fuchsia/process_snapshot_fuchsia.h
function namespace (line 40) | namespace crashpad {
FILE: snapshot/fuchsia/process_snapshot_fuchsia_test.cc
type crashpad (line 31) | namespace crashpad {
type test (line 32) | namespace test {
function CRASHPAD_CHILD_TEST_MAIN (line 54) | CRASHPAD_CHILD_TEST_MAIN(AddressSpaceChildTestMain) {
function HasSingleMatchingMapping (line 78) | bool HasSingleMatchingMapping(
class AddressSpaceTest (line 102) | class AddressSpaceTest : public MultiprocessExec {
method AddressSpaceTest (line 104) | AddressSpaceTest() : MultiprocessExec() {
method AddressSpaceTest (line 108) | AddressSpaceTest(const AddressSpaceTest&) = delete;
method AddressSpaceTest (line 109) | AddressSpaceTest& operator=(const AddressSpaceTest&) = delete;
method MultiprocessParent (line 114) | void MultiprocessParent() override {
function TEST (line 141) | TEST(ProcessSnapshotFuchsiaTest, AddressSpaceMapping) {
function CRASHPAD_CHILD_TEST_MAIN (line 146) | CRASHPAD_CHILD_TEST_MAIN(StackPointerIntoInvalidLocation) {
class InvalidStackPointerTest (line 170) | class InvalidStackPointerTest : public MultiprocessExec {
method InvalidStackPointerTest (line 172) | InvalidStackPointerTest() : MultiprocessExec() {
method InvalidStackPointerTest (line 178) | InvalidStackPointerTest(const InvalidStackPointerTest&) = delete;
method InvalidStackPointerTest (line 179) | InvalidStackPointerTest& operator=(const InvalidStackPointerTest&)...
method MultiprocessParent (line 184) | void MultiprocessParent() override {
function TEST (line 233) | TEST(ProcessSnapshotFuchsiaTest, InvalidStackPointer) {
FILE: snapshot/fuchsia/system_snapshot_fuchsia.cc
type crashpad (line 26) | namespace crashpad {
type internal (line 27) | namespace internal {
function CPUArchitecture (line 59) | CPUArchitecture SystemSnapshotFuchsia::GetCPUArchitecture() const {
FILE: snapshot/fuchsia/system_snapshot_fuchsia.h
function namespace (line 28) | namespace crashpad {
FILE: snapshot/fuchsia/thread_snapshot_fuchsia.cc
type crashpad (line 20) | namespace crashpad {
type internal (line 21) | namespace internal {
function CPUContext (line 76) | const CPUContext* ThreadSnapshotFuchsia::Context() const {
function MemorySnapshot (line 81) | const MemorySnapshot* ThreadSnapshotFuchsia::Stack() const {
FILE: snapshot/fuchsia/thread_snapshot_fuchsia.h
function namespace (line 31) | namespace crashpad {
FILE: snapshot/handle_snapshot.cc
type crashpad (line 17) | namespace crashpad {
FILE: snapshot/handle_snapshot.h
function namespace (line 22) | namespace crashpad {
FILE: snapshot/hash_types_test.cc
function main (line 15) | int main() {
FILE: snapshot/ios/exception_snapshot_ios_intermediate_dump.cc
type crashpad (line 28) | namespace crashpad {
type internal (line 30) | namespace internal {
function ThreadStateLengthForFlavor (line 32) | size_t ThreadStateLengthForFlavor(thread_state_flavor_t flavor) {
function CPUContext (line 278) | const CPUContext* ExceptionSnapshotIOSIntermediateDump::Context() co...
FILE: snapshot/ios/exception_snapshot_ios_intermediate_dump.h
function namespace (line 30) | namespace crashpad {
FILE: snapshot/ios/intermediate_dump_reader_util.cc
type crashpad (line 22) | namespace crashpad {
type internal (line 23) | namespace internal {
function IOSIntermediateDumpData (line 37) | const IOSIntermediateDumpData* GetDataFromMap(
function IOSIntermediateDumpMap (line 52) | const IOSIntermediateDumpMap* GetMapFromMap(const IOSIntermediateDum...
function IOSIntermediateDumpList (line 63) | const IOSIntermediateDumpList* GetListFromMap(const IOSIntermediateD...
function GetDataStringFromMap (line 74) | bool GetDataStringFromMap(const IOSIntermediateDumpMap* map,
function GetDataValueFromMapErrorInternal (line 88) | void GetDataValueFromMapErrorInternal(const IntermediateDumpKey& key) {
FILE: snapshot/ios/intermediate_dump_reader_util.h
function namespace (line 23) | namespace crashpad {
FILE: snapshot/ios/memory_snapshot_ios_intermediate_dump.cc
type crashpad (line 19) | namespace crashpad {
type internal (line 20) | namespace internal {
function MemorySnapshot (line 53) | const MemorySnapshot* MemorySnapshotIOSIntermediateDump::MergeWithOt...
FILE: snapshot/ios/memory_snapshot_ios_intermediate_dump.h
function namespace (line 25) | namespace crashpad {
FILE: snapshot/ios/memory_snapshot_ios_intermediate_dump_test.cc
type crashpad (line 22) | namespace crashpad {
type test (line 23) | namespace test {
class ReadToString (line 30) | class ReadToString : public crashpad::MemorySnapshot::Delegate {
method MemorySnapshotDelegateRead (line 36) | bool MemorySnapshotDelegateRead(void* data, size_t size) override {
function CreateMemorySnapshot (line 44) | std::unique_ptr<MemorySnapshotIOSIntermediateDump> CreateMemorySnaps...
function TEST (line 53) | TEST(MemorySnapshotIOSIntermediateDumpTest, MergeSame) {
function TEST (line 65) | TEST(MemorySnapshotIOSIntermediateDumpTest, MergeNoOverlap) {
function TEST (line 81) | TEST(MemorySnapshotIOSIntermediateDumpTest, MergePartial) {
function TEST (line 97) | TEST(MemorySnapshotIOSIntermediateDumpTest, NoMerge) {
function TEST (line 109) | TEST(MemorySnapshotIOSIntermediateDumpTest, EnvelopeBiggerFirst) {
function TEST (line 126) | TEST(MemorySnapshotIOSIntermediateDumpTest, EnvelopeBiggerSecond) {
function TEST (line 143) | TEST(MemorySnapshotIOSIntermediateDumpTest, SmallerAddressSecond) {
FILE: snapshot/ios/module_snapshot_ios_intermediate_dump.cc
type crashpad (line 29) | namespace crashpad {
type internal (line 30) | namespace internal {
function time_t (line 233) | time_t ModuleSnapshotIOSIntermediateDump::Timestamp() const {
FILE: snapshot/ios/module_snapshot_ios_intermediate_dump.h
function namespace (line 31) | namespace crashpad {
FILE: snapshot/ios/process_snapshot_ios_intermediate_dump.cc
function MachTimeValueToTimeval (line 27) | void MachTimeValueToTimeval(const time_value& mach, timeval* tv) {
type crashpad (line 34) | namespace crashpad {
type internal (line 35) | namespace internal {
function pid_t (line 196) | pid_t ProcessSnapshotIOSIntermediateDump::ProcessID() const {
function pid_t (line 201) | pid_t ProcessSnapshotIOSIntermediateDump::ParentProcessID() const {
function SystemSnapshot (line 256) | const SystemSnapshot* ProcessSnapshotIOSIntermediateDump::System() c...
function ExceptionSnapshot (line 287) | const ExceptionSnapshot* ProcessSnapshotIOSIntermediateDump::Excepti...
function ProcessMemory (line 328) | const ProcessMemory* ProcessSnapshotIOSIntermediateDump::Memory() co...
FILE: snapshot/ios/process_snapshot_ios_intermediate_dump.h
function namespace (line 33) | namespace crashpad {
FILE: snapshot/ios/process_snapshot_ios_intermediate_dump_test.cc
type crashpad (line 35) | namespace crashpad {
type test (line 36) | namespace test {
class ReadToString (line 43) | class ReadToString : public crashpad::MemorySnapshot::Delegate {
method MemorySnapshotDelegateRead (line 47) | bool MemorySnapshotDelegateRead(void* data, size_t size) override {
class ProcessSnapshotIOSIntermediateDumpTest (line 53) | class ProcessSnapshotIOSIntermediateDumpTest : public testing::Test {
method ProcessSnapshotIOSIntermediateDumpTest (line 55) | ProcessSnapshotIOSIntermediateDumpTest()
method SetUp (line 59) | void SetUp() override {
method TearDown (line 66) | void TearDown() override {
method writer (line 74) | auto writer() const { return writer_.get(); }
method DumpSnapshot (line 76) | bool DumpSnapshot(const ProcessSnapshotIOSIntermediateDump& snapsh...
method WriteProcessInfo (line 83) | void WriteProcessInfo(IOSIntermediateDumpWriter* writer) {
method WriteSystemInfo (line 111) | void WriteSystemInfo(IOSIntermediateDumpWriter* writer) {
method WriteAnnotations (line 169) | void WriteAnnotations(IOSIntermediateDumpWriter* writer,
method WriteModules (line 216) | void WriteModules(IOSIntermediateDumpWriter* writer,
method ExpectModules (line 263) | void ExpectModules(const std::vector<const ModuleSnapshot*>& modules,
method WriteMachException (line 317) | void WriteMachException(IOSIntermediateDumpWriter* writer,
method WriteThreads (line 353) | void WriteThreads(IOSIntermediateDumpWriter* writer) {
method ExpectMachException (line 404) | void ExpectMachException(const ExceptionSnapshot& exception) {
method ExpectThreads (line 416) | void ExpectThreads(const std::vector<const ThreadSnapshot*>& threa...
method ExpectSystem (line 438) | void ExpectSystem(const SystemSnapshot& system) {
method ExpectSnapshot (line 470) | void ExpectSnapshot(const ProcessSnapshot& snapshot,
method CloseWriter (line 503) | void CloseWriter() { EXPECT_TRUE(writer_->Close()); }
function TEST_F (line 514) | TEST_F(ProcessSnapshotIOSIntermediateDumpTest, InitializeNoFile) {
function TEST_F (line 522) | TEST_F(ProcessSnapshotIOSIntermediateDumpTest, InitializeEmpty) {
function TEST_F (line 528) | TEST_F(ProcessSnapshotIOSIntermediateDumpTest, InitializeMinimumDump) {
function TEST_F (line 543) | TEST_F(ProcessSnapshotIOSIntermediateDumpTest, MissingSystemDump) {
function TEST_F (line 556) | TEST_F(ProcessSnapshotIOSIntermediateDumpTest, MissingProcessDump) {
function TEST_F (line 569) | TEST_F(ProcessSnapshotIOSIntermediateDumpTest, EmptySignalDump) {
function TEST_F (line 614) | TEST_F(ProcessSnapshotIOSIntermediateDumpTest, EmptyMachDump) {
function TEST_F (line 641) | TEST_F(ProcessSnapshotIOSIntermediateDumpTest, EmptyExceptionDump) {
function TEST_F (line 668) | TEST_F(ProcessSnapshotIOSIntermediateDumpTest, EmptyUncaughtNSExcept...
function TEST_F (line 699) | TEST_F(ProcessSnapshotIOSIntermediateDumpTest, ShortContext) {
function TEST_F (line 722) | TEST_F(ProcessSnapshotIOSIntermediateDumpTest, LongAnnotations) {
function TEST_F (line 744) | TEST_F(ProcessSnapshotIOSIntermediateDumpTest, FullReport) {
function TEST_F (line 766) | TEST_F(ProcessSnapshotIOSIntermediateDumpTest, FuzzTestCases) {
function TEST_F (line 796) | TEST_F(ProcessSnapshotIOSIntermediateDumpTest, WriteNoThreads) {
FILE: snapshot/ios/system_snapshot_ios_intermediate_dump.cc
type crashpad (line 26) | namespace crashpad {
type internal (line 28) | namespace internal {
function CPUArchitecture (line 117) | CPUArchitecture SystemSnapshotIOSIntermediateDump::GetCPUArchitectur...
FILE: snapshot/ios/system_snapshot_ios_intermediate_dump.h
function namespace (line 26) | namespace crashpad {
FILE: snapshot/ios/thread_snapshot_ios_intermediate_dump.cc
function GenerateStackMemoryFromFrames (line 28) | std::vector<uint8_t> GenerateStackMemoryFromFrames(const uint64_t* frames,
type crashpad (line 64) | namespace crashpad {
type internal (line 65) | namespace internal {
function CPUContext (line 208) | const CPUContext* ThreadSnapshotIOSIntermediateDump::Context() const {
function MemorySnapshot (line 213) | const MemorySnapshot* ThreadSnapshotIOSIntermediateDump::Stack() const {
FILE: snapshot/ios/thread_snapshot_ios_intermediate_dump.h
function namespace (line 27) | namespace crashpad {
FILE: snapshot/linux/capture_memory_delegate_linux.cc
type crashpad (line 22) | namespace crashpad {
type internal (line 23) | namespace internal {
FILE: snapshot/linux/capture_memory_delegate_linux.h
function namespace (line 28) | namespace crashpad {
FILE: snapshot/linux/cpu_context_linux.cc
type crashpad (line 24) | namespace crashpad {
type internal (line 25) | namespace internal {
function InitializeCPUContextX86 (line 49) | void InitializeCPUContextX86(const ThreadContext::t32_t& thread_cont...
function InitializeCPUContextX86 (line 69) | void InitializeCPUContextX86(const SignalThreadContext32& thread_con...
function InitializeCPUContextX86_NoFloatingPoint (line 76) | void InitializeCPUContextX86_NoFloatingPoint(
function InitializeCPUContextX86_64 (line 118) | void InitializeCPUContextX86_64(const ThreadContext::t64_t& thread_c...
function InitializeCPUContextX86_64 (line 138) | void InitializeCPUContextX86_64(const SignalThreadContext64& thread_...
function InitializeCPUContextX86_64_NoFloatingPoint (line 158) | void InitializeCPUContextX86_64_NoFloatingPoint(
function InitializeCPUContextARM (line 177) | void InitializeCPUContextARM(const ThreadContext::t32_t& thread_cont...
function InitializeCPUContextARM_NoFloatingPoint (line 206) | void InitializeCPUContextARM_NoFloatingPoint(
function InitializeCPUContextARM64 (line 225) | void InitializeCPUContextARM64(const ThreadContext::t64_t& thread_co...
function InitializeCPUContextARM64_NoFloatingPoint (line 237) | void InitializeCPUContextARM64_NoFloatingPoint(
function InitializeCPUContextARM64_OnlyFPSIMD (line 259) | void InitializeCPUContextARM64_OnlyFPSIMD(
function InitializeCPUContextRISCV64 (line 271) | void InitializeCPUContextRISCV64(const ThreadContext::t64_t& thread_...
FILE: snapshot/linux/cpu_context_linux.h
function namespace (line 23) | namespace crashpad {
FILE: snapshot/linux/debug_rendezvous.cc
type crashpad (line 28) | namespace crashpad {
type Traits32 (line 32) | struct Traits32 {
type Traits64 (line 37) | struct Traits64 {
type DebugRendezvousSpecific (line 43) | struct DebugRendezvousSpecific {
type LinkEntrySpecific (line 52) | struct LinkEntrySpecific {
function ReadLinkEntry (line 61) | bool ReadLinkEntry(const ProcessMemoryRange& memory,
FILE: snapshot/linux/debug_rendezvous.h
function namespace (line 25) | namespace crashpad {
FILE: snapshot/linux/debug_rendezvous_test.cc
type crashpad (line 47) | namespace crashpad {
type test (line 48) | namespace test {
function ExpectLoadBias (line 51) | void ExpectLoadBias(bool is_64_bit,
function TestAgainstTarget (line 65) | void TestAgainstTarget(PtraceConnection* connection) {
function TEST (line 227) | TEST(DebugRendezvous, Self) {
class ChildTest (line 242) | class ChildTest : public Multiprocess {
method ChildTest (line 244) | ChildTest() {}
method ChildTest (line 246) | ChildTest(const ChildTest&) = delete;
method ChildTest (line 247) | ChildTest& operator=(const ChildTest&) = delete;
method MultiprocessParent (line 252) | void MultiprocessParent() {
method MultiprocessChild (line 259) | void MultiprocessChild() { CheckedReadFileAtEOF(ReadPipeHandle()); }
function TEST (line 262) | TEST(DebugRendezvous, Child) {
FILE: snapshot/linux/exception_snapshot_linux.cc
type crashpad (line 29) | namespace crashpad {
type internal (line 30) | namespace internal {
function ReadContext (line 276) | static bool ReadContext(ProcessReaderLinux* reader,
function ReadContext (line 330) | static bool ReadContext(ProcessReaderLinux* reader,
function CPUContext (line 503) | const CPUContext* ExceptionSnapshotLinux::Context() const {
FILE: snapshot/linux/exception_snapshot_linux.h
function namespace (line 32) | namespace crashpad {
FILE: snapshot/linux/exception_snapshot_linux_test.cc
type crashpad (line 41) | namespace crashpad {
type test (line 42) | namespace test {
function pid_t (line 45) | pid_t gettid() {
type FxsaveUContext (line 50) | struct FxsaveUContext {
function InitializeContext (line 56) | void InitializeContext(NativeCPUContext* context) {
function ExpectContext (line 67) | void ExpectContext(const CPUContext& actual, const NativeCPUContext&...
function InitializeContext (line 82) | void InitializeContext(NativeCPUContext* context) {
function ExpectContext (line 88) | void ExpectContext(const CPUContext& actual, const NativeCPUContext&...
type NativeCPUContext (line 106) | struct NativeCPUContext {
type CrunchContext (line 111) | struct CrunchContext {
type IWMMXTContext (line 117) | struct IWMMXTContext {
type TestCoprocessorContext (line 121) | struct TestCoprocessorContext {
function InitializeContext (line 141) | void InitializeContext(NativeCPUContext* context) {
function ExpectContext (line 185) | void ExpectContext(const CPUContext& actual, const NativeCPUContext&...
type TestCoprocessorContext (line 214) | struct TestCoprocessorContext {
function InitializeContext (line 220) | void InitializeContext(NativeCPUContext* context) {
function ExpectContext (line 250) | void ExpectContext(const CPUContext& actual, const NativeCPUContext&...
function InitializeContext (line 274) | void InitializeContext(NativeCPUContext* context) {
function ExpectContext (line 281) | void ExpectContext(const CPUContext& actual, const NativeCPUContext&...
function InitializeContext (line 304) | void InitializeContext(NativeCPUContext* context) {
function ExpectContext (line 314) | void ExpectContext(const CPUContext& actual, const NativeCPUContext&...
function TEST (line 333) | TEST(ExceptionSnapshotLinux, SelfBasic) {
class ScopedSigactionRestore (line 362) | class ScopedSigactionRestore {
method ScopedSigactionRestore (line 364) | ScopedSigactionRestore() : old_action_(), signo_(-1), valid_(false...
method ScopedSigactionRestore (line 366) | ScopedSigactionRestore(const ScopedSigactionRestore&) = delete;
method ScopedSigactionRestore (line 367) | ScopedSigactionRestore& operator=(const ScopedSigactionRestore&) =...
method Reset (line 371) | bool Reset() {
method ResetInstallHandler (line 384) | bool ResetInstallHandler(int signo, Signals::Handler handler) {
type sigaction (line 394) | struct sigaction
class RaiseTest (line 399) | class RaiseTest {
method RaiseTest (line 401) | RaiseTest() = delete;
method RaiseTest (line 402) | RaiseTest(const RaiseTest&) = delete;
method RaiseTest (line 403) | RaiseTest& operator=(const RaiseTest&) = delete;
method Run (line 405) | static void Run() {
method HandleRaisedSignal (line 416) | static void HandleRaisedSignal(int signo, siginfo_t* siginfo, void...
function TEST (line 448) | TEST(ExceptionSnapshotLinux, Raise) {
class TimerTest (line 452) | class TimerTest {
method TimerTest (line 454) | TimerTest() : event_(), timer_(-1), test_complete_(false) { test_ ...
method TimerTest (line 456) | TimerTest(const TimerTest&) = delete;
method TimerTest (line 457) | TimerTest& operator=(const TimerTest&) = delete;
method Run (line 461) | void Run() {
method HandleTimer (line 488) | static void HandleTimer(int signo, siginfo_t* siginfo, void* conte...
function TEST (line 524) | TEST(ExceptionSnapshotLinux, SelfTimer) {
FILE: snapshot/linux/process_reader_linux.cc
type crashpad (line 37) | namespace crashpad {
function ShouldMergeStackMappings (line 41) | bool ShouldMergeStackMappings(const MemoryMap::Mapping& stack_mapping,
type abort_msg_t (line 327) | struct abort_msg_t {
type abort_msg_t<true> (line 333) | struct abort_msg_t<true> {
type magic_abort_msg_t (line 339) | struct magic_abort_msg_t {
FILE: snapshot/linux/process_reader_linux.h
function namespace (line 35) | namespace crashpad {
function ProcessMemoryLinux (line 127) | const ProcessMemoryLinux* Memory() const { return connection_->Memory(); }
function MemoryMap (line 130) | MemoryMap* GetMemoryMap() { return &memory_map_; }
FILE: snapshot/linux/process_reader_linux_test.cc
type crashpad (line 68) | namespace crashpad {
type test (line 69) | namespace test {
function pid_t (line 72) | pid_t gettid() {
function TEST (line 76) | TEST(ProcessReaderLinux, SelfBasic) {
class BasicChildTest (line 105) | class BasicChildTest : public Multiprocess {
method BasicChildTest (line 107) | BasicChildTest() : Multiprocess() {}
method BasicChildTest (line 109) | BasicChildTest(const BasicChildTest&) = delete;
method BasicChildTest (line 110) | BasicChildTest& operator=(const BasicChildTest&) = delete;
method MultiprocessParent (line 115) | void MultiprocessParent() override {
method MultiprocessChild (line 137) | void MultiprocessChild() override { CheckedReadFileAtEOF(ReadPipeH...
function TEST (line 140) | TEST(ProcessReaderLinux, ChildBasic) {
class TestThreadPool (line 145) | class TestThreadPool {
type ThreadExpectation (line 147) | struct ThreadExpectation {
method TestThreadPool (line 156) | TestThreadPool() : threads_() {}
method TestThreadPool (line 158) | TestThreadPool(const TestThreadPool&) = delete;
method TestThreadPool (line 159) | TestThreadPool& operator=(const TestThreadPool&) = delete;
method StartThreads (line 172) | void StartThreads(size_t thread_count, size_t stack_size = 0) {
method pid_t (line 224) | pid_t GetThreadExpectation(size_t thread_index,
type Thread (line 236) | struct Thread {
method Thread (line 237) | explicit Thread(const std::string& name)
function ExpectThreads (line 282) | void ExpectThreads(const ThreadMap& thread_map,
class ChildThreadTest (line 337) | class ChildThreadTest : public Multiprocess {
method ChildThreadTest (line 339) | ChildThreadTest(size_t stack_size = 0)
method ChildThreadTest (line 342) | ChildThreadTest(const ChildThreadTest&) = delete;
method ChildThreadTest (line 343) | ChildThreadTest& operator=(const ChildThreadTest&) = delete;
method MultiprocessParent (line 348) | void MultiprocessParent() override {
method MultiprocessChild (line 380) | void MultiprocessChild() override {
function TEST (line 444) | TEST(ProcessReaderLinux, ChildWithThreads) {
function TEST (line 449) | TEST(ProcessReaderLinux, ChildThreadsWithSmallUserStacks) {
class ChildWithSplitStackTest (line 455) | class ChildWithSplitStackTest : public Multiprocess {
method ChildWithSplitStackTest (line 457) | ChildWithSplitStackTest() : Multiprocess(), page_size_(getpagesize...
method ChildWithSplitStackTest (line 459) | ChildWithSplitStackTest(const ChildWithSplitStackTest&) = delete;
method ChildWithSplitStackTest (line 460) | ChildWithSplitStackTest& operator=(const ChildWithSplitStackTest&)...
method MultiprocessParent (line 465) | void MultiprocessParent() override {
method MultiprocessChild (line 496) | void MultiprocessChild() override {
method GrowStack (line 501) | void GrowStack(LinuxVMSize stack_size, LinuxVMAddress bottom_of_st...
function TEST (line 543) | TEST(ProcessReaderLinux, MAYBE_ChildWithSplitStack) {
function ExpectFindModule (line 550) | int ExpectFindModule(dl_phdr_info* info, size_t size, void* data) {
function ExpectModulesFromSelf (line 590) | void ExpectModulesFromSelf(
function ExpectTestModule (line 609) | void ExpectTestModule(ProcessReaderLinux* reader,
function TEST (line 629) | TEST(ProcessReaderLinux, SelfModules) {
class ChildModuleTest (line 650) | class ChildModuleTest : public Multiprocess {
method ChildModuleTest (line 652) | ChildModuleTest() : Multiprocess(), module_soname_("test_module_so...
method ChildModuleTest (line 654) | ChildModuleTest(const ChildModuleTest&) = delete;
method ChildModuleTest (line 655) | ChildModuleTest& operator=(const ChildModuleTest&) = delete;
method MultiprocessParent (line 660) | void MultiprocessParent() override {
method MultiprocessChild (line 676) | void MultiprocessChild() override {
function TEST (line 692) | TEST(ProcessReaderLinux, ChildModules) {
function TEST (line 700) | TEST(ProcessReaderLinux, AbortMessage) {
FILE: snapshot/linux/process_snapshot_linux.cc
type crashpad (line 23) | namespace crashpad {
function pid_t (line 55) | pid_t ProcessSnapshotLinux::FindThreadWithStackAddress(
function SystemSnapshot (line 218) | const SystemSnapshot* ProcessSnapshotLinux::System() const {
function ExceptionSnapshot (line 248) | const ExceptionSnapshot* ProcessSnapshotLinux::Exception() const {
function ProcessMemory (line 270) | const ProcessMemory* ProcessSnapshotLinux::Memory() const {
FILE: snapshot/linux/process_snapshot_linux.h
function namespace (line 44) | namespace crashpad {
FILE: snapshot/linux/signal_context.h
function namespace (line 30) | namespace crashpad {
FILE: snapshot/linux/system_snapshot_linux.cc
type crashpad (line 41) | namespace crashpad {
type internal (line 42) | namespace internal {
function ReadCPUsOnline (line 46) | bool ReadCPUsOnline(uint32_t* first_cpu, uint8_t* cpu_count) {
function ReadFreqFile (line 102) | bool ReadFreqFile(const std::string& filename, uint64_t* hz) {
type ReadPropertyData (line 124) | struct ReadPropertyData {
function ReadPropertyCallback (line 129) | void ReadPropertyCallback(void* cookie,
function ReadProperty (line 138) | bool ReadProperty(const char* property, std::string* value) {
function CPUArchitecture (line 219) | CPUArchitecture SystemSnapshotLinux::GetCPUArchitecture() const {
FILE: snapshot/linux/system_snapshot_linux.h
function namespace (line 32) | namespace crashpad {
FILE: snapshot/linux/system_snapshot_linux_test.cc
type crashpad (line 28) | namespace crashpad {
type test (line 29) | namespace test {
function TEST (line 32) | TEST(SystemSnapshotLinux, Basic) {
FILE: snapshot/linux/test_modules.cc
type crashpad (line 29) | namespace crashpad {
type test (line 30) | namespace test {
function WriteTestModule (line 32) | bool WriteTestModule(const base::FilePath& module_path,
function ScopedModuleHandle (line 248) | ScopedModuleHandle LoadTestModule(const std::string& module_name,
FILE: snapshot/linux/test_modules.h
function namespace (line 22) | namespace crashpad {
FILE: snapshot/linux/thread_snapshot_linux.cc
type crashpad (line 24) | namespace crashpad {
type internal (line 25) | namespace internal {
function ComputeThreadPriority (line 29) | int ComputeThreadPriority(int static_priority,
function CPUContext (line 230) | const CPUContext* ThreadSnapshotLinux::Context() const {
function MemorySnapshot (line 235) | const MemorySnapshot* ThreadSnapshotLinux::Stack() const {
FILE: snapshot/linux/thread_snapshot_linux.h
function namespace (line 28) | namespace crashpad {
FILE: snapshot/mac/cpu_context_mac.cc
type crashpad (line 23) | namespace crashpad {
function InitializeCPUContextX86Thread (line 29) | void InitializeCPUContextX86Thread(
function InitializeCPUContextX86Float (line 50) | void InitializeCPUContextX86Float(
function InitializeCPUContextX86Debug (line 63) | void InitializeCPUContextX86Debug(
function thread_state_flavor_t (line 85) | thread_state_flavor_t InitializeCPUContextX86Flavor(
function InitializeCPUContextX86_64Thread (line 204) | void InitializeCPUContextX86_64Thread(
function InitializeCPUContextX86_64Float (line 229) | void InitializeCPUContextX86_64Float(
function InitializeCPUContextX86_64Debug (line 243) | void InitializeCPUContextX86_64Debug(
function thread_state_flavor_t (line 265) | thread_state_flavor_t InitializeCPUContextX86_64Flavor(
type internal (line 386) | namespace internal {
function InitializeCPUContextX86 (line 388) | void InitializeCPUContextX86(CPUContextX86* context,
function InitializeCPUContextX86_64 (line 412) | void InitializeCPUContextX86_64(CPUContextX86_64* context,
function InitializeCPUContextARM64 (line 563) | void InitializeCPUContextARM64(CPUContextARM64* context,
function InitializeCPUContextARM64Thread (line 442) | void InitializeCPUContextARM64Thread(
function InitializeCPUContextARM64Neon (line 458) | void InitializeCPUContextARM64Neon(CPUContextARM64* context,
function InitializeCPUContextARM64Debug (line 467) | void InitializeCPUContextARM64Debug(
function thread_state_flavor_t (line 473) | thread_state_flavor_t InitializeCPUContextARM64Flavor(
type internal (line 561) | namespace internal {
function InitializeCPUContextX86 (line 388) | void InitializeCPUContextX86(CPUContextX86* context,
function InitializeCPUContextX86_64 (line 412) | void InitializeCPUContextX86_64(CPUContextX86_64* context,
function InitializeCPUContextARM64 (line 563) | void InitializeCPUContextARM64(CPUContextARM64* context,
FILE: snapshot/mac/cpu_context_mac.h
function namespace (line 24) | namespace crashpad {
FILE: snapshot/mac/cpu_context_mac_test.cc
type crashpad (line 21) | namespace crashpad {
type test (line 22) | namespace test {
function TEST (line 27) | TEST(CPUContextMac, InitializeContextX86) {
function TEST (line 222) | TEST(CPUContextMac, InitializeContextX86_64) {
FILE: snapshot/mac/exception_snapshot_mac.cc
type crashpad (line 26) | namespace crashpad {
type internal (line 27) | namespace internal {
function CPUContext (line 227) | const CPUContext* ExceptionSnapshotMac::Context() const {
FILE: snapshot/mac/exception_snapshot_mac.h
function namespace (line 29) | namespace crashpad {
FILE: snapshot/mac/mach_o_image_annotations_reader.cc
type crashpad (line 31) | namespace crashpad {
FILE: snapshot/mac/mach_o_image_annotations_reader.h
function namespace (line 25) | namespace crashpad {
FILE: snapshot/mac/mach_o_image_annotations_reader_test.cc
type crashpad (line 48) | namespace crashpad {
type test (line 49) | namespace test {
function ModuleWithCrashyInitializer (line 53) | base::FilePath ModuleWithCrashyInitializer() {
function NoOpExecutable (line 60) | base::FilePath NoOpExecutable() {
class TestMachOImageAnnotationsReader (line 65) | class TestMachOImageAnnotationsReader final
type TestType (line 69) | enum TestType {
method TestMachOImageAnnotationsReader (line 99) | explicit TestMachOImageAnnotationsReader(TestType test_type)
method TestMachOImageAnnotationsReader (line 130) | TestMachOImageAnnotationsReader(const TestMachOImageAnnotationsRea...
method TestMachOImageAnnotationsReader (line 132) | TestMachOImageAnnotationsReader& operator=(
method kern_return_t (line 138) | kern_return_t CatchMachException(exception_behavior_t behavior,
method MachMultiprocessParent (line 286) | void MachMultiprocessParent() override {
method MachMultiprocessChild (line 367) | void MachMultiprocessChild() override {
function TEST (line 461) | TEST(MachOImageAnnotationsReader, DontCrash) {
function TEST (line 467) | TEST(MachOImageAnnotationsReader, CrashAbort) {
function TEST (line 473) | TEST(MachOImageAnnotationsReader, CrashModuleInitialization) {
function TEST (line 479) | TEST(MachOImageAnnotationsReader, CrashDyld) {
FILE: snapshot/mac/mach_o_image_annotations_reader_test_module_crashy_initializer.cc
type crashpad (line 15) | namespace crashpad {
type test (line 16) | namespace test {
class CrashyClass (line 19) | class CrashyClass {
method CrashyClass (line 21) | CrashyClass() {
FILE: snapshot/mac/mach_o_image_annotations_reader_test_no_op.cc
function main (line 17) | int main(int argc, char* argv[]) {
FILE: snapshot/mac/mach_o_image_reader.cc
type crashpad (line 41) | namespace crashpad {
function MachOImageSegmentReader (line 315) | const MachOImageSegmentReader* MachOImageReader::GetSegmentByName(
FILE: snapshot/mac/mach_o_image_reader.h
function namespace (line 31) | namespace crashpad {
FILE: snapshot/mac/mach_o_image_reader_test.cc
type crashpad (line 42) | namespace crashpad {
type test (line 43) | namespace test {
type nlist (line 64) | struct nlist
function ExpectSection (line 76) | void ExpectSection(const Section* expect_section,
function ExpectSegmentCommand (line 113) | void ExpectSegmentCommand(const SegmentCommand* expect_segment,
function ExpectSegmentCommands (line 231) | void ExpectSegmentCommands(const MachHeader* expect_image,
function ExpectMachImage (line 345) | void ExpectMachImage(const MachHeader* expect_image,
function ExpectSymbol (line 396) | void ExpectSymbol(const Nlist* entry,
function ExpectSymbolTable (line 442) | void ExpectSymbolTable(const MachHeader* expect_image,
function TEST (line 500) | TEST(MachOImageReader, Self_MainExecutable) {
function TEST (line 535) | TEST(MachOImageReader, Self_DyldImages) {
FILE: snapshot/mac/mach_o_image_segment_reader.cc
type crashpad (line 32) | namespace crashpad {
function SizeLimitedCString (line 36) | std::string SizeLimitedCString(const char* c_string, size_t max_length) {
function IsMalformedCLKernelsModule (line 42) | bool IsMalformedCLKernelsModule(uint32_t mach_o_file_type,
function mach_vm_address_t (line 206) | mach_vm_address_t MachOImageSegmentReader::Address() const {
function mach_vm_size_t (line 212) | mach_vm_size_t MachOImageSegmentReader::Size() const {
FILE: snapshot/mac/mach_o_image_segment_reader.h
function namespace (line 29) | namespace crashpad {
FILE: snapshot/mac/mach_o_image_segment_reader_test.cc
type crashpad (line 24) | namespace crashpad {
type test (line 25) | namespace test {
function TEST (line 37) | TEST(MachOImageSegmentReader, SegmentNameString) {
function TEST (line 75) | TEST(MachOImageSegmentReader, SectionNameString) {
function TEST (line 118) | TEST(MachOImageSegmentReader, SegmentAndSectionNameString) {
FILE: snapshot/mac/mach_o_image_symbol_table_reader.cc
type crashpad (line 29) | namespace crashpad {
type internal (line 31) | namespace internal {
class MachOImageSymbolTableReaderInitializer (line 40) | class MachOImageSymbolTableReaderInitializer {
method MachOImageSymbolTableReaderInitializer (line 42) | MachOImageSymbolTableReaderInitializer(
method MachOImageSymbolTableReaderInitializer (line 56) | MachOImageSymbolTableReaderInitializer(
method MachOImageSymbolTableReaderInitializer (line 58) | MachOImageSymbolTableReaderInitializer& operator=(
method Initialize (line 66) | bool Initialize(const process_types::symtab_command* symtab_command,
method mach_vm_address_t (line 207) | mach_vm_address_t AddressForLinkEditComponent(uint32_t fileoff) co...
method IsInLinkEditSegment (line 223) | bool IsInLinkEditSegment(mach_vm_address_t address,
FILE: snapshot/mac/mach_o_image_symbol_table_reader.h
function namespace (line 29) | namespace crashpad {
FILE: snapshot/mac/module_snapshot_mac.cc
type crashpad (line 27) | namespace crashpad {
type internal (line 28) | namespace internal {
function time_t (line 99) | time_t ModuleSnapshotMac::Timestamp() const {
FILE: snapshot/mac/module_snapshot_mac.h
function namespace (line 31) | namespace crashpad {
FILE: snapshot/mac/process_reader_mac.cc
function MachTimeValueToTimeval (line 36) | void MachTimeValueToTimeval(const time_value& mach, timeval* tv) {
function kern_return_t (line 41) | kern_return_t MachVMRegionRecurseDeepest(task_t task,
type crashpad (line 73) | namespace crashpad {
function mach_vm_address_t (line 209) | mach_vm_address_t ProcessReaderMac::DyldAllImageInfo(
function mach_vm_address_t (line 602) | mach_vm_address_t ProcessReaderMac::CalculateStackRegion(
FILE: snapshot/mac/process_reader_mac.h
function namespace (line 42) | namespace crashpad {
function ProcessMemoryMac (line 162) | const ProcessMemoryMac* Memory() const { return &process_memory_; }
FILE: snapshot/mac/process_reader_mac_test.cc
type crashpad (line 56) | namespace crashpad {
type test (line 57) | namespace test {
type PathAndAddressHash (line 67) | struct PathAndAddressHash {
function TEST (line 77) | TEST(ProcessReaderMac, SelfBasic) {
class ProcessReaderChild (line 101) | class ProcessReaderChild final : public MachMultiprocess {
method ProcessReaderChild (line 103) | ProcessReaderChild() : MachMultiprocess() {}
method ProcessReaderChild (line 105) | ProcessReaderChild(const ProcessReaderChild&) = delete;
method ProcessReaderChild (line 106) | ProcessReaderChild& operator=(const ProcessReaderChild&) = delete;
method MachMultiprocessParent (line 111) | void MachMultiprocessParent() override {
method MachMultiprocessChild (line 134) | void MachMultiprocessChild() override {
function TEST (line 146) | TEST(ProcessReaderMac, ChildBasic) {
function PthreadToThreadID (line 154) | uint64_t PthreadToThreadID(pthread_t pthread) {
function TEST (line 161) | TEST(ProcessReaderMac, SelfOneThread) {
class TestThreadPool (line 185) | class TestThreadPool {
type ThreadExpectation (line 187) | struct ThreadExpectation {
method TestThreadPool (line 198) | TestThreadPool(const std::string& thread_name_prefix)
method TestThreadPool (line 201) | TestThreadPool(const TestThreadPool&) = delete;
method TestThreadPool (line 202) | TestThreadPool& operator=(const TestThreadPool&) = delete;
method StartThreads (line 229) | void StartThreads(size_t thread_count) {
method GetThreadInfo (line 266) | uint64_t GetThreadInfo(size_t thread_index, ThreadExpectation* exp...
type ThreadInfo (line 279) | struct ThreadInfo {
method ThreadInfo (line 280) | ThreadInfo(const std::string& thread_name)
function ExpectSeveralThreads (line 356) | void ExpectSeveralThreads(ThreadMap* thread_map,
function TEST (line 434) | TEST(ProcessReaderMac, SelfSeveralThreads) {
function GetThreadID (line 489) | uint64_t GetThreadID() {
class ProcessReaderThreadedChild (line 501) | class ProcessReaderThreadedChild final : public MachMultiprocess {
method ProcessReaderThreadedChild (line 503) | explicit ProcessReaderThreadedChild(const std::string thread_name_...
method ProcessReaderThreadedChild (line 509) | ProcessReaderThreadedChild(const ProcessReaderThreadedChild&) = de...
method ProcessReaderThreadedChild (line 510) | ProcessReaderThreadedChild& operator=(const ProcessReaderThreadedC...
method MachMultiprocessParent (line 516) | void MachMultiprocessParent() override {
method MachMultiprocessChild (line 563) | void MachMultiprocessChild() override {
function TEST (line 637) | TEST(ProcessReaderMac, ChildOneThread) {
function TEST (line 645) | TEST(ProcessReaderMac, ChildSeveralThreads) {
function T (line 653) | T GetDyldFunction(const char* symbol) {
function VerifyImageExistence (line 675) | void VerifyImageExistence(const char* path) {
class ScopedOpenCLNoOpKernel (line 727) | class ScopedOpenCLNoOpKernel {
method ScopedOpenCLNoOpKernel (line 729) | ScopedOpenCLNoOpKernel()
method ScopedOpenCLNoOpKernel (line 735) | ScopedOpenCLNoOpKernel(const ScopedOpenCLNoOpKernel&) = delete;
method ScopedOpenCLNoOpKernel (line 736) | ScopedOpenCLNoOpKernel& operator=(const ScopedOpenCLNoOpKernel&) =...
method SetUp (line 755) | void SetUp() {
method success (line 829) | bool success() const { return success_; }
function ExpectCLKernels (line 841) | bool ExpectCLKernels() {
function ComparableModuleName (line 852) | std::string ComparableModuleName(const std::string& module_name,
function TEST (line 859) | TEST(ProcessReaderMac, SelfModules) {
class ProcessReaderModulesChild (line 925) | class ProcessReaderModulesChild final : public MachMultiprocess {
method ProcessReaderModulesChild (line 927) | explicit ProcessReaderModulesChild(bool ensure_cl_kernels_success)
method ProcessReaderModulesChild (line 931) | ProcessReaderModulesChild(const ProcessReaderModulesChild&) = delete;
method ProcessReaderModulesChild (line 932) | ProcessReaderModulesChild& operator=(const ProcessReaderModulesChi...
method MachMultiprocessParent (line 938) | void MachMultiprocessParent() override {
method MachMultiprocessChild (line 1007) | void MachMultiprocessChild() override {
function TEST (line 1062) | TEST(ProcessReaderMac, ChildModules) {
FILE: snapshot/mac/process_snapshot_mac.cc
type crashpad (line 22) | namespace crashpad {
function pid_t (line 129) | pid_t ProcessSnapshotMac::ProcessID() const {
function pid_t (line 134) | pid_t ProcessSnapshotMac::ParentProcessID() const {
function SystemSnapshot (line 171) | const SystemSnapshot* ProcessSnapshotMac::System() const {
function ExceptionSnapshot (line 200) | const ExceptionSnapshot* ProcessSnapshotMac::Exception() const {
function ProcessMemory (line 221) | const ProcessMemory* ProcessSnapshotMac::Memory() const {
FILE: snapshot/mac/process_snapshot_mac.h
function namespace (line 45) | namespace crashpad {
FILE: snapshot/mac/process_types.cc
type crashpad (line 27) | namespace crashpad {
function Assign (line 36) | inline void Assign(DestinationType* destination, const SourceType& sou...
function Assign (line 41) | inline void Assign(Type* destination, const Type& source) {
type internal (line 131) | namespace internal { \
FILE: snapshot/mac/process_types.h
function namespace (line 26) | namespace crashpad {
function Read (line 83) | bool Read(ProcessReaderMac* process_reader, mach_vm_address_t address) {...
function Read (line 186) | bool Read(ProcessReaderMac* process_reader, mach_vm_address_t address) { \
function Size (line 193) | static size_t Size() { return sizeof(struct_name<Traits>); }
FILE: snapshot/mac/process_types/custom.cc
type crashpad (line 35) | namespace crashpad {
type process_types (line 36) | namespace process_types {
type internal (line 37) | namespace internal {
function ReadIntoAndZero (line 42) | bool ReadIntoAndZero(const ProcessMemoryMac* process_memory,
function FieldAddressIfInRange (line 64) | bool FieldAddressIfInRange(mach_vm_address_t address,
function ReadIntoVersioned (line 81) | bool ReadIntoVersioned(ProcessReaderMac* process_reader,
function ReadIntoSized (line 101) | bool ReadIntoSized(ProcessReaderMac* process_reader,
FILE: snapshot/mac/process_types_test.cc
type crashpad (line 34) | namespace crashpad {
type test (line 35) | namespace test {
function TEST (line 48) | TEST(ProcessTypes, DyldImagesSelf) {
FILE: snapshot/mac/system_snapshot_mac.cc
type crashpad (line 37) | namespace crashpad {
function ReadIntSysctlByName_NoLog (line 42) | int ReadIntSysctlByName_NoLog(const char* name, T* value) {
function T (line 48) | T ReadIntSysctlByName(const char* name, T default_value) {
function T (line 59) | T CastIntSysctlByName(const char* name, T default_value) {
function CallCPUID (line 65) | void CallCPUID(uint32_t leaf,
type internal (line 78) | namespace internal {
function CPUArchitecture (line 134) | CPUArchitecture SystemSnapshotMac::GetCPUArchitecture() const {
FILE: snapshot/mac/system_snapshot_mac.h
function namespace (line 25) | namespace crashpad {
FILE: snapshot/mac/system_snapshot_mac_test.cc
type crashpad (line 28) | namespace crashpad {
type test (line 29) | namespace test {
class SystemSnapshotMacTest (line 37) | class SystemSnapshotMacTest : public testing::Test {
method SystemSnapshotMacTest (line 39) | SystemSnapshotMacTest()
method SystemSnapshotMacTest (line 46) | SystemSnapshotMacTest(const SystemSnapshotMacTest&) = delete;
method SystemSnapshotMacTest (line 47) | SystemSnapshotMacTest& operator=(const SystemSnapshotMacTest&) = d...
method SetUp (line 54) | void SetUp() override {
function TEST_F (line 67) | TEST_F(SystemSnapshotMacTest, GetCPUArchitecture) {
function TEST_F (line 81) | TEST_F(SystemSnapshotMacTest, CPUCount) {
function TEST_F (line 85) | TEST_F(SystemSnapshotMacTest, CPUVendor) {
function TEST_F (line 103) | TEST_F(SystemSnapshotMacTest, CPUX86SupportsDAZ) {
function TEST_F (line 110) | TEST_F(SystemSnapshotMacTest, GetOperatingSystem) {
function TEST_F (line 115) | TEST_F(SystemSnapshotMacTest, OSVersion) {
function TEST_F (line 129) | TEST_F(SystemSnapshotMacTest, OSVersionFull) {
function TEST_F (line 133) | TEST_F(SystemSnapshotMacTest, MachineDescription) {
function TEST_F (line 137) | TEST_F(SystemSnapshotMacTest, NXEnabled) {
FILE: snapshot/mac/thread_snapshot_mac.cc
type crashpad (line 21) | namespace crashpad {
type internal (line 22) | namespace internal {
function CPUContext (line 97) | const CPUContext* ThreadSnapshotMac::Context() const {
function MemorySnapshot (line 102) | const MemorySnapshot* ThreadSnapshotMac::Stack() const {
FILE: snapshot/mac/thread_snapshot_mac.h
function namespace (line 31) | namespace crashpad {
FILE: snapshot/memory_map_region_snapshot.h
function namespace (line 21) | namespace crashpad {
FILE: snapshot/memory_snapshot.cc
type crashpad (line 24) | namespace crashpad {
function DetermineMergedRangeImpl (line 27) | bool DetermineMergedRangeImpl(bool log,
function LoggingDetermineMergedRange (line 84) | bool LoggingDetermineMergedRange(const MemorySnapshot* a,
function DetermineMergedRange (line 90) | bool DetermineMergedRange(const MemorySnapshot* a,
FILE: snapshot/memory_snapshot.h
function virtual (line 55) | virtual ~MemorySnapshot() {}
FILE: snapshot/memory_snapshot_generic.h
function namespace (line 29) | namespace crashpad {
FILE: snapshot/memory_snapshot_test.cc
type crashpad (line 20) | namespace crashpad {
type test (line 21) | namespace test {
function TEST (line 24) | TEST(DetermineMergedRange, NonOverlapping) {
function TEST (line 39) | TEST(DetermineMergedRange, Empty) {
function TEST (line 54) | TEST(DetermineMergedRange, Abutting) {
function TEST (line 73) | TEST(DetermineMergedRange, TypicalOverlapping) {
function TEST (line 92) | TEST(DetermineMergedRange, OneFullyInsideAnother) {
function TEST (line 111) | TEST(DetermineMergedRange, SameStart) {
function TEST (line 130) | TEST(DetermineMergedRange, SameEnd) {
FILE: snapshot/minidump/exception_snapshot_minidump.cc
type crashpad (line 19) | namespace crashpad {
type internal (line 20) | namespace internal {
function CPUContext (line 74) | const CPUContext* ExceptionSnapshotMinidump::Context() const {
FILE: snapshot/
Condensed preview — 1179 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (7,784K chars).
[
{
"path": ".clang-format",
"chars": 674,
"preview": "# Copyright 2014 The Crashpad Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not "
},
{
"path": ".gitattributes",
"chars": 1384,
"preview": "# Copyright 2019 The Crashpad Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not "
},
{
"path": ".gitignore",
"chars": 1244,
"preview": "# Copyright 2014 The Crashpad Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not "
},
{
"path": ".gn",
"chars": 654,
"preview": "# Copyright 2017 The Crashpad Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not "
},
{
"path": ".style.yapf",
"chars": 617,
"preview": "# Copyright 2020 The Crashpad Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not "
},
{
"path": ".vpython3",
"chars": 1076,
"preview": "# Copyright 2022 The Crashpad Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not "
},
{
"path": "AUTHORS",
"chars": 475,
"preview": "# This is the official list of Crashpad authors for copyright purposes.\n# This file is distinct from the CONTRIBUTORS fi"
},
{
"path": "BUILD.gn",
"chars": 5409,
"preview": "# Copyright 2017 The Crashpad Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not "
},
{
"path": "CONTRIBUTORS",
"chars": 583,
"preview": "# People who have agreed to one of the CLAs and can contribute patches.\n# The AUTHORS file lists the copyright holders; "
},
{
"path": "DEPS",
"chars": 8094,
"preview": "# Copyright 2014 The Crashpad Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not "
},
{
"path": "LICENSE",
"chars": 11358,
"preview": "\n Apache License\n Version 2.0, January 2004\n "
},
{
"path": "OWNERS",
"chars": 703,
"preview": "# Copyright 2025 The Crashpad Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not "
},
{
"path": "README.md",
"chars": 1500,
"preview": "<!--\nCopyright 2015 The Crashpad Authors\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not us"
},
{
"path": "build/BUILD.gn",
"chars": 2478,
"preview": "# Copyright 2017 The Crashpad Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not "
},
{
"path": "build/BUILDCONFIG.gn",
"chars": 3068,
"preview": "# Copyright 2017 The Crashpad Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not "
},
{
"path": "build/config/fuchsia/gn_configs.gni",
"chars": 1325,
"preview": "# Copyright 2024 The Crashpad Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not "
},
{
"path": "build/crashpad_buildconfig.gni",
"chars": 5975,
"preview": "# Copyright 2017 The Crashpad Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not "
},
{
"path": "build/crashpad_fuzzer_test.gni",
"chars": 1933,
"preview": "# Copyright 2018 The Crashpad Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not "
},
{
"path": "build/fuchsia_envs.py",
"chars": 1640,
"preview": "#!/usr/bin/env python3\n\n# Copyright 2024 The Crashpad Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"L"
},
{
"path": "build/install_linux_sysroot.py",
"chars": 2152,
"preview": "#!/usr/bin/env python3\n\n# Copyright 2018 The Crashpad Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"L"
},
{
"path": "build/ios/Unittest-Info.plist",
"chars": 382,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "build/ios/convert_gn_xcodeproj.py",
"chars": 19568,
"preview": "#!/usr/bin/env python3\n\n# Copyright 2020 The Crashpad Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"L"
},
{
"path": "build/ios/setup_ios_gn.config",
"chars": 1259,
"preview": "# Copyright 2020 The Crashpad Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not "
},
{
"path": "build/ios/setup_ios_gn.py",
"chars": 15247,
"preview": "#!/usr/bin/env python3\n\n# Copyright 2020 The Crashpad Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"L"
},
{
"path": "build/ios/xcodescheme-testable.template",
"chars": 3051,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"1220\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "build/ios/xcodescheme.template",
"chars": 2935,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"1220\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "build/run_tests.py",
"chars": 20937,
"preview": "#!/usr/bin/env python3\n\n# Copyright 2014 The Crashpad Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"L"
},
{
"path": "build/test.gni",
"chars": 1666,
"preview": "# Copyright 2017 The Crashpad Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not "
},
{
"path": "client/BUILD.gn",
"chars": 6040,
"preview": "# Copyright 2015 The Crashpad Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not "
},
{
"path": "client/annotation.cc",
"chars": 1289,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/annotation.h",
"chars": 13191,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/annotation_list.cc",
"chars": 3764,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/annotation_list.h",
"chars": 4523,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/annotation_list_test.cc",
"chars": 10252,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/annotation_test.cc",
"chars": 7366,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/client_argv_handling.cc",
"chars": 2416,
"preview": "// Copyright 2018 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/client_argv_handling.h",
"chars": 1983,
"preview": "// Copyright 2018 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/crash_handler_base_ios.cc",
"chars": 4664,
"preview": "// Copyright 2025 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// foun"
},
{
"path": "client/crash_handler_base_ios.h",
"chars": 2855,
"preview": "// Copyright 2025 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// foun"
},
{
"path": "client/crash_handler_ios.cc",
"chars": 12267,
"preview": "// Copyright 2025 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// foun"
},
{
"path": "client/crash_handler_ios.h",
"chars": 3852,
"preview": "// Copyright 2025 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// foun"
},
{
"path": "client/crash_handler_tvos.cc",
"chars": 3298,
"preview": "// Copyright 2025 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// foun"
},
{
"path": "client/crash_handler_tvos.h",
"chars": 1189,
"preview": "// Copyright 2025 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// foun"
},
{
"path": "client/crash_report_database.cc",
"chars": 6512,
"preview": "// Copyright 2015 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/crash_report_database.h",
"chars": 19044,
"preview": "// Copyright 2015 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/crash_report_database_generic.cc",
"chars": 29544,
"preview": "// Copyright 2018 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/crash_report_database_mac.mm",
"chars": 30896,
"preview": "// Copyright 2015 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/crash_report_database_test.cc",
"chars": 37176,
"preview": "// Copyright 2015 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/crash_report_database_win.cc",
"chars": 35500,
"preview": "// Copyright 2015 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/crashpad_client.h",
"chars": 40662,
"preview": "// Copyright 2014 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/crashpad_client_fuchsia.cc",
"chars": 3658,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/crashpad_client_ios.cc",
"chars": 3522,
"preview": "// Copyright 2020 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/crashpad_client_ios_test.mm",
"chars": 5047,
"preview": "// Copyright 2020 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/crashpad_client_linux.cc",
"chars": 25677,
"preview": "// Copyright 2018 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/crashpad_client_linux_test.cc",
"chars": 25865,
"preview": "// Copyright 2018 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/crashpad_client_mac.cc",
"chars": 21436,
"preview": "// Copyright 2014 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/crashpad_client_win.cc",
"chars": 43745,
"preview": "// Copyright 2015 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/crashpad_client_win_test.cc",
"chars": 6354,
"preview": "// Copyright 2015 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/crashpad_info.cc",
"chars": 6891,
"preview": "// Copyright 2014 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/crashpad_info.h",
"chars": 14708,
"preview": "// Copyright 2014 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/crashpad_info_note.S",
"chars": 2713,
"preview": "// Copyright 2018 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/crashpad_info_test.cc",
"chars": 5326,
"preview": "// Copyright 2024 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/ios_handler/exception_processor.h",
"chars": 3864,
"preview": "// Copyright 2020 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/ios_handler/exception_processor.mm",
"chars": 24436,
"preview": "// Copyright 2020 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/ios_handler/exception_processor_test.mm",
"chars": 1571,
"preview": "// Copyright 2020 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/ios_handler/in_process_handler.cc",
"chars": 17897,
"preview": "// Copyright 2021 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/ios_handler/in_process_handler.h",
"chars": 13960,
"preview": "// Copyright 2021 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/ios_handler/in_process_handler_test.cc",
"chars": 4678,
"preview": "// Copyright 2021 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/ios_handler/in_process_intermediate_dump_handler.cc",
"chars": 55164,
"preview": "// Copyright 2021 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/ios_handler/in_process_intermediate_dump_handler.h",
"chars": 6752,
"preview": "// Copyright 2021 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/ios_handler/in_process_intermediate_dump_handler_test.cc",
"chars": 17258,
"preview": "// Copyright 2021 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/ios_handler/prune_intermediate_dumps_and_crash_reports_thread.cc",
"chars": 5131,
"preview": "// Copyright 2021 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/ios_handler/prune_intermediate_dumps_and_crash_reports_thread.h",
"chars": 4210,
"preview": "// Copyright 2021 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/length_delimited_ring_buffer.h",
"chars": 24697,
"preview": "// Copyright 2023 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/length_delimited_ring_buffer_test.cc",
"chars": 13293,
"preview": "// Copyright 2023 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/prune_crash_reports.cc",
"chars": 4378,
"preview": "// Copyright 2015 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/prune_crash_reports.h",
"chars": 5595,
"preview": "// Copyright 2015 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/prune_crash_reports_test.cc",
"chars": 8820,
"preview": "// Copyright 2015 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/pthread_create_linux.cc",
"chars": 1986,
"preview": "// Copyright 2020 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/ring_buffer_annotation.h",
"chars": 5492,
"preview": "// Copyright 2023 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/ring_buffer_annotation_load_test_main.cc",
"chars": 15850,
"preview": "// Copyright 2023 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/ring_buffer_annotation_test.cc",
"chars": 6119,
"preview": "// Copyright 2023 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/settings.cc",
"chars": 15558,
"preview": "// Copyright 2015 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/settings.h",
"chars": 11644,
"preview": "// Copyright 2015 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/settings_test.cc",
"chars": 5973,
"preview": "// Copyright 2015 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/simple_address_range_bag.h",
"chars": 6351,
"preview": "// Copyright 2016 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/simple_address_range_bag_test.cc",
"chars": 3704,
"preview": "// Copyright 2016 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/simple_string_dictionary.h",
"chars": 8635,
"preview": "// Copyright 2014 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/simple_string_dictionary_test.cc",
"chars": 9336,
"preview": "// Copyright 2014 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/simulate_crash.h",
"chars": 1132,
"preview": "// Copyright 2014 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/simulate_crash_ios.h",
"chars": 2611,
"preview": "// Copyright 2021 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/simulate_crash_linux.h",
"chars": 1328,
"preview": "// Copyright 2018 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/simulate_crash_mac.cc",
"chars": 10510,
"preview": "// Copyright 2014 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/simulate_crash_mac.h",
"chars": 2471,
"preview": "// Copyright 2014 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/simulate_crash_mac_test.cc",
"chars": 16009,
"preview": "// Copyright 2014 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/simulate_crash_win.h",
"chars": 1414,
"preview": "// Copyright 2015 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "client/upload_behavior_ios.h",
"chars": 1165,
"preview": "// Copyright 2022 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "codereview.settings",
"chars": 747,
"preview": "# Copyright 2014 The Crashpad Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not "
},
{
"path": "compat/BUILD.gn",
"chars": 3565,
"preview": "# Copyright 2015 The Crashpad Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not "
},
{
"path": "compat/android/dlfcn_internal.cc",
"chars": 3860,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/android/dlfcn_internal.h",
"chars": 1317,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/android/elf.h",
"chars": 1719,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/android/linux/elf.h",
"chars": 1133,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/android/linux/prctl.h",
"chars": 875,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/android/linux/ptrace.h",
"chars": 879,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/android/sched.h",
"chars": 891,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/android/sys/epoll.cc",
"chars": 1132,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/android/sys/epoll.h",
"chars": 1433,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/android/sys/mman.h",
"chars": 1465,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/android/sys/mman_mmap.cc",
"chars": 3205,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/android/sys/syscall.h",
"chars": 1215,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/android/sys/user.h",
"chars": 829,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/ios/mach/exc.defs",
"chars": 779,
"preview": "// Copyright 2020 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/ios/mach/mach_exc.defs",
"chars": 799,
"preview": "// Copyright 2020 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/ios/mach/mach_types.defs",
"chars": 807,
"preview": "// Copyright 2020 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/ios/mach/machine/machine_types.defs",
"chars": 851,
"preview": "// Copyright 2020 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/ios/mach/std_types.defs",
"chars": 803,
"preview": "// Copyright 2020 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/linux/signal.h",
"chars": 1758,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/linux/sys/mman.h",
"chars": 1208,
"preview": "// Copyright 2019 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/linux/sys/mman_memfd_create.cc",
"chars": 1118,
"preview": "// Copyright 2019 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/linux/sys/ptrace.h",
"chars": 2196,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/linux/sys/user.h",
"chars": 1277,
"preview": "// Copyright 2018 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/mac/Availability.h",
"chars": 1138,
"preview": "// Copyright 2020 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/mac/AvailabilityVersions.h",
"chars": 1706,
"preview": "// Copyright 2020 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/mac/kern/exc_resource.h",
"chars": 1810,
"preview": "// Copyright 2015 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/mac/mach/i386/thread_state.h",
"chars": 1006,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/mac/mach/mach.h",
"chars": 2841,
"preview": "// Copyright 2014 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/mac/mach-o/loader.h",
"chars": 938,
"preview": "// Copyright 2014 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/mac/sys/resource.h",
"chars": 846,
"preview": "// Copyright 2015 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/non_mac/mach/mach.h",
"chars": 1222,
"preview": "// Copyright 2014 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/non_mac/mach/machine.h",
"chars": 798,
"preview": "// Copyright 2019 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/non_mac/mach/vm_prot.h",
"chars": 770,
"preview": "// Copyright 2019 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/non_mac/mach-o/loader.h",
"chars": 810,
"preview": "// Copyright 2019 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/non_win/dbghelp.h",
"chars": 46112,
"preview": "// Copyright 2014 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/non_win/minwinbase.h",
"chars": 1532,
"preview": "// Copyright 2014 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/non_win/timezoneapi.h",
"chars": 2170,
"preview": "// Copyright 2014 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/non_win/verrsrc.h",
"chars": 5920,
"preview": "// Copyright 2014 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/non_win/windows.h",
"chars": 806,
"preview": "// Copyright 2015 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/non_win/winnt.h",
"chars": 8302,
"preview": "// Copyright 2014 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/win/getopt.h",
"chars": 756,
"preview": "// Copyright 2015 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/win/strings.cc",
"chars": 751,
"preview": "// Copyright 2015 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/win/strings.h",
"chars": 852,
"preview": "// Copyright 2015 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/win/sys/time.h",
"chars": 745,
"preview": "// Copyright 2015 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/win/sys/types.h",
"chars": 841,
"preview": "// Copyright 2014 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/win/time.cc",
"chars": 1129,
"preview": "// Copyright 2015 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/win/time.h",
"chars": 1117,
"preview": "// Copyright 2015 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/win/winbase.h",
"chars": 916,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/win/winnt.h",
"chars": 1683,
"preview": "// Copyright 2015 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "compat/win/winternl.h",
"chars": 839,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "doc/.gitignore",
"chars": 11,
"preview": "/generated\n"
},
{
"path": "doc/appengine/README",
"chars": 3075,
"preview": "This is the App Engine app that serves https://crashpad.chromium.org/.\n\nTo work on this app, obtain the following packag"
},
{
"path": "doc/appengine/go.mod",
"chars": 191,
"preview": "module src/crashpad-home\n\ngo 1.21.6\n\nrequire google.golang.org/appengine/v2 v2.0.5\n\nrequire (\n\tgithub.com/golang/protobu"
},
{
"path": "doc/appengine/go.sum",
"chars": 3619,
"preview": "github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5"
},
{
"path": "doc/appengine/src/crashpad-home/app.yaml",
"chars": 676,
"preview": "# Copyright 2015 The Crashpad Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not "
},
{
"path": "doc/appengine/src/crashpad-home/main.go",
"chars": 4961,
"preview": "// Copyright 2015 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "doc/developing.md",
"chars": 12253,
"preview": "<!--\nCopyright 2015 The Crashpad Authors\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not us"
},
{
"path": "doc/ios_overview_design.md",
"chars": 9691,
"preview": "<!--\nCopyright 2021 The Crashpad Authors\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not us"
},
{
"path": "doc/man.md",
"chars": 1129,
"preview": "<!--\nCopyright 2016 The Crashpad Authors\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not us"
},
{
"path": "doc/overview_design.md",
"chars": 26644,
"preview": "<!--\nCopyright 2017 The Crashpad Authors\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not us"
},
{
"path": "doc/status.md",
"chars": 1597,
"preview": "<!--\nCopyright 2015 The Crashpad Authors\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not us"
},
{
"path": "doc/support/compat.sh",
"chars": 1242,
"preview": "# Copyright 2015 The Crashpad Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not "
},
{
"path": "doc/support/crashpad.doxy",
"chars": 129947,
"preview": "# Doxyfile 1.13.2\n\n# This file describes the settings to be used by the documentation system\n# Doxygen (www.doxygen.org)"
},
{
"path": "doc/support/crashpad.doxy.h",
"chars": 1316,
"preview": "// Copyright 2014 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "doc/support/crashpad_doxygen.css",
"chars": 1390,
"preview": "/* Copyright 2016 The Crashpad Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may "
},
{
"path": "doc/support/generate.sh",
"chars": 1145,
"preview": "#!/bin/bash\n\n# Copyright 2015 The Crashpad Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n#"
},
{
"path": "doc/support/generate_doxygen.py",
"chars": 1402,
"preview": "#!/usr/bin/env python3\n\n# Copyright 2017 The Crashpad Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"L"
},
{
"path": "doc/support/generate_git.sh",
"chars": 2179,
"preview": "#!/bin/bash\n\n# Copyright 2015 The Crashpad Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n#"
},
{
"path": "handler/BUILD.gn",
"chars": 10144,
"preview": "# Copyright 2015 The Crashpad Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not "
},
{
"path": "handler/crash_report_upload_rate_limit.cc",
"chars": 1886,
"preview": "// Copyright 2025 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "handler/crash_report_upload_rate_limit.h",
"chars": 2384,
"preview": "// Copyright 2025 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "handler/crash_report_upload_rate_limit_test.cc",
"chars": 2792,
"preview": "// Copyright 2025 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "handler/crash_report_upload_thread.cc",
"chars": 14139,
"preview": "// Copyright 2015 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "handler/crash_report_upload_thread.h",
"chars": 10266,
"preview": "// Copyright 2015 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "handler/crashpad_handler.md",
"chars": 15924,
"preview": "<!--\nCopyright 2014 The Crashpad Authors\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not us"
},
{
"path": "handler/crashpad_handler_main.cc",
"chars": 862,
"preview": "// Copyright 2019 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "handler/crashpad_handler_test.cc",
"chars": 5009,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "handler/crashpad_handler_test_extended_handler.cc",
"chars": 2183,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "handler/handler_main.cc",
"chars": 42746,
"preview": "// Copyright 2014 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "handler/handler_main.h",
"chars": 1866,
"preview": "// Copyright 2015 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "handler/linux/capture_snapshot.cc",
"chars": 4418,
"preview": "// Copyright 2019 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "handler/linux/capture_snapshot.h",
"chars": 2943,
"preview": "// Copyright 2019 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "handler/linux/crash_report_exception_handler.cc",
"chars": 10494,
"preview": "// Copyright 2018 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "handler/linux/crash_report_exception_handler.h",
"chars": 5443,
"preview": "// Copyright 2018 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "handler/linux/cros_crash_report_exception_handler.cc",
"chars": 10984,
"preview": "// Copyright 2019 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "handler/linux/cros_crash_report_exception_handler.h",
"chars": 4425,
"preview": "// Copyright 2019 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "handler/linux/exception_handler_server.cc",
"chars": 14191,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "handler/linux/exception_handler_server.h",
"chars": 7337,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "handler/linux/exception_handler_server_test.cc",
"chars": 11923,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "handler/linux/handler_trampoline.cc",
"chars": 1596,
"preview": "// Copyright 2019 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "handler/mac/crash_report_exception_handler.cc",
"chars": 11865,
"preview": "// Copyright 2015 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "handler/mac/crash_report_exception_handler.h",
"chars": 4227,
"preview": "// Copyright 2015 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "handler/mac/exception_handler_server.cc",
"chars": 10082,
"preview": "// Copyright 2014 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "handler/mac/exception_handler_server.h",
"chars": 3507,
"preview": "// Copyright 2014 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "handler/mac/file_limit_annotation.cc",
"chars": 4241,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "handler/mac/file_limit_annotation.h",
"chars": 1492,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "handler/main.cc",
"chars": 1689,
"preview": "// Copyright 2015 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "handler/minidump_to_upload_parameters.cc",
"chars": 2940,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "handler/minidump_to_upload_parameters.h",
"chars": 2412,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "handler/minidump_to_upload_parameters_test.cc",
"chars": 3715,
"preview": "// Copyright 2017 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
},
{
"path": "handler/prune_crash_reports_thread.cc",
"chars": 1343,
"preview": "// Copyright 2016 The Crashpad Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
}
]
// ... and 979 more files (download for full content)
About this extraction
This page contains the full source code of the chromium/crashpad GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1179 files (7.1 MB), approximately 1.9M tokens, and a symbol index with 5517 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.