Remove NetworkSourceLine{Resolver,Server} and related code. It never wound up being useful enough to use in production, so let's drop the maintenence burden

R=jessicag at http://breakpad.appspot.com/292001/show

git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@795 4c0a9323-5329-0410-9bdc-e9ce6186880e
This commit is contained in:
ted.mielczarek 2011-07-07 20:53:52 +00:00
parent 3ca4a120de
commit 69607b678f
17 changed files with 7 additions and 4129 deletions

View file

@ -89,7 +89,6 @@ src_libbreakpad_a_SOURCES = \
src/google_breakpad/processor/memory_region.h \
src/google_breakpad/processor/minidump.h \
src/google_breakpad/processor/minidump_processor.h \
src/google-breakpad/processor/network_source_line_resolver.h \
src/google_breakpad/processor/process_state.h \
src/google_breakpad/processor/source_line_resolver_base.h \
src/google_breakpad/processor/source_line_resolver_interface.h \
@ -131,10 +130,6 @@ src_libbreakpad_a_SOURCES = \
src/processor/module_factory.h \
src/processor/module_serializer.cc \
src/processor/module_serializer.h \
src/processor/network_interface.h \
src/processor/network_source_line_resolver.cc \
src/processor/network_source_line_server.cc \
src/processor/network_source_line_server.h \
src/processor/pathname_stripper.cc \
src/processor/pathname_stripper.h \
src/processor/postfix_evaluator-inl.h \
@ -172,9 +167,7 @@ src_libbreakpad_a_SOURCES = \
src/processor/static_range_map-inl.h \
src/processor/static_range_map.h \
src/processor/tokenize.cc \
src/processor/tokenize.h \
src/processor/udp_network.cc \
src/processor/udp_network.h
src/processor/tokenize.h
src_libbreakpad_a_LIBADD = src/third_party/libdisasm/libdisasm.a
@ -209,8 +202,7 @@ src_third_party_libdisasm_libdisasm_a_SOURCES = \
## Programs
bin_PROGRAMS += \
src/processor/minidump_dump \
src/processor/minidump_stackwalk \
src/processor/source_daemon
src/processor/minidump_stackwalk
endif !DISABLE_PROCESSOR
if LINUX_HOST
@ -242,9 +234,6 @@ check_PROGRAMS += \
src/processor/map_serializers_unittest \
src/processor/minidump_processor_unittest \
src/processor/minidump_unittest \
src/processor/network_source_line_resolver_unittest \
src/processor/network_source_line_resolver_server_unittest \
src/processor/network_source_line_server_unittest \
src/processor/static_address_map_unittest \
src/processor/static_contained_range_map_unittest \
src/processor/static_map_unittest \
@ -596,82 +585,6 @@ src_processor_minidump_unittest_LDADD = \
src/processor/minidump.o \
src/processor/pathname_stripper.o
src_processor_network_source_line_resolver_unittest_SOURCES = \
src/processor/network_source_line_resolver_unittest.cc \
src/testing/gtest/src/gtest-all.cc \
src/testing/src/gmock-all.cc
src_processor_network_source_line_resolver_unittest_CPPFLAGS = \
-I$(top_srcdir)/src \
-I$(top_srcdir)/src/testing/include \
-I$(top_srcdir)/src/testing/gtest/include \
-I$(top_srcdir)/src/testing/gtest \
-I$(top_srcdir)/src/testing
src_processor_network_source_line_resolver_unittest_LDADD = \
src/processor/basic_code_modules.o \
src/processor/binarystream.o \
src/processor/cfi_frame_info.o \
src/processor/logging.o \
src/processor/network_source_line_resolver.o \
src/processor/pathname_stripper.o \
src/processor/tokenize.o \
src/processor/udp_network.o
src_processor_network_source_line_resolver_server_unittest_SOURCES = \
src/processor/network_source_line_resolver_server_unittest.cc \
src/testing/gtest/src/gtest-all.cc \
src/testing/src/gmock-all.cc
src_processor_network_source_line_resolver_server_unittest_CPPFLAGS = \
-I$(top_srcdir)/src \
-I$(top_srcdir)/src/testing/include \
-I$(top_srcdir)/src/testing/gtest/include \
-I$(top_srcdir)/src/testing/gtest \
-I$(top_srcdir)/src/testing
src_processor_network_source_line_resolver_server_unittest_LDADD = \
src/processor/basic_code_modules.o \
src/processor/basic_source_line_resolver.o \
src/processor/binarystream.o \
src/processor/call_stack.o \
src/processor/cfi_frame_info.o \
src/processor/disassembler_x86.o \
src/processor/exploitability.o \
src/processor/exploitability_win.o \
src/processor/logging.o \
src/processor/minidump_processor.o \
src/processor/minidump.o \
src/processor/network_source_line_resolver.o \
src/processor/network_source_line_server.o \
src/processor/pathname_stripper.o \
src/processor/process_state.o \
src/processor/simple_symbol_supplier.o \
src/processor/source_line_resolver_base.o \
src/processor/stackwalker.o \
src/processor/stackwalker_amd64.o \
src/processor/stackwalker_arm.o \
src/processor/stackwalker_ppc.o \
src/processor/stackwalker_sparc.o \
src/processor/stackwalker_x86.o \
src/processor/tokenize.o \
src/processor/udp_network.o \
src/third_party/libdisasm/libdisasm.a
src_processor_network_source_line_server_unittest_SOURCES = \
src/processor/network_source_line_server_unittest.cc \
src/testing/gtest/src/gtest-all.cc \
src/testing/src/gmock-all.cc
src_processor_network_source_line_server_unittest_CPPFLAGS = \
-I$(top_srcdir)/src \
-I$(top_srcdir)/src/testing/include \
-I$(top_srcdir)/src/testing/gtest/include \
-I$(top_srcdir)/src/testing/gtest \
-I$(top_srcdir)/src/testing
src_processor_network_source_line_server_unittest_LDADD = \
src/processor/binarystream.o \
src/processor/cfi_frame_info.o \
src/processor/logging.o \
src/processor/network_source_line_server.o \
src/processor/pathname_stripper.o \
src/processor/udp_network.o
src_processor_static_address_map_unittest_SOURCES = \
src/processor/static_address_map_unittest.cc \
src/testing/gtest/src/gtest-all.cc \
@ -869,7 +782,6 @@ src_processor_minidump_stackwalk_LDADD = \
src/processor/minidump_processor.o \
src/processor/pathname_stripper.o \
src/processor/process_state.o \
src/processor/network_source_line_resolver.o \
src/processor/simple_symbol_supplier.o \
src/processor/source_line_resolver_base.o \
src/processor/stackwalker.o \
@ -879,23 +791,8 @@ src_processor_minidump_stackwalk_LDADD = \
src/processor/stackwalker_sparc.o \
src/processor/stackwalker_x86.o \
src/processor/tokenize.o \
src/processor/udp_network.o \
src/third_party/libdisasm/libdisasm.a
src_processor_source_daemon_SOURCES = \
src/processor/source_daemon.cc
src_processor_source_daemon_LDADD = \
src/processor/basic_code_modules.o \
src/processor/basic_source_line_resolver.o \
src/processor/binarystream.o \
src/processor/cfi_frame_info.o \
src/processor/logging.o \
src/processor/network_source_line_server.o \
src/processor/pathname_stripper.o \
src/processor/simple_symbol_supplier.o \
src/processor/source_line_resolver_base.o \
src/processor/tokenize.o \
src/processor/udp_network.o
endif !DISABLE_PROCESSOR
## Additional files to be included in a source distribution

View file

@ -74,8 +74,7 @@ check_PROGRAMS = $(am__EXEEXT_4) $(am__EXEEXT_5) $(am__EXEEXT_6) \
@LINUX_HOST_TRUE@am__append_3 = src/client/linux/libbreakpad_client.a
@DISABLE_PROCESSOR_FALSE@am__append_4 = \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_dump \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_stackwalk \
@DISABLE_PROCESSOR_FALSE@ src/processor/source_daemon
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_stackwalk
@LINUX_HOST_TRUE@am__append_5 = \
@LINUX_HOST_TRUE@ src/client/linux/linux_dumper_unittest_helper
@ -99,9 +98,6 @@ check_PROGRAMS = $(am__EXEEXT_4) $(am__EXEEXT_5) $(am__EXEEXT_6) \
@DISABLE_PROCESSOR_FALSE@ src/processor/map_serializers_unittest \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_processor_unittest \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_unittest \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_resolver_unittest \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_resolver_server_unittest \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_server_unittest \
@DISABLE_PROCESSOR_FALSE@ src/processor/static_address_map_unittest \
@DISABLE_PROCESSOR_FALSE@ src/processor/static_contained_range_map_unittest \
@DISABLE_PROCESSOR_FALSE@ src/processor/static_map_unittest \
@ -206,7 +202,6 @@ am__src_libbreakpad_a_SOURCES_DIST = \
src/google_breakpad/processor/memory_region.h \
src/google_breakpad/processor/minidump.h \
src/google_breakpad/processor/minidump_processor.h \
src/google-breakpad/processor/network_source_line_resolver.h \
src/google_breakpad/processor/process_state.h \
src/google_breakpad/processor/source_line_resolver_base.h \
src/google_breakpad/processor/source_line_resolver_interface.h \
@ -241,10 +236,6 @@ am__src_libbreakpad_a_SOURCES_DIST = \
src/processor/module_comparer.h src/processor/module_factory.h \
src/processor/module_serializer.cc \
src/processor/module_serializer.h \
src/processor/network_interface.h \
src/processor/network_source_line_resolver.cc \
src/processor/network_source_line_server.cc \
src/processor/network_source_line_server.h \
src/processor/pathname_stripper.cc \
src/processor/pathname_stripper.h \
src/processor/postfix_evaluator-inl.h \
@ -278,8 +269,7 @@ am__src_libbreakpad_a_SOURCES_DIST = \
src/processor/static_map-inl.h src/processor/static_map.h \
src/processor/static_range_map-inl.h \
src/processor/static_range_map.h src/processor/tokenize.cc \
src/processor/tokenize.h src/processor/udp_network.cc \
src/processor/udp_network.h
src/processor/tokenize.h
@DISABLE_PROCESSOR_FALSE@am_src_libbreakpad_a_OBJECTS = src/processor/basic_code_modules.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/binarystream.$(OBJEXT) \
@ -294,8 +284,6 @@ am__src_libbreakpad_a_SOURCES_DIST = \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_processor.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/module_comparer.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/module_serializer.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_resolver.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_server.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/process_state.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.$(OBJEXT) \
@ -306,8 +294,7 @@ am__src_libbreakpad_a_SOURCES_DIST = \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_sparc.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/udp_network.$(OBJEXT)
@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.$(OBJEXT)
src_libbreakpad_a_OBJECTS = $(am_src_libbreakpad_a_OBJECTS)
src_third_party_libdisasm_libdisasm_a_AR = $(AR) $(ARFLAGS)
src_third_party_libdisasm_libdisasm_a_LIBADD =
@ -356,8 +343,7 @@ src_third_party_libdisasm_libdisasm_a_OBJECTS = \
$(am_src_third_party_libdisasm_libdisasm_a_OBJECTS)
@DISABLE_PROCESSOR_FALSE@am__EXEEXT_1 = \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_dump$(EXEEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_stackwalk$(EXEEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/source_daemon$(EXEEXT)
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_stackwalk$(EXEEXT)
@LINUX_HOST_TRUE@am__EXEEXT_2 = src/client/linux/linux_dumper_unittest_helper$(EXEEXT)
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@am__EXEEXT_3 = src/tools/linux/dump_syms/dump_syms$(EXEEXT) \
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/md2core/minidump-2-core$(EXEEXT) \
@ -375,9 +361,6 @@ src_third_party_libdisasm_libdisasm_a_OBJECTS = \
@DISABLE_PROCESSOR_FALSE@ src/processor/map_serializers_unittest$(EXEEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_processor_unittest$(EXEEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_unittest$(EXEEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_resolver_unittest$(EXEEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_resolver_server_unittest$(EXEEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_server_unittest$(EXEEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/static_address_map_unittest$(EXEEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/static_contained_range_map_unittest$(EXEEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/static_map_unittest$(EXEEXT) \
@ -703,7 +686,6 @@ src_processor_minidump_stackwalk_OBJECTS = \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_processor.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/process_state.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_resolver.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \
@ -713,7 +695,6 @@ src_processor_minidump_stackwalk_OBJECTS = \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_sparc.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/udp_network.o \
@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/libdisasm.a
am__src_processor_minidump_unittest_SOURCES_DIST = \
src/common/test_assembler.cc \
@ -735,73 +716,6 @@ src_processor_minidump_unittest_OBJECTS = \
@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o
am__src_processor_network_source_line_resolver_server_unittest_SOURCES_DIST = \
src/processor/network_source_line_resolver_server_unittest.cc \
src/testing/gtest/src/gtest-all.cc \
src/testing/src/gmock-all.cc
@DISABLE_PROCESSOR_FALSE@am_src_processor_network_source_line_resolver_server_unittest_OBJECTS = src/processor/src_processor_network_source_line_resolver_server_unittest-network_source_line_resolver_server_unittest.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/testing/gtest/src/src_processor_network_source_line_resolver_server_unittest-gtest-all.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/testing/src/src_processor_network_source_line_resolver_server_unittest-gmock-all.$(OBJEXT)
src_processor_network_source_line_resolver_server_unittest_OBJECTS = $(am_src_processor_network_source_line_resolver_server_unittest_OBJECTS)
@DISABLE_PROCESSOR_FALSE@src_processor_network_source_line_resolver_server_unittest_DEPENDENCIES = \
@DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/binarystream.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/call_stack.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_win.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_processor.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_resolver.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_server.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/process_state.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_sparc.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/udp_network.o \
@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/libdisasm.a
am__src_processor_network_source_line_resolver_unittest_SOURCES_DIST = \
src/processor/network_source_line_resolver_unittest.cc \
src/testing/gtest/src/gtest-all.cc \
src/testing/src/gmock-all.cc
@DISABLE_PROCESSOR_FALSE@am_src_processor_network_source_line_resolver_unittest_OBJECTS = src/processor/src_processor_network_source_line_resolver_unittest-network_source_line_resolver_unittest.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/testing/gtest/src/src_processor_network_source_line_resolver_unittest-gtest-all.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/testing/src/src_processor_network_source_line_resolver_unittest-gmock-all.$(OBJEXT)
src_processor_network_source_line_resolver_unittest_OBJECTS = $(am_src_processor_network_source_line_resolver_unittest_OBJECTS)
@DISABLE_PROCESSOR_FALSE@src_processor_network_source_line_resolver_unittest_DEPENDENCIES = \
@DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/binarystream.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_resolver.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/udp_network.o
am__src_processor_network_source_line_server_unittest_SOURCES_DIST = \
src/processor/network_source_line_server_unittest.cc \
src/testing/gtest/src/gtest-all.cc \
src/testing/src/gmock-all.cc
@DISABLE_PROCESSOR_FALSE@am_src_processor_network_source_line_server_unittest_OBJECTS = src/processor/src_processor_network_source_line_server_unittest-network_source_line_server_unittest.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/testing/gtest/src/src_processor_network_source_line_server_unittest-gtest-all.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/testing/src/src_processor_network_source_line_server_unittest-gmock-all.$(OBJEXT)
src_processor_network_source_line_server_unittest_OBJECTS = $(am_src_processor_network_source_line_server_unittest_OBJECTS)
@DISABLE_PROCESSOR_FALSE@src_processor_network_source_line_server_unittest_DEPENDENCIES = \
@DISABLE_PROCESSOR_FALSE@ src/processor/binarystream.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_server.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/udp_network.o
am__src_processor_pathname_stripper_unittest_SOURCES_DIST = \
src/processor/pathname_stripper_unittest.cc
@DISABLE_PROCESSOR_FALSE@am_src_processor_pathname_stripper_unittest_OBJECTS = src/processor/pathname_stripper_unittest.$(OBJEXT)
@ -825,23 +739,6 @@ src_processor_range_map_unittest_OBJECTS = \
@DISABLE_PROCESSOR_FALSE@src_processor_range_map_unittest_DEPENDENCIES = \
@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o
am__src_processor_source_daemon_SOURCES_DIST = \
src/processor/source_daemon.cc
@DISABLE_PROCESSOR_FALSE@am_src_processor_source_daemon_OBJECTS = src/processor/source_daemon.$(OBJEXT)
src_processor_source_daemon_OBJECTS = \
$(am_src_processor_source_daemon_OBJECTS)
@DISABLE_PROCESSOR_FALSE@src_processor_source_daemon_DEPENDENCIES = \
@DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/binarystream.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_server.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/udp_network.o
am__src_processor_stackwalker_amd64_unittest_SOURCES_DIST = \
src/common/test_assembler.cc \
src/processor/stackwalker_amd64_unittest.cc \
@ -1065,13 +962,9 @@ SOURCES = $(src_client_linux_libbreakpad_client_a_SOURCES) \
$(src_processor_minidump_processor_unittest_SOURCES) \
$(src_processor_minidump_stackwalk_SOURCES) \
$(src_processor_minidump_unittest_SOURCES) \
$(src_processor_network_source_line_resolver_server_unittest_SOURCES) \
$(src_processor_network_source_line_resolver_unittest_SOURCES) \
$(src_processor_network_source_line_server_unittest_SOURCES) \
$(src_processor_pathname_stripper_unittest_SOURCES) \
$(src_processor_postfix_evaluator_unittest_SOURCES) \
$(src_processor_range_map_unittest_SOURCES) \
$(src_processor_source_daemon_SOURCES) \
$(src_processor_stackwalker_amd64_unittest_SOURCES) \
$(src_processor_stackwalker_arm_unittest_SOURCES) \
$(src_processor_stackwalker_selftest_SOURCES) \
@ -1106,13 +999,9 @@ DIST_SOURCES = \
$(am__src_processor_minidump_processor_unittest_SOURCES_DIST) \
$(am__src_processor_minidump_stackwalk_SOURCES_DIST) \
$(am__src_processor_minidump_unittest_SOURCES_DIST) \
$(am__src_processor_network_source_line_resolver_server_unittest_SOURCES_DIST) \
$(am__src_processor_network_source_line_resolver_unittest_SOURCES_DIST) \
$(am__src_processor_network_source_line_server_unittest_SOURCES_DIST) \
$(am__src_processor_pathname_stripper_unittest_SOURCES_DIST) \
$(am__src_processor_postfix_evaluator_unittest_SOURCES_DIST) \
$(am__src_processor_range_map_unittest_SOURCES_DIST) \
$(am__src_processor_source_daemon_SOURCES_DIST) \
$(am__src_processor_stackwalker_amd64_unittest_SOURCES_DIST) \
$(am__src_processor_stackwalker_arm_unittest_SOURCES_DIST) \
$(am__src_processor_stackwalker_selftest_SOURCES_DIST) \
@ -1286,7 +1175,6 @@ lib_LIBRARIES = $(am__append_1) $(am__append_3)
@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/memory_region.h \
@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/minidump.h \
@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/minidump_processor.h \
@DISABLE_PROCESSOR_FALSE@ src/google-breakpad/processor/network_source_line_resolver.h \
@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/process_state.h \
@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/source_line_resolver_base.h \
@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/source_line_resolver_interface.h \
@ -1328,10 +1216,6 @@ lib_LIBRARIES = $(am__append_1) $(am__append_3)
@DISABLE_PROCESSOR_FALSE@ src/processor/module_factory.h \
@DISABLE_PROCESSOR_FALSE@ src/processor/module_serializer.cc \
@DISABLE_PROCESSOR_FALSE@ src/processor/module_serializer.h \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_interface.h \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_resolver.cc \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_server.cc \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_server.h \
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.cc \
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.h \
@DISABLE_PROCESSOR_FALSE@ src/processor/postfix_evaluator-inl.h \
@ -1369,9 +1253,7 @@ lib_LIBRARIES = $(am__append_1) $(am__append_3)
@DISABLE_PROCESSOR_FALSE@ src/processor/static_range_map-inl.h \
@DISABLE_PROCESSOR_FALSE@ src/processor/static_range_map.h \
@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.cc \
@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.h \
@DISABLE_PROCESSOR_FALSE@ src/processor/udp_network.cc \
@DISABLE_PROCESSOR_FALSE@ src/processor/udp_network.h
@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.h
@DISABLE_PROCESSOR_FALSE@src_libbreakpad_a_LIBADD = src/third_party/libdisasm/libdisasm.a
@DISABLE_PROCESSOR_FALSE@src_third_party_libdisasm_libdisasm_a_SOURCES = \
@ -1736,88 +1618,6 @@ TESTS_ENVIRONMENT =
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o
@DISABLE_PROCESSOR_FALSE@src_processor_network_source_line_resolver_unittest_SOURCES = \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_resolver_unittest.cc \
@DISABLE_PROCESSOR_FALSE@ src/testing/gtest/src/gtest-all.cc \
@DISABLE_PROCESSOR_FALSE@ src/testing/src/gmock-all.cc
@DISABLE_PROCESSOR_FALSE@src_processor_network_source_line_resolver_unittest_CPPFLAGS = \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/include \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing
@DISABLE_PROCESSOR_FALSE@src_processor_network_source_line_resolver_unittest_LDADD = \
@DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/binarystream.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_resolver.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/udp_network.o
@DISABLE_PROCESSOR_FALSE@src_processor_network_source_line_resolver_server_unittest_SOURCES = \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_resolver_server_unittest.cc \
@DISABLE_PROCESSOR_FALSE@ src/testing/gtest/src/gtest-all.cc \
@DISABLE_PROCESSOR_FALSE@ src/testing/src/gmock-all.cc
@DISABLE_PROCESSOR_FALSE@src_processor_network_source_line_resolver_server_unittest_CPPFLAGS = \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/include \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing
@DISABLE_PROCESSOR_FALSE@src_processor_network_source_line_resolver_server_unittest_LDADD = \
@DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/binarystream.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/call_stack.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_win.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_processor.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_resolver.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_server.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/process_state.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_sparc.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/udp_network.o \
@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/libdisasm.a
@DISABLE_PROCESSOR_FALSE@src_processor_network_source_line_server_unittest_SOURCES = \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_server_unittest.cc \
@DISABLE_PROCESSOR_FALSE@ src/testing/gtest/src/gtest-all.cc \
@DISABLE_PROCESSOR_FALSE@ src/testing/src/gmock-all.cc
@DISABLE_PROCESSOR_FALSE@src_processor_network_source_line_server_unittest_CPPFLAGS = \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/include \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest/include \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing/gtest \
@DISABLE_PROCESSOR_FALSE@ -I$(top_srcdir)/src/testing
@DISABLE_PROCESSOR_FALSE@src_processor_network_source_line_server_unittest_LDADD = \
@DISABLE_PROCESSOR_FALSE@ src/processor/binarystream.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_server.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/udp_network.o
@DISABLE_PROCESSOR_FALSE@src_processor_static_address_map_unittest_SOURCES = \
@DISABLE_PROCESSOR_FALSE@ src/processor/static_address_map_unittest.cc \
@DISABLE_PROCESSOR_FALSE@ src/testing/gtest/src/gtest-all.cc \
@ -2034,7 +1834,6 @@ TESTS_ENVIRONMENT =
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_processor.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/process_state.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_resolver.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \
@ -2044,25 +1843,8 @@ TESTS_ENVIRONMENT =
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_sparc.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/udp_network.o \
@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/libdisasm.a
@DISABLE_PROCESSOR_FALSE@src_processor_source_daemon_SOURCES = \
@DISABLE_PROCESSOR_FALSE@ src/processor/source_daemon.cc
@DISABLE_PROCESSOR_FALSE@src_processor_source_daemon_LDADD = \
@DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/binarystream.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/network_source_line_server.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/udp_network.o
EXTRA_DIST = \
$(SCRIPTS) \
src/processor/stackwalk_selftest_sol.s \
@ -2396,12 +2178,6 @@ src/processor/module_comparer.$(OBJEXT): \
src/processor/module_serializer.$(OBJEXT): \
src/processor/$(am__dirstamp) \
src/processor/$(DEPDIR)/$(am__dirstamp)
src/processor/network_source_line_resolver.$(OBJEXT): \
src/processor/$(am__dirstamp) \
src/processor/$(DEPDIR)/$(am__dirstamp)
src/processor/network_source_line_server.$(OBJEXT): \
src/processor/$(am__dirstamp) \
src/processor/$(DEPDIR)/$(am__dirstamp)
src/processor/pathname_stripper.$(OBJEXT): \
src/processor/$(am__dirstamp) \
src/processor/$(DEPDIR)/$(am__dirstamp)
@ -2432,8 +2208,6 @@ src/processor/stackwalker_x86.$(OBJEXT): \
src/processor/$(DEPDIR)/$(am__dirstamp)
src/processor/tokenize.$(OBJEXT): src/processor/$(am__dirstamp) \
src/processor/$(DEPDIR)/$(am__dirstamp)
src/processor/udp_network.$(OBJEXT): src/processor/$(am__dirstamp) \
src/processor/$(DEPDIR)/$(am__dirstamp)
src/$(am__dirstamp):
@$(MKDIR_P) src
@: > src/$(am__dirstamp)
@ -2871,42 +2645,6 @@ src/testing/src/src_processor_minidump_unittest-gmock-all.$(OBJEXT): \
src/processor/minidump_unittest$(EXEEXT): $(src_processor_minidump_unittest_OBJECTS) $(src_processor_minidump_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/minidump_unittest$(EXEEXT)
$(CXXLINK) $(src_processor_minidump_unittest_OBJECTS) $(src_processor_minidump_unittest_LDADD) $(LIBS)
src/processor/src_processor_network_source_line_resolver_server_unittest-network_source_line_resolver_server_unittest.$(OBJEXT): \
src/processor/$(am__dirstamp) \
src/processor/$(DEPDIR)/$(am__dirstamp)
src/testing/gtest/src/src_processor_network_source_line_resolver_server_unittest-gtest-all.$(OBJEXT): \
src/testing/gtest/src/$(am__dirstamp) \
src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
src/testing/src/src_processor_network_source_line_resolver_server_unittest-gmock-all.$(OBJEXT): \
src/testing/src/$(am__dirstamp) \
src/testing/src/$(DEPDIR)/$(am__dirstamp)
src/processor/network_source_line_resolver_server_unittest$(EXEEXT): $(src_processor_network_source_line_resolver_server_unittest_OBJECTS) $(src_processor_network_source_line_resolver_server_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/network_source_line_resolver_server_unittest$(EXEEXT)
$(CXXLINK) $(src_processor_network_source_line_resolver_server_unittest_OBJECTS) $(src_processor_network_source_line_resolver_server_unittest_LDADD) $(LIBS)
src/processor/src_processor_network_source_line_resolver_unittest-network_source_line_resolver_unittest.$(OBJEXT): \
src/processor/$(am__dirstamp) \
src/processor/$(DEPDIR)/$(am__dirstamp)
src/testing/gtest/src/src_processor_network_source_line_resolver_unittest-gtest-all.$(OBJEXT): \
src/testing/gtest/src/$(am__dirstamp) \
src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
src/testing/src/src_processor_network_source_line_resolver_unittest-gmock-all.$(OBJEXT): \
src/testing/src/$(am__dirstamp) \
src/testing/src/$(DEPDIR)/$(am__dirstamp)
src/processor/network_source_line_resolver_unittest$(EXEEXT): $(src_processor_network_source_line_resolver_unittest_OBJECTS) $(src_processor_network_source_line_resolver_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/network_source_line_resolver_unittest$(EXEEXT)
$(CXXLINK) $(src_processor_network_source_line_resolver_unittest_OBJECTS) $(src_processor_network_source_line_resolver_unittest_LDADD) $(LIBS)
src/processor/src_processor_network_source_line_server_unittest-network_source_line_server_unittest.$(OBJEXT): \
src/processor/$(am__dirstamp) \
src/processor/$(DEPDIR)/$(am__dirstamp)
src/testing/gtest/src/src_processor_network_source_line_server_unittest-gtest-all.$(OBJEXT): \
src/testing/gtest/src/$(am__dirstamp) \
src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
src/testing/src/src_processor_network_source_line_server_unittest-gmock-all.$(OBJEXT): \
src/testing/src/$(am__dirstamp) \
src/testing/src/$(DEPDIR)/$(am__dirstamp)
src/processor/network_source_line_server_unittest$(EXEEXT): $(src_processor_network_source_line_server_unittest_OBJECTS) $(src_processor_network_source_line_server_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/network_source_line_server_unittest$(EXEEXT)
$(CXXLINK) $(src_processor_network_source_line_server_unittest_OBJECTS) $(src_processor_network_source_line_server_unittest_LDADD) $(LIBS)
src/processor/pathname_stripper_unittest.$(OBJEXT): \
src/processor/$(am__dirstamp) \
src/processor/$(DEPDIR)/$(am__dirstamp)
@ -2925,11 +2663,6 @@ src/processor/range_map_unittest.$(OBJEXT): \
src/processor/range_map_unittest$(EXEEXT): $(src_processor_range_map_unittest_OBJECTS) $(src_processor_range_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/range_map_unittest$(EXEEXT)
$(CXXLINK) $(src_processor_range_map_unittest_OBJECTS) $(src_processor_range_map_unittest_LDADD) $(LIBS)
src/processor/source_daemon.$(OBJEXT): src/processor/$(am__dirstamp) \
src/processor/$(DEPDIR)/$(am__dirstamp)
src/processor/source_daemon$(EXEEXT): $(src_processor_source_daemon_OBJECTS) $(src_processor_source_daemon_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/source_daemon$(EXEEXT)
$(CXXLINK) $(src_processor_source_daemon_OBJECTS) $(src_processor_source_daemon_LDADD) $(LIBS)
src/common/src_processor_stackwalker_amd64_unittest-test_assembler.$(OBJEXT): \
src/common/$(am__dirstamp) \
src/common/$(DEPDIR)/$(am__dirstamp)
@ -3221,15 +2954,12 @@ mostlyclean-compile:
-rm -f src/processor/minidump_stackwalk.$(OBJEXT)
-rm -f src/processor/module_comparer.$(OBJEXT)
-rm -f src/processor/module_serializer.$(OBJEXT)
-rm -f src/processor/network_source_line_resolver.$(OBJEXT)
-rm -f src/processor/network_source_line_server.$(OBJEXT)
-rm -f src/processor/pathname_stripper.$(OBJEXT)
-rm -f src/processor/pathname_stripper_unittest.$(OBJEXT)
-rm -f src/processor/postfix_evaluator_unittest.$(OBJEXT)
-rm -f src/processor/process_state.$(OBJEXT)
-rm -f src/processor/range_map_unittest.$(OBJEXT)
-rm -f src/processor/simple_symbol_supplier.$(OBJEXT)
-rm -f src/processor/source_daemon.$(OBJEXT)
-rm -f src/processor/source_line_resolver_base.$(OBJEXT)
-rm -f src/processor/src_client_linux_linux_client_unittest-basic_code_modules.$(OBJEXT)
-rm -f src/processor/src_client_linux_linux_client_unittest-logging.$(OBJEXT)
@ -3245,9 +2975,6 @@ mostlyclean-compile:
-rm -f src/processor/src_processor_minidump_processor_unittest-minidump_processor_unittest.$(OBJEXT)
-rm -f src/processor/src_processor_minidump_unittest-minidump_unittest.$(OBJEXT)
-rm -f src/processor/src_processor_minidump_unittest-synth_minidump.$(OBJEXT)
-rm -f src/processor/src_processor_network_source_line_resolver_server_unittest-network_source_line_resolver_server_unittest.$(OBJEXT)
-rm -f src/processor/src_processor_network_source_line_resolver_unittest-network_source_line_resolver_unittest.$(OBJEXT)
-rm -f src/processor/src_processor_network_source_line_server_unittest-network_source_line_server_unittest.$(OBJEXT)
-rm -f src/processor/src_processor_stackwalker_amd64_unittest-stackwalker_amd64_unittest.$(OBJEXT)
-rm -f src/processor/src_processor_stackwalker_arm_unittest-stackwalker_arm_unittest.$(OBJEXT)
-rm -f src/processor/src_processor_stackwalker_x86_unittest-stackwalker_x86_unittest.$(OBJEXT)
@ -3265,7 +2992,6 @@ mostlyclean-compile:
-rm -f src/processor/stackwalker_sparc.$(OBJEXT)
-rm -f src/processor/stackwalker_x86.$(OBJEXT)
-rm -f src/processor/tokenize.$(OBJEXT)
-rm -f src/processor/udp_network.$(OBJEXT)
-rm -f src/testing/gtest/src/src_client_linux_linux_client_unittest-gtest-all.$(OBJEXT)
-rm -f src/testing/gtest/src/src_client_linux_linux_client_unittest-gtest_main.$(OBJEXT)
-rm -f src/testing/gtest/src/src_common_dumper_unittest-gtest-all.$(OBJEXT)
@ -3285,9 +3011,6 @@ mostlyclean-compile:
-rm -f src/testing/gtest/src/src_processor_minidump_processor_unittest-gtest-all.$(OBJEXT)
-rm -f src/testing/gtest/src/src_processor_minidump_unittest-gtest-all.$(OBJEXT)
-rm -f src/testing/gtest/src/src_processor_minidump_unittest-gtest_main.$(OBJEXT)
-rm -f src/testing/gtest/src/src_processor_network_source_line_resolver_server_unittest-gtest-all.$(OBJEXT)
-rm -f src/testing/gtest/src/src_processor_network_source_line_resolver_unittest-gtest-all.$(OBJEXT)
-rm -f src/testing/gtest/src/src_processor_network_source_line_server_unittest-gtest-all.$(OBJEXT)
-rm -f src/testing/gtest/src/src_processor_stackwalker_amd64_unittest-gtest-all.$(OBJEXT)
-rm -f src/testing/gtest/src/src_processor_stackwalker_amd64_unittest-gtest_main.$(OBJEXT)
-rm -f src/testing/gtest/src/src_processor_stackwalker_arm_unittest-gtest-all.$(OBJEXT)
@ -3312,9 +3035,6 @@ mostlyclean-compile:
-rm -f src/testing/src/src_processor_map_serializers_unittest-gmock-all.$(OBJEXT)
-rm -f src/testing/src/src_processor_minidump_processor_unittest-gmock-all.$(OBJEXT)
-rm -f src/testing/src/src_processor_minidump_unittest-gmock-all.$(OBJEXT)
-rm -f src/testing/src/src_processor_network_source_line_resolver_server_unittest-gmock-all.$(OBJEXT)
-rm -f src/testing/src/src_processor_network_source_line_resolver_unittest-gmock-all.$(OBJEXT)
-rm -f src/testing/src/src_processor_network_source_line_server_unittest-gmock-all.$(OBJEXT)
-rm -f src/testing/src/src_processor_stackwalker_amd64_unittest-gmock-all.$(OBJEXT)
-rm -f src/testing/src/src_processor_stackwalker_arm_unittest-gmock-all.$(OBJEXT)
-rm -f src/testing/src/src_processor_stackwalker_x86_unittest-gmock-all.$(OBJEXT)
@ -3430,15 +3150,12 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/minidump_stackwalk.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/module_comparer.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/module_serializer.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/network_source_line_resolver.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/network_source_line_server.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/pathname_stripper.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/pathname_stripper_unittest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/postfix_evaluator_unittest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/process_state.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/range_map_unittest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/simple_symbol_supplier.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/source_daemon.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/source_line_resolver_base.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_client_linux_linux_client_unittest-basic_code_modules.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_client_linux_linux_client_unittest-logging.Po@am__quote@
@ -3454,9 +3171,6 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_minidump_processor_unittest-minidump_processor_unittest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_minidump_unittest-minidump_unittest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_minidump_unittest-synth_minidump.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_network_source_line_resolver_server_unittest-network_source_line_resolver_server_unittest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_network_source_line_resolver_unittest-network_source_line_resolver_unittest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_network_source_line_server_unittest-network_source_line_server_unittest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_stackwalker_amd64_unittest-stackwalker_amd64_unittest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_stackwalker_arm_unittest-stackwalker_arm_unittest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_stackwalker_x86_unittest-stackwalker_x86_unittest.Po@am__quote@
@ -3474,7 +3188,6 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_sparc.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_x86.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/tokenize.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/udp_network.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_client_linux_linux_client_unittest-gtest-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_client_linux_linux_client_unittest-gtest_main.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_common_dumper_unittest-gtest-all.Po@am__quote@
@ -3494,9 +3207,6 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_minidump_processor_unittest-gtest-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_minidump_unittest-gtest-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_minidump_unittest-gtest_main.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_network_source_line_resolver_server_unittest-gtest-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_network_source_line_resolver_unittest-gtest-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_network_source_line_server_unittest-gtest-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_stackwalker_amd64_unittest-gtest-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_stackwalker_amd64_unittest-gtest_main.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_stackwalker_arm_unittest-gtest-all.Po@am__quote@
@ -3521,9 +3231,6 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_map_serializers_unittest-gmock-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_minidump_processor_unittest-gmock-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_minidump_unittest-gmock-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_network_source_line_resolver_server_unittest-gmock-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_network_source_line_resolver_unittest-gmock-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_network_source_line_server_unittest-gmock-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_stackwalker_amd64_unittest-gmock-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_stackwalker_arm_unittest-gmock-all.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_stackwalker_x86_unittest-gmock-all.Po@am__quote@
@ -4773,132 +4480,6 @@ src/testing/src/src_processor_minidump_unittest-gmock-all.obj: src/testing/src/g
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_minidump_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/src/src_processor_minidump_unittest-gmock-all.obj `if test -f 'src/testing/src/gmock-all.cc'; then $(CYGPATH_W) 'src/testing/src/gmock-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/src/gmock-all.cc'; fi`
src/processor/src_processor_network_source_line_resolver_server_unittest-network_source_line_resolver_server_unittest.o: src/processor/network_source_line_resolver_server_unittest.cc
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_resolver_server_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/src_processor_network_source_line_resolver_server_unittest-network_source_line_resolver_server_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/src_processor_network_source_line_resolver_server_unittest-network_source_line_resolver_server_unittest.Tpo -c -o src/processor/src_processor_network_source_line_resolver_server_unittest-network_source_line_resolver_server_unittest.o `test -f 'src/processor/network_source_line_resolver_server_unittest.cc' || echo '$(srcdir)/'`src/processor/network_source_line_resolver_server_unittest.cc
@am__fastdepCXX_TRUE@ $(am__mv) src/processor/$(DEPDIR)/src_processor_network_source_line_resolver_server_unittest-network_source_line_resolver_server_unittest.Tpo src/processor/$(DEPDIR)/src_processor_network_source_line_resolver_server_unittest-network_source_line_resolver_server_unittest.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/processor/network_source_line_resolver_server_unittest.cc' object='src/processor/src_processor_network_source_line_resolver_server_unittest-network_source_line_resolver_server_unittest.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_resolver_server_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/src_processor_network_source_line_resolver_server_unittest-network_source_line_resolver_server_unittest.o `test -f 'src/processor/network_source_line_resolver_server_unittest.cc' || echo '$(srcdir)/'`src/processor/network_source_line_resolver_server_unittest.cc
src/processor/src_processor_network_source_line_resolver_server_unittest-network_source_line_resolver_server_unittest.obj: src/processor/network_source_line_resolver_server_unittest.cc
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_resolver_server_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/src_processor_network_source_line_resolver_server_unittest-network_source_line_resolver_server_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/src_processor_network_source_line_resolver_server_unittest-network_source_line_resolver_server_unittest.Tpo -c -o src/processor/src_processor_network_source_line_resolver_server_unittest-network_source_line_resolver_server_unittest.obj `if test -f 'src/processor/network_source_line_resolver_server_unittest.cc'; then $(CYGPATH_W) 'src/processor/network_source_line_resolver_server_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/network_source_line_resolver_server_unittest.cc'; fi`
@am__fastdepCXX_TRUE@ $(am__mv) src/processor/$(DEPDIR)/src_processor_network_source_line_resolver_server_unittest-network_source_line_resolver_server_unittest.Tpo src/processor/$(DEPDIR)/src_processor_network_source_line_resolver_server_unittest-network_source_line_resolver_server_unittest.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/processor/network_source_line_resolver_server_unittest.cc' object='src/processor/src_processor_network_source_line_resolver_server_unittest-network_source_line_resolver_server_unittest.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_resolver_server_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/src_processor_network_source_line_resolver_server_unittest-network_source_line_resolver_server_unittest.obj `if test -f 'src/processor/network_source_line_resolver_server_unittest.cc'; then $(CYGPATH_W) 'src/processor/network_source_line_resolver_server_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/network_source_line_resolver_server_unittest.cc'; fi`
src/testing/gtest/src/src_processor_network_source_line_resolver_server_unittest-gtest-all.o: src/testing/gtest/src/gtest-all.cc
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_resolver_server_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/gtest/src/src_processor_network_source_line_resolver_server_unittest-gtest-all.o -MD -MP -MF src/testing/gtest/src/$(DEPDIR)/src_processor_network_source_line_resolver_server_unittest-gtest-all.Tpo -c -o src/testing/gtest/src/src_processor_network_source_line_resolver_server_unittest-gtest-all.o `test -f 'src/testing/gtest/src/gtest-all.cc' || echo '$(srcdir)/'`src/testing/gtest/src/gtest-all.cc
@am__fastdepCXX_TRUE@ $(am__mv) src/testing/gtest/src/$(DEPDIR)/src_processor_network_source_line_resolver_server_unittest-gtest-all.Tpo src/testing/gtest/src/$(DEPDIR)/src_processor_network_source_line_resolver_server_unittest-gtest-all.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/testing/gtest/src/gtest-all.cc' object='src/testing/gtest/src/src_processor_network_source_line_resolver_server_unittest-gtest-all.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_resolver_server_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/gtest/src/src_processor_network_source_line_resolver_server_unittest-gtest-all.o `test -f 'src/testing/gtest/src/gtest-all.cc' || echo '$(srcdir)/'`src/testing/gtest/src/gtest-all.cc
src/testing/gtest/src/src_processor_network_source_line_resolver_server_unittest-gtest-all.obj: src/testing/gtest/src/gtest-all.cc
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_resolver_server_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/gtest/src/src_processor_network_source_line_resolver_server_unittest-gtest-all.obj -MD -MP -MF src/testing/gtest/src/$(DEPDIR)/src_processor_network_source_line_resolver_server_unittest-gtest-all.Tpo -c -o src/testing/gtest/src/src_processor_network_source_line_resolver_server_unittest-gtest-all.obj `if test -f 'src/testing/gtest/src/gtest-all.cc'; then $(CYGPATH_W) 'src/testing/gtest/src/gtest-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/gtest/src/gtest-all.cc'; fi`
@am__fastdepCXX_TRUE@ $(am__mv) src/testing/gtest/src/$(DEPDIR)/src_processor_network_source_line_resolver_server_unittest-gtest-all.Tpo src/testing/gtest/src/$(DEPDIR)/src_processor_network_source_line_resolver_server_unittest-gtest-all.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/testing/gtest/src/gtest-all.cc' object='src/testing/gtest/src/src_processor_network_source_line_resolver_server_unittest-gtest-all.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_resolver_server_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/gtest/src/src_processor_network_source_line_resolver_server_unittest-gtest-all.obj `if test -f 'src/testing/gtest/src/gtest-all.cc'; then $(CYGPATH_W) 'src/testing/gtest/src/gtest-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/gtest/src/gtest-all.cc'; fi`
src/testing/src/src_processor_network_source_line_resolver_server_unittest-gmock-all.o: src/testing/src/gmock-all.cc
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_resolver_server_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/src/src_processor_network_source_line_resolver_server_unittest-gmock-all.o -MD -MP -MF src/testing/src/$(DEPDIR)/src_processor_network_source_line_resolver_server_unittest-gmock-all.Tpo -c -o src/testing/src/src_processor_network_source_line_resolver_server_unittest-gmock-all.o `test -f 'src/testing/src/gmock-all.cc' || echo '$(srcdir)/'`src/testing/src/gmock-all.cc
@am__fastdepCXX_TRUE@ $(am__mv) src/testing/src/$(DEPDIR)/src_processor_network_source_line_resolver_server_unittest-gmock-all.Tpo src/testing/src/$(DEPDIR)/src_processor_network_source_line_resolver_server_unittest-gmock-all.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/testing/src/gmock-all.cc' object='src/testing/src/src_processor_network_source_line_resolver_server_unittest-gmock-all.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_resolver_server_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/src/src_processor_network_source_line_resolver_server_unittest-gmock-all.o `test -f 'src/testing/src/gmock-all.cc' || echo '$(srcdir)/'`src/testing/src/gmock-all.cc
src/testing/src/src_processor_network_source_line_resolver_server_unittest-gmock-all.obj: src/testing/src/gmock-all.cc
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_resolver_server_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/src/src_processor_network_source_line_resolver_server_unittest-gmock-all.obj -MD -MP -MF src/testing/src/$(DEPDIR)/src_processor_network_source_line_resolver_server_unittest-gmock-all.Tpo -c -o src/testing/src/src_processor_network_source_line_resolver_server_unittest-gmock-all.obj `if test -f 'src/testing/src/gmock-all.cc'; then $(CYGPATH_W) 'src/testing/src/gmock-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/src/gmock-all.cc'; fi`
@am__fastdepCXX_TRUE@ $(am__mv) src/testing/src/$(DEPDIR)/src_processor_network_source_line_resolver_server_unittest-gmock-all.Tpo src/testing/src/$(DEPDIR)/src_processor_network_source_line_resolver_server_unittest-gmock-all.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/testing/src/gmock-all.cc' object='src/testing/src/src_processor_network_source_line_resolver_server_unittest-gmock-all.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_resolver_server_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/src/src_processor_network_source_line_resolver_server_unittest-gmock-all.obj `if test -f 'src/testing/src/gmock-all.cc'; then $(CYGPATH_W) 'src/testing/src/gmock-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/src/gmock-all.cc'; fi`
src/processor/src_processor_network_source_line_resolver_unittest-network_source_line_resolver_unittest.o: src/processor/network_source_line_resolver_unittest.cc
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_resolver_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/src_processor_network_source_line_resolver_unittest-network_source_line_resolver_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/src_processor_network_source_line_resolver_unittest-network_source_line_resolver_unittest.Tpo -c -o src/processor/src_processor_network_source_line_resolver_unittest-network_source_line_resolver_unittest.o `test -f 'src/processor/network_source_line_resolver_unittest.cc' || echo '$(srcdir)/'`src/processor/network_source_line_resolver_unittest.cc
@am__fastdepCXX_TRUE@ $(am__mv) src/processor/$(DEPDIR)/src_processor_network_source_line_resolver_unittest-network_source_line_resolver_unittest.Tpo src/processor/$(DEPDIR)/src_processor_network_source_line_resolver_unittest-network_source_line_resolver_unittest.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/processor/network_source_line_resolver_unittest.cc' object='src/processor/src_processor_network_source_line_resolver_unittest-network_source_line_resolver_unittest.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_resolver_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/src_processor_network_source_line_resolver_unittest-network_source_line_resolver_unittest.o `test -f 'src/processor/network_source_line_resolver_unittest.cc' || echo '$(srcdir)/'`src/processor/network_source_line_resolver_unittest.cc
src/processor/src_processor_network_source_line_resolver_unittest-network_source_line_resolver_unittest.obj: src/processor/network_source_line_resolver_unittest.cc
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_resolver_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/src_processor_network_source_line_resolver_unittest-network_source_line_resolver_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/src_processor_network_source_line_resolver_unittest-network_source_line_resolver_unittest.Tpo -c -o src/processor/src_processor_network_source_line_resolver_unittest-network_source_line_resolver_unittest.obj `if test -f 'src/processor/network_source_line_resolver_unittest.cc'; then $(CYGPATH_W) 'src/processor/network_source_line_resolver_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/network_source_line_resolver_unittest.cc'; fi`
@am__fastdepCXX_TRUE@ $(am__mv) src/processor/$(DEPDIR)/src_processor_network_source_line_resolver_unittest-network_source_line_resolver_unittest.Tpo src/processor/$(DEPDIR)/src_processor_network_source_line_resolver_unittest-network_source_line_resolver_unittest.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/processor/network_source_line_resolver_unittest.cc' object='src/processor/src_processor_network_source_line_resolver_unittest-network_source_line_resolver_unittest.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_resolver_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/src_processor_network_source_line_resolver_unittest-network_source_line_resolver_unittest.obj `if test -f 'src/processor/network_source_line_resolver_unittest.cc'; then $(CYGPATH_W) 'src/processor/network_source_line_resolver_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/network_source_line_resolver_unittest.cc'; fi`
src/testing/gtest/src/src_processor_network_source_line_resolver_unittest-gtest-all.o: src/testing/gtest/src/gtest-all.cc
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_resolver_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/gtest/src/src_processor_network_source_line_resolver_unittest-gtest-all.o -MD -MP -MF src/testing/gtest/src/$(DEPDIR)/src_processor_network_source_line_resolver_unittest-gtest-all.Tpo -c -o src/testing/gtest/src/src_processor_network_source_line_resolver_unittest-gtest-all.o `test -f 'src/testing/gtest/src/gtest-all.cc' || echo '$(srcdir)/'`src/testing/gtest/src/gtest-all.cc
@am__fastdepCXX_TRUE@ $(am__mv) src/testing/gtest/src/$(DEPDIR)/src_processor_network_source_line_resolver_unittest-gtest-all.Tpo src/testing/gtest/src/$(DEPDIR)/src_processor_network_source_line_resolver_unittest-gtest-all.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/testing/gtest/src/gtest-all.cc' object='src/testing/gtest/src/src_processor_network_source_line_resolver_unittest-gtest-all.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_resolver_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/gtest/src/src_processor_network_source_line_resolver_unittest-gtest-all.o `test -f 'src/testing/gtest/src/gtest-all.cc' || echo '$(srcdir)/'`src/testing/gtest/src/gtest-all.cc
src/testing/gtest/src/src_processor_network_source_line_resolver_unittest-gtest-all.obj: src/testing/gtest/src/gtest-all.cc
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_resolver_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/gtest/src/src_processor_network_source_line_resolver_unittest-gtest-all.obj -MD -MP -MF src/testing/gtest/src/$(DEPDIR)/src_processor_network_source_line_resolver_unittest-gtest-all.Tpo -c -o src/testing/gtest/src/src_processor_network_source_line_resolver_unittest-gtest-all.obj `if test -f 'src/testing/gtest/src/gtest-all.cc'; then $(CYGPATH_W) 'src/testing/gtest/src/gtest-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/gtest/src/gtest-all.cc'; fi`
@am__fastdepCXX_TRUE@ $(am__mv) src/testing/gtest/src/$(DEPDIR)/src_processor_network_source_line_resolver_unittest-gtest-all.Tpo src/testing/gtest/src/$(DEPDIR)/src_processor_network_source_line_resolver_unittest-gtest-all.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/testing/gtest/src/gtest-all.cc' object='src/testing/gtest/src/src_processor_network_source_line_resolver_unittest-gtest-all.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_resolver_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/gtest/src/src_processor_network_source_line_resolver_unittest-gtest-all.obj `if test -f 'src/testing/gtest/src/gtest-all.cc'; then $(CYGPATH_W) 'src/testing/gtest/src/gtest-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/gtest/src/gtest-all.cc'; fi`
src/testing/src/src_processor_network_source_line_resolver_unittest-gmock-all.o: src/testing/src/gmock-all.cc
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_resolver_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/src/src_processor_network_source_line_resolver_unittest-gmock-all.o -MD -MP -MF src/testing/src/$(DEPDIR)/src_processor_network_source_line_resolver_unittest-gmock-all.Tpo -c -o src/testing/src/src_processor_network_source_line_resolver_unittest-gmock-all.o `test -f 'src/testing/src/gmock-all.cc' || echo '$(srcdir)/'`src/testing/src/gmock-all.cc
@am__fastdepCXX_TRUE@ $(am__mv) src/testing/src/$(DEPDIR)/src_processor_network_source_line_resolver_unittest-gmock-all.Tpo src/testing/src/$(DEPDIR)/src_processor_network_source_line_resolver_unittest-gmock-all.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/testing/src/gmock-all.cc' object='src/testing/src/src_processor_network_source_line_resolver_unittest-gmock-all.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_resolver_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/src/src_processor_network_source_line_resolver_unittest-gmock-all.o `test -f 'src/testing/src/gmock-all.cc' || echo '$(srcdir)/'`src/testing/src/gmock-all.cc
src/testing/src/src_processor_network_source_line_resolver_unittest-gmock-all.obj: src/testing/src/gmock-all.cc
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_resolver_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/src/src_processor_network_source_line_resolver_unittest-gmock-all.obj -MD -MP -MF src/testing/src/$(DEPDIR)/src_processor_network_source_line_resolver_unittest-gmock-all.Tpo -c -o src/testing/src/src_processor_network_source_line_resolver_unittest-gmock-all.obj `if test -f 'src/testing/src/gmock-all.cc'; then $(CYGPATH_W) 'src/testing/src/gmock-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/src/gmock-all.cc'; fi`
@am__fastdepCXX_TRUE@ $(am__mv) src/testing/src/$(DEPDIR)/src_processor_network_source_line_resolver_unittest-gmock-all.Tpo src/testing/src/$(DEPDIR)/src_processor_network_source_line_resolver_unittest-gmock-all.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/testing/src/gmock-all.cc' object='src/testing/src/src_processor_network_source_line_resolver_unittest-gmock-all.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_resolver_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/src/src_processor_network_source_line_resolver_unittest-gmock-all.obj `if test -f 'src/testing/src/gmock-all.cc'; then $(CYGPATH_W) 'src/testing/src/gmock-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/src/gmock-all.cc'; fi`
src/processor/src_processor_network_source_line_server_unittest-network_source_line_server_unittest.o: src/processor/network_source_line_server_unittest.cc
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_server_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/src_processor_network_source_line_server_unittest-network_source_line_server_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/src_processor_network_source_line_server_unittest-network_source_line_server_unittest.Tpo -c -o src/processor/src_processor_network_source_line_server_unittest-network_source_line_server_unittest.o `test -f 'src/processor/network_source_line_server_unittest.cc' || echo '$(srcdir)/'`src/processor/network_source_line_server_unittest.cc
@am__fastdepCXX_TRUE@ $(am__mv) src/processor/$(DEPDIR)/src_processor_network_source_line_server_unittest-network_source_line_server_unittest.Tpo src/processor/$(DEPDIR)/src_processor_network_source_line_server_unittest-network_source_line_server_unittest.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/processor/network_source_line_server_unittest.cc' object='src/processor/src_processor_network_source_line_server_unittest-network_source_line_server_unittest.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_server_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/src_processor_network_source_line_server_unittest-network_source_line_server_unittest.o `test -f 'src/processor/network_source_line_server_unittest.cc' || echo '$(srcdir)/'`src/processor/network_source_line_server_unittest.cc
src/processor/src_processor_network_source_line_server_unittest-network_source_line_server_unittest.obj: src/processor/network_source_line_server_unittest.cc
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_server_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/src_processor_network_source_line_server_unittest-network_source_line_server_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/src_processor_network_source_line_server_unittest-network_source_line_server_unittest.Tpo -c -o src/processor/src_processor_network_source_line_server_unittest-network_source_line_server_unittest.obj `if test -f 'src/processor/network_source_line_server_unittest.cc'; then $(CYGPATH_W) 'src/processor/network_source_line_server_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/network_source_line_server_unittest.cc'; fi`
@am__fastdepCXX_TRUE@ $(am__mv) src/processor/$(DEPDIR)/src_processor_network_source_line_server_unittest-network_source_line_server_unittest.Tpo src/processor/$(DEPDIR)/src_processor_network_source_line_server_unittest-network_source_line_server_unittest.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/processor/network_source_line_server_unittest.cc' object='src/processor/src_processor_network_source_line_server_unittest-network_source_line_server_unittest.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_server_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/src_processor_network_source_line_server_unittest-network_source_line_server_unittest.obj `if test -f 'src/processor/network_source_line_server_unittest.cc'; then $(CYGPATH_W) 'src/processor/network_source_line_server_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/network_source_line_server_unittest.cc'; fi`
src/testing/gtest/src/src_processor_network_source_line_server_unittest-gtest-all.o: src/testing/gtest/src/gtest-all.cc
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_server_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/gtest/src/src_processor_network_source_line_server_unittest-gtest-all.o -MD -MP -MF src/testing/gtest/src/$(DEPDIR)/src_processor_network_source_line_server_unittest-gtest-all.Tpo -c -o src/testing/gtest/src/src_processor_network_source_line_server_unittest-gtest-all.o `test -f 'src/testing/gtest/src/gtest-all.cc' || echo '$(srcdir)/'`src/testing/gtest/src/gtest-all.cc
@am__fastdepCXX_TRUE@ $(am__mv) src/testing/gtest/src/$(DEPDIR)/src_processor_network_source_line_server_unittest-gtest-all.Tpo src/testing/gtest/src/$(DEPDIR)/src_processor_network_source_line_server_unittest-gtest-all.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/testing/gtest/src/gtest-all.cc' object='src/testing/gtest/src/src_processor_network_source_line_server_unittest-gtest-all.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_server_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/gtest/src/src_processor_network_source_line_server_unittest-gtest-all.o `test -f 'src/testing/gtest/src/gtest-all.cc' || echo '$(srcdir)/'`src/testing/gtest/src/gtest-all.cc
src/testing/gtest/src/src_processor_network_source_line_server_unittest-gtest-all.obj: src/testing/gtest/src/gtest-all.cc
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_server_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/gtest/src/src_processor_network_source_line_server_unittest-gtest-all.obj -MD -MP -MF src/testing/gtest/src/$(DEPDIR)/src_processor_network_source_line_server_unittest-gtest-all.Tpo -c -o src/testing/gtest/src/src_processor_network_source_line_server_unittest-gtest-all.obj `if test -f 'src/testing/gtest/src/gtest-all.cc'; then $(CYGPATH_W) 'src/testing/gtest/src/gtest-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/gtest/src/gtest-all.cc'; fi`
@am__fastdepCXX_TRUE@ $(am__mv) src/testing/gtest/src/$(DEPDIR)/src_processor_network_source_line_server_unittest-gtest-all.Tpo src/testing/gtest/src/$(DEPDIR)/src_processor_network_source_line_server_unittest-gtest-all.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/testing/gtest/src/gtest-all.cc' object='src/testing/gtest/src/src_processor_network_source_line_server_unittest-gtest-all.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_server_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/gtest/src/src_processor_network_source_line_server_unittest-gtest-all.obj `if test -f 'src/testing/gtest/src/gtest-all.cc'; then $(CYGPATH_W) 'src/testing/gtest/src/gtest-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/gtest/src/gtest-all.cc'; fi`
src/testing/src/src_processor_network_source_line_server_unittest-gmock-all.o: src/testing/src/gmock-all.cc
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_server_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/src/src_processor_network_source_line_server_unittest-gmock-all.o -MD -MP -MF src/testing/src/$(DEPDIR)/src_processor_network_source_line_server_unittest-gmock-all.Tpo -c -o src/testing/src/src_processor_network_source_line_server_unittest-gmock-all.o `test -f 'src/testing/src/gmock-all.cc' || echo '$(srcdir)/'`src/testing/src/gmock-all.cc
@am__fastdepCXX_TRUE@ $(am__mv) src/testing/src/$(DEPDIR)/src_processor_network_source_line_server_unittest-gmock-all.Tpo src/testing/src/$(DEPDIR)/src_processor_network_source_line_server_unittest-gmock-all.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/testing/src/gmock-all.cc' object='src/testing/src/src_processor_network_source_line_server_unittest-gmock-all.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_server_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/src/src_processor_network_source_line_server_unittest-gmock-all.o `test -f 'src/testing/src/gmock-all.cc' || echo '$(srcdir)/'`src/testing/src/gmock-all.cc
src/testing/src/src_processor_network_source_line_server_unittest-gmock-all.obj: src/testing/src/gmock-all.cc
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_server_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/src/src_processor_network_source_line_server_unittest-gmock-all.obj -MD -MP -MF src/testing/src/$(DEPDIR)/src_processor_network_source_line_server_unittest-gmock-all.Tpo -c -o src/testing/src/src_processor_network_source_line_server_unittest-gmock-all.obj `if test -f 'src/testing/src/gmock-all.cc'; then $(CYGPATH_W) 'src/testing/src/gmock-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/src/gmock-all.cc'; fi`
@am__fastdepCXX_TRUE@ $(am__mv) src/testing/src/$(DEPDIR)/src_processor_network_source_line_server_unittest-gmock-all.Tpo src/testing/src/$(DEPDIR)/src_processor_network_source_line_server_unittest-gmock-all.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/testing/src/gmock-all.cc' object='src/testing/src/src_processor_network_source_line_server_unittest-gmock-all.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_network_source_line_server_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/src/src_processor_network_source_line_server_unittest-gmock-all.obj `if test -f 'src/testing/src/gmock-all.cc'; then $(CYGPATH_W) 'src/testing/src/gmock-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/src/gmock-all.cc'; fi`
src/common/src_processor_stackwalker_amd64_unittest-test_assembler.o: src/common/test_assembler.cc
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_amd64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/src_processor_stackwalker_amd64_unittest-test_assembler.o -MD -MP -MF src/common/$(DEPDIR)/src_processor_stackwalker_amd64_unittest-test_assembler.Tpo -c -o src/common/src_processor_stackwalker_amd64_unittest-test_assembler.o `test -f 'src/common/test_assembler.cc' || echo '$(srcdir)/'`src/common/test_assembler.cc
@am__fastdepCXX_TRUE@ $(am__mv) src/common/$(DEPDIR)/src_processor_stackwalker_amd64_unittest-test_assembler.Tpo src/common/$(DEPDIR)/src_processor_stackwalker_amd64_unittest-test_assembler.Po

71
configure vendored
View file

@ -1769,63 +1769,6 @@ $as_echo "$ac_res" >&6; }
eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
} # ac_fn_c_check_header_compile
# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES
# ----------------------------------------------------
# Tries to find if the field MEMBER exists in type AGGR, after including
# INCLUDES, setting cache variable VAR accordingly.
ac_fn_c_check_member ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
$as_echo_n "checking for $2.$3... " >&6; }
if { as_var=$4; eval "test \"\${$as_var+set}\" = set"; }; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$5
int
main ()
{
static $2 ac_aggr;
if (ac_aggr.$3)
return 0;
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
eval "$4=yes"
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$5
int
main ()
{
static $2 ac_aggr;
if (sizeof ac_aggr.$3)
return 0;
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
eval "$4=yes"
else
eval "$4=no"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
eval ac_res=\$$4
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
} # ac_fn_c_check_member
cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
@ -5375,20 +5318,6 @@ if test x$LINUX_HOST = xfalse -a x$disable_processor = xtrue -a x$disable_tools
as_fn_error "--disable-processor and --disable-tools were specified, and not building for Linux. Nothing to build!" "$LINENO" 5
fi
ac_fn_c_check_member "$LINENO" "struct sockaddr" "sa_len" "ac_cv_member_struct_sockaddr_sa_len" "#include <sys/socket.h>
"
if test "x$ac_cv_member_struct_sockaddr_sa_len" = x""yes; then :
$as_echo "#define GET_SA_LEN(X) (((struct sockaddr*)&(X))->sa_len)" >>confdefs.h
else
$as_echo "#define GET_SA_LEN(X) (((struct sockaddr*)&(X))->sa_family == AF_INET ? sizeof(struct sockaddr_in) : \\
((struct sockaddr*)&(X))->sa_family == AF_INET6 ? sizeof(struct sockaddr_in6) : sizeof(struct sockaddr))" >>confdefs.h
fi
# Check whether --enable-selftest was given.
if test "${enable_selftest+set}" = set; then :
enableval=$enable_selftest; case "${enableval}" in

View file

@ -118,15 +118,6 @@ if test x$LINUX_HOST = xfalse -a x$disable_processor = xtrue -a x$disable_tools
AC_MSG_ERROR([--disable-processor and --disable-tools were specified, and not building for Linux. Nothing to build!])
fi
AC_CHECK_MEMBER(struct sockaddr.sa_len,
[AC_DEFINE([GET_SA_LEN(X)],[(((struct sockaddr*)&(X))->sa_len)],
[actual length of specific struct sockaddr])],
[AC_DEFINE([GET_SA_LEN(X)],
[(((struct sockaddr*)&(X))->sa_family == AF_INET ? sizeof(struct sockaddr_in) : \
((struct sockaddr*)&(X))->sa_family == AF_INET6 ? sizeof(struct sockaddr_in6) : sizeof(struct sockaddr))],
[actual length of specific struct sockaddr])],
[#include <sys/socket.h>])
AC_ARG_ENABLE(selftest,
AS_HELP_STRING([--enable-selftest],
[Run extra tests with "make check" ]

View file

@ -1,8 +1,5 @@
/* src/config.h.in. Generated from configure.ac by autoheader. */
/* actual length of specific struct sockaddr */
#undef GET_SA_LEN
/* Define to 1 if you have the <a.out.h> header file. */
#undef HAVE_A_OUT_H

View file

@ -1,187 +0,0 @@
// Copyright (c) 2010, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// NetworkSourceLineResolver implements SourceLineResolverInterface and
// SymbolSupplier using a UDP-based network protocol to communicate to a
// server process which handles the lower-level details of loading symbols
// and resolving source info. When used, it must be used simultaneously
// as the SourceLineResolver and SymbolSupplier.
//
// See network_source_line_server.h for a description of the protocol used.
// An implementation of the server side of the protocol is provided there
// as NetworkSourceLineServer.
//
// Note the network_source_line resolver can only properly load certain
// stack frame elements in a limited number of environments (Windows and CFI).
#ifndef GOOGLE_BREAKPAD_PROCESSOR_NETWORK_SOURCE_LINE_RESOLVER_H__
#define GOOGLE_BREAKPAD_PROCESSOR_NETWORK_SOURCE_LINE_RESOLVER_H__
#include <sys/socket.h>
#include <map>
#include <set>
#include "google_breakpad/common/breakpad_types.h"
#include "google_breakpad/processor/source_line_resolver_interface.h"
#include "google_breakpad/processor/stack_frame.h"
#include "google_breakpad/processor/symbol_supplier.h"
#include "processor/binarystream.h"
#include "processor/linked_ptr.h"
#include "processor/network_interface.h"
namespace google_breakpad {
using std::string;
class NetworkSourceLineResolver : public SourceLineResolverInterface,
public SymbolSupplier {
public:
// The server and port to connect to, and the
// maximum time (in milliseconds) to wait for network replies.
NetworkSourceLineResolver(const string &server,
unsigned short port,
int wait_milliseconds);
// The network interface to connect to, and maximum wait time.
NetworkSourceLineResolver(NetworkInterface *net,
int wait_milliseconds);
virtual ~NetworkSourceLineResolver();
// SourceLineResolverInterface methods, see source_line_resolver_interface.h
// for more details.
// These methods are actually NOOPs in this implementation.
// The server loads modules as a result of the GetSymbolFile call.
// Since we're both the symbol supplier and source line resolver,
// this is an optimization.
virtual bool LoadModule(const CodeModule *module, const string &map_file);
virtual bool LoadModuleUsingMapBuffer(const CodeModule *module,
const string &map_buffer);
virtual bool LoadModuleUsingMemoryBuffer(const CodeModule *module,
char *memory_buffer);
// It doesn't matter whether returns true or false, since no memory buffer
// will be allocated in GetCStringSymbolData().
virtual bool ShouldDeleteMemoryBufferAfterLoadModule() { return true; }
void UnloadModule(const CodeModule *module);
virtual bool HasModule(const CodeModule *module);
virtual void FillSourceLineInfo(StackFrame *frame);
virtual WindowsFrameInfo *FindWindowsFrameInfo(const StackFrame *frame);
virtual CFIFrameInfo *FindCFIFrameInfo(const StackFrame *frame);
// SymbolSupplier methods, see symbol_supplier.h for more details.
// Note that the server will actually load the symbol data
// in response to this request, as an optimization.
virtual SymbolResult GetSymbolFile(const CodeModule *module,
const SystemInfo *system_info,
string *symbol_file);
//FIXME: we'll never return symbol_data here, it doesn't make sense.
// the SymbolSupplier interface should just state that the supplier
// *may* fill in symbol_data if it desires, and clients should
// handle it gracefully either way.
virtual SymbolResult GetSymbolFile(const CodeModule *module,
const SystemInfo *system_info,
string *symbol_file,
string *symbol_data);
// Similar as the above GetSymbolFile() method, see the comment above.
virtual SymbolResult GetCStringSymbolData(const CodeModule *module,
const SystemInfo *system_info,
string *symbol_file,
char **symbol_data);
// Delete the data buffer allocated in GetCStringSymbolData().
// Since the above GetCStringSymbolData() won't allocate any memory at all,
// this method is no-op.
virtual void FreeSymbolData(const CodeModule *module) { }
private:
int wait_milliseconds_;
// if false, some part of our network setup failed.
bool initialized_;
// sequence number of the last request we made
u_int16_t sequence_;
NetworkInterface *net_;
// cached list of loaded modules, so we can quickly answer
// HasModule requests for modules we've already queried the
// server about, avoiding another network round-trip.
std::set<string> module_cache_;
// cached list of modules for which we don't have symbols,
// so we can short-circuit that as well.
std::set<string> no_symbols_cache_;
// Cached list of source line info, to avoid repeated GET requests
// for the same frame. In Multithreaded apps that use the same
// framework across threads, it's pretty common to hit the same
// exact set of frames in multiple threads.
// Data is stored in the cache keyed by instruction pointer
typedef std::map<u_int64_t, StackFrame> SourceCache;
SourceCache source_line_info_cache_;
// Cached list of WindowsFrameInfo/CFIFrameInfo, for the same reason.
// Stored as serialized strings to avoid shuffling around pointers.
typedef std::map<u_int64_t, string> FrameInfoCache;
typedef enum {
kWindowsFrameInfo = 0,
kCFIFrameInfo = 1,
} FrameInfoType;
FrameInfoCache frame_info_cache_[2];
// Send a message to the server, wait a certain amount of time for a reply.
// Returns true if a response is received, with the response data
// in |response|.
// Returns false if the response times out.
bool SendMessageGetResponse(const binarystream &message,
binarystream &response);
// See if this stack frame is cached, and fill in the source line info
// if so.
bool FindCachedSourceLineInfo(StackFrame *frame) const;
bool FindCachedFrameInfo(const StackFrame *frame,
FrameInfoType type,
string *info) const;
// Save this stack frame in the cache
void CacheSourceLineInfo(const StackFrame *frame);
void CacheFrameInfo(const StackFrame *frame,
FrameInfoType type,
const string &info);
// Disallow unwanted copy ctor and assignment operator
NetworkSourceLineResolver(const NetworkSourceLineResolver&);
void operator=(const NetworkSourceLineResolver&);
};
} // namespace google_breakpad
#endif // GOOGLE_BREAKPAD_PROCESSOR_NETWORK_SOURCE_LINE_RESOLVER_H__

View file

@ -1,62 +0,0 @@
// Copyright (c) 2010, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// NetworkInterface is an abstract interface for network connections.
// Its purpose is to make the network portion of certain classes
// easier to mock for testing. A concrete implementation of this
// interface can be found in udp_network.h.
#ifndef GOOGLE_BREAKPAD_PROCESSOR_NETWORK_INTERFACE_H_
#define GOOGLE_BREAKPAD_PROCESSOR_NETWORK_INTERFACE_H_
namespace google_breakpad {
class NetworkInterface {
public:
// Prepare a network connection.
// If listen is true, prepare the socket to listen for incoming
// connections.
// Returns true for success, false for failure.
virtual bool Init(bool listen) = 0;
// Send length bytes of data to the current address.
// Returns true for success, false for failure.
virtual bool Send(const char *data, size_t length) = 0;
// Wait at most timeout milliseconds, returning when data is available or
// time has expired.
// Returns true if data is available, false if a timeout or error occurred.
virtual bool WaitToReceive(int timeout) = 0;
// Read data into buffer. received will contain the number of bytes received.
// Returns true for success, false for failure.
virtual bool Receive(char *buffer, size_t buffer_size, ssize_t &received) = 0;
};
} // namespace google_breakpad
#endif // GOOGLE_BREAKPAD_PROCESSOR_NETWORK_INTERFACE_H_

View file

@ -1,162 +0,0 @@
// Copyright (c) 2010, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// This file contains constants used in the network source line server
// protocol.
// Brief protocol description:
//
// Requests are sent via UDP. All requests begin with a sequence number
// that is prepended to the response. The sequence number is opaque
// to the server, it is provided for client tracking of requests.
//
// In this file, request and response fields will be described as:
// <foo:N>, which should be read as "foo, an N byte unsigned integer
// in network byte order". Strings will be described as <foo:S>.
//
// A client request looks like:
// <seq:2><command:1><command data>
// Where <seq> is a sequence number as described above, <command>
// is one of the commands listed below, and <command data> is arbitrary
// data, defined per-command.
//
// A server response looks like:
// <seq:2><status:1><data>
// Where <seq> is the same sequence number from the request,
// <status> is one of the OK or ERROR values defined below,
// with OK signifying that the request was formatted properly and
// the response contains data, and ERROR signifying that the request
// was malformed in some way. <data> is arbitrary data, defined
// per-command below.
//
// Strings are sent as a 2-byte integer encoding the length, followed
// by <length> bytes.
//
// Valid Commands:
//==================================================
// <HAS:1><module name:S><debug file:S><debug identifier:S>
// example: <HAS><0x8>test.dll<0x8>test.pdb<0xA>0123456789
//
// Query whether the module with this filename and debug information
// has been previously loaded.
//
// Server Response:
// <loaded:1>
// Where <loaded> is one of MODULE_LOADED or MODULE_NOT_LOADED
//
//==================================================
// <LOAD:1><module name:S><debug file:S><debug identifier:S>
// example: <LOAD><0x8>test.dll<0x8>test.pdb<0xA>0123456789
//
// Request that the server find and load symbols for this module.
//
// Server Response:
// <result:1>
// Where <result> is one of:
// LOAD_NOT_FOUND
// - Symbols not found
// LOAD_INTERRUPT
// - Processing should be interrupted, symbols may be available later
// LOAD_FAIL
// - Found symbols, but failed to load them
// LOAD_OK
// - Found and loaded symbols successfully
//
//==================================================
// <GET:1><module name:S><debug file:S><debug identifier:S><module base address:8><instruction address:8>
// example: <GET><0x8>test.dll<0x8>test.pdb<0x9>0123456789<0x0000000000010000><0x0000000000011A2B>
//
// Look up source line info for this module, loaded at this base address,
// for the code at this instruction address.
//
// Server Response:
// <function:S><func_base:8><source_file:S><source_line:4><source_line_base:8>
// - As many fields as available are filled in. Fields that are not available
// will contain an empty string, or a zero for numeric values.
//==================================================
// <GETSTACKWIN:1><module name:S><debug file:S><debug identifier:S><module base address:8><instruction address:8>
// example: <GETSTACKWIN><0x8>test.dll<0x8>test.pdb<0x9>0123456789<0x0000000000010000><0x0000000000011A2B>
//
// Look up Windows stack frame info for this module, loaded at this base
// address, for the code at this instruction address.
//
// Server Response:
// <stack:S>
// The stack info is formatted as in the symbol file format, with
// "STACK " omitted, as documented at:
// http://code.google.com/p/google-breakpad/wiki/SymbolFiles
// If no Windows stack frame info is available, an empty string is returned.
//==================================================
// <GETSTACKCFI:1><module name:S><debug file:S><debug identifier:S><module base address:8><instruction address:8>
// example: <GETSTACKCFI><0x8>test.dll<0x8>test.pdb<0x9>0123456789<0x0000000000010000><0x0000000000011A2B>
//
// Look up CFI stack frame info for this module, loaded at this base
// address, for the code at this instruction address.
//
// Server Response:
// <stack:S>
// The stack info is formatted as in the symbol file format, with
// "STACK " omitted, as documented at:
// http://code.google.com/p/google-breakpad/wiki/SymbolFiles
// If no CFI stack frame info is available, an empty string is returned.
#ifndef GOOGLE_BREAKPAD_PROCESSOR_NETWORK_SOURCE_LINE_PROTOCOL_H_
#define GOOGLE_BREAKPAD_PROCESSOR_NETWORK_SOURCE_LINE_PROTOCOL_H_
#include "google_breakpad/common/breakpad_types.h"
namespace google_breakpad {
namespace source_line_protocol {
// Response status codes
const u_int8_t OK = 1;
const u_int8_t ERROR = 0;
// Commands
const u_int8_t HAS = 1;
const u_int8_t LOAD = 2;
const u_int8_t GET = 3;
const u_int8_t GETSTACKWIN = 4;
const u_int8_t GETSTACKCFI = 5;
// HAS responses
const u_int8_t MODULE_NOT_LOADED = 0;
const u_int8_t MODULE_LOADED = 1;
// LOAD responses
const u_int8_t LOAD_NOT_FOUND = 0;
const u_int8_t LOAD_INTERRUPT = 1;
const u_int8_t LOAD_FAIL = 2;
const u_int8_t LOAD_OK = 3;
} // namespace source_line_protocol
} // namespace google_breakpad
#endif // GOOGLE_BREAKPAD_PROCESSOR_NETWORK_SOURCE_LINE_PROTOCOL_H_

View file

@ -1,455 +0,0 @@
// Copyright (c) 2010, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "google_breakpad/processor/network_source_line_resolver.h"
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <sstream>
#include <vector>
#include "google_breakpad/processor/stack_frame.h"
#include "processor/binarystream.h"
#include "processor/cfi_frame_info.h"
#include "processor/network_interface.h"
#include "processor/network_source_line_protocol.h"
#include "processor/logging.h"
#include "processor/scoped_ptr.h"
#include "processor/udp_network.h"
#include "processor/windows_frame_info.h"
namespace google_breakpad {
using std::string;
using std::vector;
using std::dec;
using std::hex;
// Style guide forbids "using namespace", so at least shorten it.
namespace P = source_line_protocol;
NetworkSourceLineResolver::NetworkSourceLineResolver(const string &server,
unsigned short port,
int wait_milliseconds)
: wait_milliseconds_(wait_milliseconds),
initialized_(false),
sequence_(0),
net_(new UDPNetwork(server, port)) {
if (net_->Init(false))
initialized_ = true;
}
NetworkSourceLineResolver::NetworkSourceLineResolver(NetworkInterface *net,
int wait_milliseconds)
: wait_milliseconds_(wait_milliseconds),
initialized_(false),
sequence_(0),
net_(net) {
if (net_ && net->Init(false))
initialized_ = true;
}
NetworkSourceLineResolver::~NetworkSourceLineResolver() {
initialized_ = false;
}
bool NetworkSourceLineResolver::LoadModule(const CodeModule *module,
const string &map_file) {
// Just lie here and say it was loaded. The server always loads
// symbols immediately when they're found, since clients always
// will want to load them after finding them anyway. Since this class
// acts as both the symbol supplier and source line resolver,
// it's just a little optimization.
return true;
}
bool NetworkSourceLineResolver::LoadModuleUsingMapBuffer(
const CodeModule *module,
const string &map_buffer) {
// see above
return true;
}
bool NetworkSourceLineResolver::LoadModuleUsingMemoryBuffer(
const CodeModule *module,
char *memory_buffer) {
// see above
return true;
}
void NetworkSourceLineResolver::UnloadModule(const CodeModule *module) {
// no-op
}
bool NetworkSourceLineResolver::HasModule(const CodeModule *module) {
if (!initialized_ || !module)
return false;
// cache seen modules so the network round trip can be skipped
if (module_cache_.find(module->code_file()) != module_cache_.end())
return true;
// also cache modules for which symbols aren't found
if (no_symbols_cache_.find(module->debug_file() + module->debug_identifier())
!= no_symbols_cache_.end())
return false;
binarystream message;
message << P::HAS
<< module->code_file()
<< module->debug_file()
<< module->debug_identifier();
binarystream response;
bool got_response = SendMessageGetResponse(message, response);
u_int8_t response_data;
response >> response_data;
bool found = false;
if (got_response && !response.eof() && response_data == P::MODULE_LOADED) {
module_cache_.insert(module->code_file());
found = true;
}
return found;
}
void NetworkSourceLineResolver::FillSourceLineInfo(
StackFrame *frame) {
if (!initialized_)
return;
// if don't this module isn't loaded, can't fill source line info
if (!frame->module ||
module_cache_.find(frame->module->code_file()) == module_cache_.end())
return;
// if this frame has already been seen, return the cached copy
if (FindCachedSourceLineInfo(frame)) {
BPLOG(INFO) << "Using cached source line info";
return;
}
binarystream message;
message << P::GET
<< frame->module->code_file()
<< frame->module->debug_file()
<< frame->module->debug_identifier()
<< frame->module->base_address()
<< frame->instruction;
binarystream response;
bool got_response = SendMessageGetResponse(message, response);
if (!got_response)
return;
string function_name, source_file;
u_int32_t source_line;
u_int64_t function_base, source_line_base;
response >> function_name >> function_base
>> source_file >> source_line >> source_line_base;
if (response.eof()) {
BPLOG(ERROR) << "GET response malformed";
return;
} else {
BPLOG(INFO) << "GET response: " << function_name << " "
<< hex << function_base << " " << source_file << " "
<< dec << source_line << " " << hex
<< source_line_base;
}
frame->function_name = function_name;
frame->function_base = function_base;
frame->source_file_name = source_file;
frame->source_line = source_line;
frame->source_line_base = source_line_base;
CacheSourceLineInfo(frame);
}
WindowsFrameInfo*
NetworkSourceLineResolver::FindWindowsFrameInfo(const StackFrame *frame) {
if (!initialized_)
return NULL;
// if this module isn't loaded, can't get frame info
if (!frame->module ||
module_cache_.find(frame->module->code_file()) == module_cache_.end())
return NULL;
// check the cache first
string stack_info;
if (FindCachedFrameInfo(frame, kWindowsFrameInfo, &stack_info)) {
BPLOG(INFO) << "Using cached windows frame info";
} else {
binarystream message;
message << P::GETSTACKWIN
<< frame->module->code_file()
<< frame->module->debug_file()
<< frame->module->debug_identifier()
<< frame->module->base_address()
<< frame->instruction;
binarystream response;
if (SendMessageGetResponse(message, response)) {
response >> stack_info;
CacheFrameInfo(frame, kWindowsFrameInfo, stack_info);
}
}
WindowsFrameInfo *info = NULL;
if (!stack_info.empty()) {
int type;
u_int64_t rva, code_size;
info = WindowsFrameInfo::ParseFromString(stack_info,
type,
rva,
code_size);
}
return info;
}
CFIFrameInfo*
NetworkSourceLineResolver::FindCFIFrameInfo(const StackFrame *frame)
{
if (!initialized_)
return NULL;
// if this module isn't loaded, can't get frame info
if (!frame->module ||
module_cache_.find(frame->module->code_file()) == module_cache_.end())
return NULL;
string stack_info;
if (FindCachedFrameInfo(frame, kCFIFrameInfo, &stack_info)) {
BPLOG(INFO) << "Using cached CFI frame info";
} else {
binarystream message;
message << P::GETSTACKCFI
<< frame->module->code_file()
<< frame->module->debug_file()
<< frame->module->debug_identifier()
<< frame->module->base_address()
<< frame->instruction;
binarystream response;
if (SendMessageGetResponse(message, response)) {
response >> stack_info;
CacheFrameInfo(frame, kCFIFrameInfo, stack_info);
}
}
if (!stack_info.empty()) {
scoped_ptr<CFIFrameInfo> info(new CFIFrameInfo());
CFIFrameInfoParseHandler handler(info.get());
CFIRuleParser parser(&handler);
if (parser.Parse(stack_info))
return info.release();
}
return NULL;
}
SymbolSupplier::SymbolResult
NetworkSourceLineResolver::GetSymbolFile(const CodeModule *module,
const SystemInfo *system_info,
string *symbol_file) {
BPLOG_IF(ERROR, !symbol_file) << "NetworkSourceLineResolver::GetSymbolFile "
"requires |symbol_file|";
assert(symbol_file);
if (!initialized_)
return NOT_FOUND;
if (no_symbols_cache_.find(module->debug_file() + module->debug_identifier())
!= no_symbols_cache_.end())
return NOT_FOUND;
binarystream message;
message << P::LOAD
<< module->code_file()
<< module->debug_file()
<< module->debug_identifier();
binarystream response;
bool got_response = SendMessageGetResponse(message, response);
if (!got_response) {
// Didn't get a response, which is the same as not having symbols.
// Don't cache this, though, to force a retry if the client asks for
// symbols for the same file again.
return NOT_FOUND;
}
u_int8_t response_data;
response >> response_data;
if (response.eof()) {
BPLOG(ERROR) << "Malformed LOAD response";
return NOT_FOUND;
}
if (response_data == P::LOAD_NOT_FOUND || response_data == P::LOAD_FAIL) {
// Received NOT or FAIL, symbols not present or failed to load them.
// Same problem to the client any way you look at it.
// Cache this module to avoid pointless retry.
no_symbols_cache_.insert(module->debug_file() + module->debug_identifier());
return NOT_FOUND;
} else if (response_data == P::LOAD_INTERRUPT) {
return INTERRUPT;
}
// otherwise, OK
module_cache_.insert(module->code_file());
*symbol_file = "<loaded on server>";
return FOUND;
}
SymbolSupplier::SymbolResult
NetworkSourceLineResolver::GetSymbolFile(const CodeModule *module,
const SystemInfo *system_info,
string *symbol_file,
string *symbol_data) {
if(symbol_data)
symbol_data->clear();
return GetSymbolFile(module, system_info, symbol_file);
}
SymbolSupplier::SymbolResult
NetworkSourceLineResolver::GetCStringSymbolData(
const CodeModule *module,
const SystemInfo *system_info,
string *symbol_file,
char **symbol_data) {
if (symbol_data)
delete *symbol_data;
return GetSymbolFile(module, system_info, symbol_file);
}
bool NetworkSourceLineResolver::SendMessageGetResponse(
const binarystream &message,
binarystream &response) {
binarystream sequence_stream;
u_int16_t sent_sequence = sequence_;
sequence_stream << sequence_;
++sequence_;
string message_string = sequence_stream.str();
message_string.append(message.str());
BPLOG(INFO) << "Sending " << message_string.length() << " bytes";
if (!net_->Send(message_string.c_str(), message_string.length()))
return false;
bool done = false;
while (!done) {
if (!net_->WaitToReceive(wait_milliseconds_))
return false;
vector<char> buffer(1024);
ssize_t received_bytes;
if (!net_->Receive(&buffer[0], buffer.size(), received_bytes))
return false;
BPLOG(INFO) << "received " << received_bytes << " bytes";
buffer.resize(received_bytes);
response.str(string(&buffer[0], buffer.size()));
response.rewind();
u_int16_t read_sequence;
u_int8_t status;
response >> read_sequence >> status;
if (response.eof()) {
BPLOG(ERROR) << "malformed response, missing sequence number or status";
return false;
}
if (read_sequence < sent_sequence) // old packet
continue;
if (read_sequence != sent_sequence) {
// not expecting this packet, just error
BPLOG(ERROR) << "error, got sequence number " << read_sequence
<< ", expected " << sent_sequence;
return false;
}
// This is the expected packet, so even if it's an error this loop is done
done = true;
if (status != P::OK) {
BPLOG(ERROR) << "received an ER response packet";
return false;
}
// the caller will process the rest of response
}
return true;
}
bool NetworkSourceLineResolver::FindCachedSourceLineInfo(StackFrame *frame)
const
{
SourceCache::const_iterator iter =
source_line_info_cache_.find(frame->instruction);
if (iter == source_line_info_cache_.end())
return false;
const StackFrame &f = iter->second;
frame->function_name = f.function_name;
frame->function_base = f.function_base;
frame->source_file_name = f.source_file_name;
frame->source_line = f.source_line;
frame->source_line_base = f.source_line_base;
return true;
}
bool NetworkSourceLineResolver::FindCachedFrameInfo(
const StackFrame *frame,
FrameInfoType type,
string *info) const
{
FrameInfoCache::const_iterator iter =
frame_info_cache_[type].find(frame->instruction);
if (iter == frame_info_cache_[type].end())
return false;
*info = iter->second;
return true;
}
void NetworkSourceLineResolver::CacheSourceLineInfo(const StackFrame *frame) {
StackFrame f(*frame);
// can't hang onto this pointer, the caller owns it
f.module = NULL;
source_line_info_cache_[frame->instruction] = f;
}
void NetworkSourceLineResolver::CacheFrameInfo(
const StackFrame *frame,
FrameInfoType type,
const string &info) {
frame_info_cache_[type][frame->instruction] = info;
}
} // namespace google_breakpad

View file

@ -1,195 +0,0 @@
// Copyright (c) 2010, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Full system test for NetworkSourceLineResolver / NetworkSourceLineServer.
// Forks a background process to run a NetworkSourceLineServer, then
// instantiates a MinidumpProcessor with a NetworkSourceLineResolver to
// connect to the background server and process a minidump.
#include <string>
#include <signal.h>
#include <sys/wait.h>
#include <unistd.h>
#include "breakpad_googletest_includes.h"
#include "google_breakpad/processor/basic_source_line_resolver.h"
#include "google_breakpad/processor/call_stack.h"
#include "google_breakpad/processor/minidump_processor.h"
#include "google_breakpad/processor/process_state.h"
#include "google_breakpad/processor/network_source_line_resolver.h"
#include "processor/simple_symbol_supplier.h"
#include "processor/network_source_line_server.h"
#include "processor/simple_symbol_supplier.h"
#include "processor/udp_network.h"
namespace {
using std::string;
using google_breakpad::BasicSourceLineResolver;
using google_breakpad::CallStack;
using google_breakpad::MinidumpProcessor;
using google_breakpad::NetworkSourceLineResolver;
using google_breakpad::NetworkSourceLineServer;
using google_breakpad::ProcessState;
using google_breakpad::SimpleSymbolSupplier;
using google_breakpad::UDPNetwork;
static const char *kSystemInfoOS = "Windows NT";
static const char *kSystemInfoOSShort = "windows";
static const char *kSystemInfoOSVersion = "5.1.2600 Service Pack 2";
static const char *kSystemInfoCPU = "x86";
static const char *kSystemInfoCPUInfo =
"GenuineIntel family 6 model 13 stepping 8";
bool exitProcess = false;
void signal_handler(int signal) {
if (signal == SIGINT)
exitProcess = true;
}
void RunSourceLineServer(int fd) {
// Set a signal handler so the parent process
// can signal this process to end.
signal(SIGINT, signal_handler);
BasicSourceLineResolver resolver;
SimpleSymbolSupplier supplier(string(getenv("srcdir") ?
getenv("srcdir") : ".") +
"/src/processor/testdata/symbols/");
UDPNetwork net("localhost",
0, // pick a free port
true); // IPv4 only
NetworkSourceLineServer server(&supplier, &resolver, &net,
0); // no source line limit
unsigned short port = -1;
bool initialized = server.Initialize();
if (initialized)
port = net.port();
// send port number back to parent
ssize_t written = write(fd, &port, sizeof(port));
close(fd);
if (!initialized || written != sizeof(port))
return;
while (!exitProcess) {
server.RunOnce(100);
}
}
TEST(NetworkSourceLineResolverServer, SystemTest) {
int fds[2];
ASSERT_EQ(0, pipe(fds));
// Fork a background process to run the server.
pid_t pid = fork();
if (pid == 0) {
close(fds[0]);
RunSourceLineServer(fds[1]);
exit(0);
}
ASSERT_NE(-1, pid);
// Wait for the background process to return info about the port.
close(fds[1]);
unsigned short port;
ssize_t nbytes = read(fds[0], &port, sizeof(port));
ASSERT_EQ(sizeof(port), nbytes);
ASSERT_NE(-1, port);
NetworkSourceLineResolver resolver("localhost", port,
5000); // wait at most 5 seconds for reply
MinidumpProcessor processor(&resolver, &resolver);
// this is all copied from minidump_processor_unittest.cc
string minidump_file = string(getenv("srcdir") ? getenv("srcdir") : ".") +
"/src/processor/testdata/minidump2.dmp";
ProcessState state;
ASSERT_EQ(processor.Process(minidump_file, &state),
google_breakpad::PROCESS_OK);
EXPECT_EQ(state.system_info()->os, kSystemInfoOS);
EXPECT_EQ(state.system_info()->os_short, kSystemInfoOSShort);
EXPECT_EQ(state.system_info()->os_version, kSystemInfoOSVersion);
EXPECT_EQ(state.system_info()->cpu, kSystemInfoCPU);
EXPECT_EQ(state.system_info()->cpu_info, kSystemInfoCPUInfo);
ASSERT_TRUE(state.crashed());
EXPECT_EQ(state.crash_reason(), "EXCEPTION_ACCESS_VIOLATION_WRITE");
EXPECT_EQ(state.crash_address(), 0x45U);
ASSERT_EQ(state.threads()->size(), size_t(1));
ASSERT_EQ(state.requesting_thread(), 0);
CallStack *stack = state.threads()->at(0);
ASSERT_TRUE(stack);
ASSERT_EQ(stack->frames()->size(), 4U);
// Can now only set non-empty/zero values for function_name, source_file_name
// and source line on certain platforms (ie. windows), so those are untested.
ASSERT_TRUE(stack->frames()->at(0)->module);
EXPECT_EQ(stack->frames()->at(0)->module->base_address(), 0x400000U);
EXPECT_EQ(stack->frames()->at(0)->module->code_file(), "c:\\test_app.exe");
ASSERT_TRUE(stack->frames()->at(1)->module);
EXPECT_EQ(stack->frames()->at(1)->module->base_address(), 0x400000U);
EXPECT_EQ(stack->frames()->at(1)->module->code_file(), "c:\\test_app.exe");
// This comes from the CRT
ASSERT_TRUE(stack->frames()->at(2)->module);
EXPECT_EQ(stack->frames()->at(2)->module->base_address(), 0x400000U);
EXPECT_EQ(stack->frames()->at(2)->module->code_file(), "c:\\test_app.exe");
// OS frame, kernel32.dll
ASSERT_TRUE(stack->frames()->at(3)->module);
EXPECT_EQ(stack->frames()->at(3)->module->base_address(), 0x7c800000U);
EXPECT_EQ(stack->frames()->at(3)->module->code_file(),
"C:\\WINDOWS\\system32\\kernel32.dll");
ASSERT_EQ(state.modules()->module_count(), 13U);
ASSERT_TRUE(state.modules()->GetMainModule());
EXPECT_EQ(state.modules()->GetMainModule()->code_file(), "c:\\test_app.exe");
EXPECT_FALSE(state.modules()->GetModuleForAddress(0));
EXPECT_EQ(state.modules()->GetMainModule(),
state.modules()->GetModuleForAddress(0x400000));
EXPECT_EQ(state.modules()->GetModuleForAddress(0x7c801234)->debug_file(),
"kernel32.pdb");
EXPECT_EQ(state.modules()->GetModuleForAddress(0x77d43210)->version(),
"5.1.2600.2622");
// Kill background process
kill(pid, SIGINT);
ASSERT_EQ(pid, waitpid(pid, NULL, 0));
}
}
int main(int argc, char *argv[]) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}

View file

@ -1,535 +0,0 @@
// Copyright (c) 2010, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Unit tests for NetworkSourceLineResolver.
#include <string>
#include "breakpad_googletest_includes.h"
#include "google_breakpad/processor/network_source_line_resolver.h"
#include "google_breakpad/processor/stack_frame.h"
#include "google_breakpad/processor/symbol_supplier.h"
#include "processor/basic_code_module.h"
#include "processor/binarystream.h"
#include "processor/cfi_frame_info.h"
#include "processor/network_interface.h"
#include "processor/network_source_line_protocol.h"
#include "processor/windows_frame_info.h"
namespace google_breakpad {
class MockNetwork : public NetworkInterface {
public:
MockNetwork() {}
MOCK_METHOD1(Init, bool(bool listen));
MOCK_METHOD2(Send, bool(const char *data, size_t length));
MOCK_METHOD1(WaitToReceive, bool(int timeout));
MOCK_METHOD3(Receive, bool(char *buffer, size_t buffer_size,
ssize_t &received));
};
}
namespace {
using std::string;
using google_breakpad::binarystream;
using google_breakpad::BasicCodeModule;
using google_breakpad::CFIFrameInfo;
using google_breakpad::MockNetwork;
using google_breakpad::NetworkSourceLineResolver;
using google_breakpad::StackFrame;
using google_breakpad::SymbolSupplier;
using google_breakpad::WindowsFrameInfo;
using ::testing::_;
using ::testing::Invoke;
using ::testing::Return;
using namespace google_breakpad::source_line_protocol;
class TestNetworkSourceLineResolver : public ::testing::Test {
public:
TestNetworkSourceLineResolver() : resolver(NULL) {}
void SetUp() {
EXPECT_CALL(net, Init(false)).WillOnce(Return(true));
resolver = new NetworkSourceLineResolver(&net, 0);
}
NetworkSourceLineResolver *resolver;
MockNetwork net;
};
bool GeneratePositiveHasResponse(char *buffer, size_t buffer_size,
ssize_t &received) {
binarystream stream;
stream << u_int16_t(0) << OK << MODULE_LOADED;
string s = stream.str();
received = s.length();
memcpy(buffer, s.c_str(), s.length());
return true;
}
bool GenerateNegativeHasResponse(char *buffer, size_t buffer_size,
ssize_t &received) {
binarystream stream;
stream << u_int16_t(1) << OK << MODULE_NOT_LOADED;
string s = stream.str();
received = s.length();
memcpy(buffer, s.c_str(), s.length());
return true;
}
TEST_F(TestNetworkSourceLineResolver, TestHasMessages) {
EXPECT_CALL(net, Send(_,_))
.WillOnce(Return(true))
.WillOnce(Return(true));
EXPECT_CALL(net, WaitToReceive(0))
.WillOnce(Return(true))
.WillOnce(Return(true));
EXPECT_CALL(net, Receive(_,_,_))
.WillOnce(Invoke(GeneratePositiveHasResponse))
.WillOnce(Invoke(GenerateNegativeHasResponse));
ASSERT_NE(resolver, (NetworkSourceLineResolver*)NULL);
BasicCodeModule module(0x0, 0x0, "test.dll", "test.pdb", "ABCD", "", "");
EXPECT_TRUE(resolver->HasModule(&module));
BasicCodeModule module2(0x0, 0x0, "test2.dll", "test2.pdb", "FFFF", "", "");
EXPECT_FALSE(resolver->HasModule(&module2));
// calling again should hit the cache, and not the network
EXPECT_TRUE(resolver->HasModule(&module));
}
bool GenerateErrorResponse(char *buffer, size_t buffer_size,
ssize_t &received) {
binarystream stream;
stream << u_int16_t(0) << ERROR;
string s = stream.str();
received = s.length();
memcpy(buffer, s.c_str(), s.length());
return true;
}
TEST_F(TestNetworkSourceLineResolver, TestHasErrorResponse) {
EXPECT_CALL(net, Send(_,_))
.WillOnce(Return(true));
EXPECT_CALL(net, WaitToReceive(0))
.WillOnce(Return(true));
EXPECT_CALL(net, Receive(_,_,_))
.WillOnce(Invoke(GenerateErrorResponse));
ASSERT_NE(resolver, (NetworkSourceLineResolver*)NULL);
BasicCodeModule module(0x0, 0x0, "test.dll", "test.pdb", "ABCD", "", "");
// error packet should function as a not found
EXPECT_FALSE(resolver->HasModule(&module));
}
// GenerateLoadResponse will generate (LOAD_NOT_FOUND, LOAD_INTERRUPT,
// LOAD_FAIL, LOAD_OK) in order.
class LoadHelper {
public:
LoadHelper() : response(LOAD_NOT_FOUND), sequence(0) {}
bool GenerateLoadResponse(char *buffer, size_t buffer_size,
ssize_t &received) {
binarystream stream;
stream << sequence << OK << response;
string s = stream.str();
received = s.length();
memcpy(buffer, s.c_str(), s.length());
++sequence;
++response;
return true;
}
u_int8_t response;
u_int16_t sequence;
};
TEST_F(TestNetworkSourceLineResolver, TestLoadMessages) {
EXPECT_CALL(net, Send(_,_))
.Times(4)
.WillRepeatedly(Return(true));
EXPECT_CALL(net, WaitToReceive(0))
.Times(4)
.WillRepeatedly(Return(true));
LoadHelper helper;
EXPECT_CALL(net, Receive(_,_,_))
.Times(4)
.WillRepeatedly(Invoke(&helper, &LoadHelper::GenerateLoadResponse));
ASSERT_NE(resolver, (NetworkSourceLineResolver*)NULL);
BasicCodeModule module(0x0, 0x0, "test.dll", "test.pdb", "ABCD", "", "");
string s;
EXPECT_EQ(SymbolSupplier::NOT_FOUND,
resolver->GetSymbolFile(&module, NULL, &s));
BasicCodeModule module2(0x0, 0x0, "test2.dll", "test2.pdb", "FFFF", "", "");
EXPECT_EQ(SymbolSupplier::INTERRUPT,
resolver->GetSymbolFile(&module2, NULL, &s));
BasicCodeModule module3(0x0, 0x0, "test3.dll", "test3.pdb", "0000", "", "");
// a FAIL result from the network should come back as NOT_FOUND
EXPECT_EQ(SymbolSupplier::NOT_FOUND,
resolver->GetSymbolFile(&module3, NULL, &s));
BasicCodeModule module4(0x0, 0x0, "test4.dll", "test4.pdb", "1010", "", "");
EXPECT_EQ(SymbolSupplier::FOUND,
resolver->GetSymbolFile(&module4, NULL, &s));
// calling this should hit the cache, and not the network
EXPECT_TRUE(resolver->HasModule(&module4));
}
TEST_F(TestNetworkSourceLineResolver, TestLoadErrorResponse) {
EXPECT_CALL(net, Send(_,_))
.WillOnce(Return(true));
EXPECT_CALL(net, WaitToReceive(0))
.WillOnce(Return(true));
EXPECT_CALL(net, Receive(_,_,_))
.WillOnce(Invoke(GenerateErrorResponse));
ASSERT_NE(resolver, (NetworkSourceLineResolver*)NULL);
BasicCodeModule module(0x0, 0x0, "test.dll", "test.pdb", "ABCD", "", "");
string s;
// error packet should function as NOT_FOUND response
EXPECT_EQ(SymbolSupplier::NOT_FOUND,
resolver->GetSymbolFile(&module, NULL, &s));
}
class GetHelper {
public:
GetHelper() : sequence(1) {}
bool GenerateGetResponse(char *buffer, size_t buffer_size,
ssize_t &received) {
binarystream stream;
stream << sequence << OK;
switch(sequence) {
case 1:
// return full info
stream << string("test()") << u_int64_t(0x1000) << string("test.c")
<< u_int32_t(1) << u_int64_t(0x1010);
break;
case 2:
// return full info
stream << string("test2()") << u_int64_t(0x2000) << string("test2.c")
<< u_int32_t(2) << u_int64_t(0x2020);
break;
case 3:
// return just function name
stream << string("test3()") << u_int64_t(0x4000) << string("")
<< u_int32_t(0) << u_int64_t(0);
break;
}
string s = stream.str();
received = s.length();
memcpy(buffer, s.c_str(), s.length());
++sequence;
return true;
}
u_int16_t sequence;
};
TEST_F(TestNetworkSourceLineResolver, TestGetMessages) {
EXPECT_CALL(net, Send(_,_))
.Times(4)
.WillRepeatedly(Return(true));
EXPECT_CALL(net, WaitToReceive(0))
.Times(4)
.WillRepeatedly(Return(true));
GetHelper helper;
EXPECT_CALL(net, Receive(_,_,_))
.Times(4)
.WillOnce(Invoke(GeneratePositiveHasResponse))
.WillRepeatedly(Invoke(&helper, &GetHelper::GenerateGetResponse));
BasicCodeModule module(0x0, 0x0, "test.dll", "test.pdb", "ABCD", "", "");
// The resolver has to think the module is loaded before it will respond
// to GET requests for that module.
EXPECT_TRUE(resolver->HasModule(&module));
StackFrame frame;
frame.module = &module;
frame.instruction = 0x1010;
resolver->FillSourceLineInfo(&frame);
EXPECT_EQ("test()", frame.function_name);
EXPECT_EQ(0x1000, frame.function_base);
EXPECT_EQ("test.c", frame.source_file_name);
EXPECT_EQ(1, frame.source_line);
EXPECT_EQ(0x1010, frame.source_line_base);
StackFrame frame2;
frame2.module = &module;
frame2.instruction = 0x2020;
resolver->FillSourceLineInfo(&frame2);
EXPECT_EQ("test2()", frame2.function_name);
EXPECT_EQ(0x2000, frame2.function_base);
EXPECT_EQ("test2.c", frame2.source_file_name);
EXPECT_EQ(2, frame2.source_line);
EXPECT_EQ(0x2020, frame2.source_line_base);
StackFrame frame3;
frame3.module = &module;
frame3.instruction = 0x4040;
resolver->FillSourceLineInfo(&frame3);
EXPECT_EQ("test3()", frame3.function_name);
EXPECT_EQ(0x4000, frame3.function_base);
EXPECT_EQ("", frame3.source_file_name);
EXPECT_EQ(0, frame3.source_line);
EXPECT_EQ(0, frame3.source_line_base);
// this should come from the cache and not hit the network
StackFrame frame4;
frame4.module = &module;
frame4.instruction = 0x1010;
resolver->FillSourceLineInfo(&frame4);
EXPECT_EQ("test()", frame4.function_name);
EXPECT_EQ(0x1000, frame4.function_base);
EXPECT_EQ("test.c", frame4.source_file_name);
EXPECT_EQ(1, frame4.source_line);
EXPECT_EQ(0x1010, frame4.source_line_base);
// this should also be cached
StackFrame frame5;
frame5.module = &module;
frame5.instruction = 0x4040;
resolver->FillSourceLineInfo(&frame5);
EXPECT_EQ("test3()", frame5.function_name);
EXPECT_EQ(0x4000, frame5.function_base);
EXPECT_EQ("", frame5.source_file_name);
EXPECT_EQ(0, frame5.source_line);
EXPECT_EQ(0, frame5.source_line_base);
}
class GetStackWinHelper {
public:
GetStackWinHelper() : sequence(1) {}
bool GenerateGetStackWinResponse(char *buffer, size_t buffer_size,
ssize_t &received) {
binarystream stream;
stream << sequence << OK;
switch(sequence) {
case 1:
// return full info including program string
stream << string("0 0 0 1 2 3 a ff f00 1 x y =");
break;
case 2:
// return full info, no program string
stream << string("0 0 0 1 2 3 a ff f00 0 1");
break;
case 3:
// return empty string
stream << string("");
break;
}
string s = stream.str();
received = s.length();
memcpy(buffer, s.c_str(), s.length());
++sequence;
return true;
}
u_int16_t sequence;
};
TEST_F(TestNetworkSourceLineResolver, TestGetStackWinMessages) {
EXPECT_CALL(net, Send(_,_))
.Times(4)
.WillRepeatedly(Return(true));
EXPECT_CALL(net, WaitToReceive(0))
.Times(4)
.WillRepeatedly(Return(true));
GetStackWinHelper helper;
EXPECT_CALL(net, Receive(_,_,_))
.Times(4)
.WillOnce(Invoke(GeneratePositiveHasResponse))
.WillRepeatedly(Invoke(&helper,
&GetStackWinHelper::GenerateGetStackWinResponse));
BasicCodeModule module(0x0, 0x0, "test.dll", "test.pdb", "ABCD", "", "");
// The resolver has to think the module is loaded before it will respond
// to GETSTACKWIN requests for that module.
EXPECT_TRUE(resolver->HasModule(&module));
StackFrame frame;
frame.module = &module;
frame.instruction = 0x1010;
WindowsFrameInfo *info = resolver->FindWindowsFrameInfo(&frame);
ASSERT_NE((WindowsFrameInfo*)NULL, info);
EXPECT_EQ(0x1, info->prolog_size);
EXPECT_EQ(0x2, info->epilog_size);
EXPECT_EQ(0x3, info->parameter_size);
EXPECT_EQ(0xa, info->saved_register_size);
EXPECT_EQ(0xff, info->local_size);
EXPECT_EQ(0xf00, info->max_stack_size);
EXPECT_EQ("x y =", info->program_string);
delete info;
StackFrame frame2;
frame2.module = &module;
frame2.instruction = 0x2020;
info = resolver->FindWindowsFrameInfo(&frame2);
ASSERT_NE((WindowsFrameInfo*)NULL, info);
EXPECT_EQ(0x1, info->prolog_size);
EXPECT_EQ(0x2, info->epilog_size);
EXPECT_EQ(0x3, info->parameter_size);
EXPECT_EQ(0xa, info->saved_register_size);
EXPECT_EQ(0xff, info->local_size);
EXPECT_EQ(0xf00, info->max_stack_size);
EXPECT_EQ("", info->program_string);
EXPECT_EQ(true, info->allocates_base_pointer);
delete info;
StackFrame frame3;
frame3.module = &module;
frame3.instruction = 0x4040;
info = resolver->FindWindowsFrameInfo(&frame3);
EXPECT_EQ((WindowsFrameInfo*)NULL, info);
// this should come from the cache and not hit the network
StackFrame frame4;
frame4.module = &module;
frame4.instruction = 0x1010;
info = resolver->FindWindowsFrameInfo(&frame4);
ASSERT_NE((WindowsFrameInfo*)NULL, info);
EXPECT_EQ(0x1, info->prolog_size);
EXPECT_EQ(0x2, info->epilog_size);
EXPECT_EQ(0x3, info->parameter_size);
EXPECT_EQ(0xa, info->saved_register_size);
EXPECT_EQ(0xff, info->local_size);
EXPECT_EQ(0xf00, info->max_stack_size);
EXPECT_EQ("x y =", info->program_string);
delete info;
// this should also be cached
StackFrame frame5;
frame5.module = &module;
frame5.instruction = 0x4040;
info = resolver->FindWindowsFrameInfo(&frame5);
EXPECT_EQ((WindowsFrameInfo*)NULL, info);
}
class GetStackCFIHelper {
public:
GetStackCFIHelper() : sequence(1) {}
bool GenerateGetStackCFIResponse(char *buffer, size_t buffer_size,
ssize_t &received) {
binarystream stream;
stream << sequence << OK;
switch(sequence) {
case 1:
// return .cfa, .ra, registers
stream << string(".cfa: 1234 .ra: .cfa 5 + r0: abc xyz r2: 10 10");
break;
case 2:
// return just .cfa
stream << string(".cfa: xyz");
break;
case 3:
// return empty string
stream << string("");
break;
}
string s = stream.str();
received = s.length();
memcpy(buffer, s.c_str(), s.length());
++sequence;
return true;
}
u_int16_t sequence;
};
TEST_F(TestNetworkSourceLineResolver, TestGetStackCFIMessages) {
EXPECT_CALL(net, Send(_,_))
.Times(4)
.WillRepeatedly(Return(true));
EXPECT_CALL(net, WaitToReceive(0))
.Times(4)
.WillRepeatedly(Return(true));
GetStackCFIHelper helper;
EXPECT_CALL(net, Receive(_,_,_))
.Times(4)
.WillOnce(Invoke(GeneratePositiveHasResponse))
.WillRepeatedly(Invoke(&helper,
&GetStackCFIHelper::GenerateGetStackCFIResponse));
BasicCodeModule module(0x0, 0x0, "test.dll", "test.pdb", "ABCD", "", "");
// The resolver has to think the module is loaded before it will respond
// to GETSTACKCFI requests for that module.
EXPECT_TRUE(resolver->HasModule(&module));
StackFrame frame;
frame.module = &module;
frame.instruction = 0x1010;
CFIFrameInfo *info = resolver->FindCFIFrameInfo(&frame);
ASSERT_NE((CFIFrameInfo*)NULL, info);
// Ostensibly we would check the internal data structure, but
// we'd have to either mock out some other classes or get internal access,
// so this is easier.
EXPECT_EQ(".cfa: 1234 .ra: .cfa 5 + r0: abc xyz r2: 10 10",
info->Serialize());
delete info;
StackFrame frame2;
frame2.module = &module;
frame2.instruction = 0x2020;
info = resolver->FindCFIFrameInfo(&frame2);
ASSERT_NE((CFIFrameInfo*)NULL, info);
EXPECT_EQ(".cfa: xyz", info->Serialize());
delete info;
StackFrame frame3;
frame3.module = &module;
frame3.instruction = 0x4040;
info = resolver->FindCFIFrameInfo(&frame3);
EXPECT_EQ((CFIFrameInfo*)NULL, info);
// this should come from the cache and not hit the network
StackFrame frame4;
frame4.module = &module;
frame4.instruction = 0x1010;
info = resolver->FindCFIFrameInfo(&frame4);
ASSERT_NE((CFIFrameInfo*)NULL, info);
EXPECT_EQ(".cfa: 1234 .ra: .cfa 5 + r0: abc xyz r2: 10 10",
info->Serialize());
delete info;
// this should also be cached
StackFrame frame5;
frame5.module = &module;
frame5.instruction = 0x4040;
info = resolver->FindCFIFrameInfo(&frame5);
EXPECT_EQ((CFIFrameInfo*)NULL, info);
}
TEST_F(TestNetworkSourceLineResolver, TestBogusData) {
EXPECT_FALSE(resolver->HasModule(NULL));
StackFrame frame;
frame.module = NULL;
frame.instruction = 0x1000;
resolver->FillSourceLineInfo(&frame);
EXPECT_EQ("", frame.function_name);
EXPECT_EQ(0x0, frame.function_base);
EXPECT_EQ("", frame.source_file_name);
EXPECT_EQ(0, frame.source_line);
EXPECT_EQ(0x0, frame.source_line_base);
EXPECT_EQ((WindowsFrameInfo*)NULL, resolver->FindWindowsFrameInfo(&frame));
}
} // namespace
int main(int argc, char *argv[]) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}

View file

@ -1,435 +0,0 @@
// Copyright (c) 2010, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <algorithm>
#include <iostream>
#include <sstream>
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "google_breakpad/processor/code_module.h"
#include "google_breakpad/processor/stack_frame.h"
#include "processor/basic_code_module.h"
#include "processor/binarystream.h"
#include "processor/cfi_frame_info.h"
#include "processor/logging.h"
#include "processor/network_source_line_protocol.h"
#include "processor/network_source_line_server.h"
#include "processor/tokenize.h"
#include "processor/windows_frame_info.h"
namespace google_breakpad {
using std::dec;
using std::find;
using std::hex;
// Style guide forbids "using namespace", so at least shorten it.
namespace P = source_line_protocol;
bool NetworkSourceLineServer::Initialize() {
if (net_->Init(true))
initialized_ = true;
return initialized_;
}
bool NetworkSourceLineServer::RunForever() {
if (!initialized_ && !Initialize())
return false;
BPLOG(INFO) << "Running forever...";
while (true) {
RunOnce(5000);
}
// not reached
return true;
}
bool NetworkSourceLineServer::RunOnce(int wait_milliseconds) {
if (!initialized_ && !Initialize())
return false;
if (!net_->WaitToReceive(wait_milliseconds))
return false;
//TODO(ted): loop, processing packets until wait_milliseconds
// is actually exhausted?
vector<char> buffer(1024);
ssize_t received_bytes;
if (!net_->Receive(&buffer[0], buffer.size(), received_bytes))
return false;
buffer.resize(received_bytes);
binarystream request(&buffer[0], buffer.size());
binarystream response;
if (!HandleRequest(request, response))
return false;
string response_string = response.str();
if (!net_->Send(response_string.c_str(), response_string.length()))
return false;
return true;
}
bool NetworkSourceLineServer::HandleRequest(binarystream &request,
binarystream &response) {
u_int16_t sequence_number;
u_int8_t command;
request >> sequence_number >> command;
if (request.eof()) {
BPLOG(ERROR) << "Malformed request, missing sequence number or command";
return false;
}
response.rewind();
response << sequence_number;
switch(command) {
case P::HAS:
HandleHas(request, response);
break;
case P::LOAD:
HandleLoad(request, response);
break;
case P::GET:
HandleGet(request, response);
break;
case P::GETSTACKWIN:
HandleGetStackWin(request, response);
break;
case P::GETSTACKCFI:
HandleGetStackCFI(request, response);
break;
default:
BPLOG(ERROR) << "Unknown command " << int(command);
response << P::ERROR;
break;
}
return true;
}
void NetworkSourceLineServer::HandleHas(binarystream &message,
binarystream &response) {
string module_name, debug_file, debug_id;
message >> module_name >> debug_file >> debug_id;
if (message.eof()) {
BPLOG(ERROR) << "HAS message malformed";
response << P::ERROR;
return;
}
BPLOG(INFO) << "Received message HAS " << module_name
<< " " << debug_file
<< " " << debug_id;
// Need to lie about the module name here, since BasicSourceLineResolver
// uses only the module name for unique modules, but we want to allow
// multiple versions of the same named module in here.
BasicCodeModule module((u_int64_t)0, (u_int64_t)0,
module_name + "|" + debug_file + "|" + debug_id, "",
debug_file, debug_id, "");
u_int8_t data;
if (resolver_) {
data = resolver_->HasModule(&module)
? P::MODULE_LOADED : P::MODULE_NOT_LOADED;
} else {
data = P::MODULE_NOT_LOADED;
}
response << P::OK << data;
}
void NetworkSourceLineServer::HandleLoad(binarystream &message,
binarystream &response) {
string module_name, debug_file, debug_id;
message >> module_name >> debug_file >> debug_id;
if (message.eof()) {
BPLOG(ERROR) << "LOAD message malformed";
response << P::ERROR;
return;
}
BPLOG(INFO) << "Received message LOAD " << module_name
<< " " << debug_file
<< " " << debug_id;
u_int8_t reply;
// stub out the bare minimum here
BasicCodeModule module((u_int64_t)0, (u_int64_t)0,
module_name + "|" + debug_file + "|" + debug_id, "",
debug_file, debug_id, "");
if (resolver_->HasModule(&module)) {
// just short-circuit the rest of this, since it's already loaded
BPLOG(INFO) << "Got LOAD for already loaded " << module_name;
UsedModule(module);
reply = P::LOAD_OK;
} else {
BPLOG(INFO) << "Looking up symbols for (" << module_name << ", "
<< debug_file << ", " << debug_id << ")";
string symbol_data, symbol_file;
SymbolSupplier::SymbolResult symbol_result;
if (supplier_) {
symbol_result = supplier_->GetSymbolFile(&module, NULL,
&symbol_file, &symbol_data);
} else {
symbol_result = SymbolSupplier::NOT_FOUND;
}
switch (symbol_result) {
case SymbolSupplier::FOUND: {
BPLOG(INFO) << "Found symbols for " << module_name;
reply = P::LOAD_OK;
// also go ahead and load the symbols while we're here,
// since the client is just going to ask us to do this right away
// and we already have |symbol_data| here.
int numlines = CountNewlines(symbol_data);
if (!resolver_->LoadModuleUsingMapBuffer(&module,
symbol_data)) {
BPLOG(INFO) << "Failed to load symbols for " << module_name;
reply = P::LOAD_FAIL;
} else {
// save some info about this module
symbol_lines_ += numlines;
UsedModule(module);
module_symbol_lines_[module.code_file()] = numlines;
BPLOG(INFO) << "Loaded symbols for " << module_name
<< " (" << dec << numlines << " lines, "
<< symbol_lines_ << " total)";
if (max_symbol_lines_ != 0 && symbol_lines_ > max_symbol_lines_) {
// try unloading some modules to reclaim memory
// (but not the one that was just loaded)
BPLOG(INFO) << "Exceeded limit of " << dec << max_symbol_lines_
<< " symbol lines loaded, trying to unload modules";
TryUnloadModules(module);
}
}
}
break;
case SymbolSupplier::NOT_FOUND:
BPLOG(INFO) << "Symbols not found for " << module_name;
reply = P::LOAD_NOT_FOUND;
break;
case SymbolSupplier::INTERRUPT:
BPLOG(INFO) << "Symbol provider returned interrupt for " << module_name;
reply = P::LOAD_INTERRUPT;
break;
}
}
response << P::OK << reply;
}
void NetworkSourceLineServer::HandleGet(binarystream &message,
binarystream &response) {
string module_name, debug_file, debug_id;
u_int64_t module_base, instruction;
message >> module_name >> debug_file >> debug_id
>> module_base >> instruction;
if (message.eof()) {
BPLOG(ERROR) << "GET message malformed";
response << P::ERROR;
return;
}
BPLOG(INFO) << "Received message GET " << module_name << " "
<< debug_file << " " << debug_id << " "
<< hex << module_base << " " << instruction;
StackFrame frame;
if (resolver_) {
BasicCodeModule module(module_base, (u_int64_t)0,
module_name + "|" + debug_file + "|" + debug_id, "",
debug_file, debug_id, "");
frame.module = &module;
frame.instruction = instruction;
resolver_->FillSourceLineInfo(&frame);
UsedModule(module);
}
response << P::OK << frame.function_name << frame.function_base
<< frame.source_file_name << u_int32_t(frame.source_line)
<< frame.source_line_base;
BPLOG(INFO) << "Sending GET response: " << frame.function_name << " "
<< hex << frame.function_base << " "
<< frame.source_file_name << " "
<< dec << frame.source_line << " "
<< hex << frame.source_line_base;
}
void NetworkSourceLineServer::HandleGetStackWin(binarystream &message,
binarystream &response) {
string module_name, debug_file, debug_id;
u_int64_t module_base, instruction;
message >> module_name >> debug_file >> debug_id
>> module_base >> instruction;
if (message.eof()) {
BPLOG(ERROR) << "GETSTACKWIN message malformed";
response << P::ERROR;
return;
}
BPLOG(INFO) << "Received message GETSTACKWIN " << module_name << " "
<< debug_file << " " << debug_id << " "
<< hex << module_base << " " << instruction;
WindowsFrameInfo *frame_info = NULL;
if (resolver_) {
StackFrame frame;
BasicCodeModule module(module_base, (u_int64_t)0,
module_name + "|" + debug_file + "|" + debug_id, "",
debug_file, debug_id, "");
frame.module = &module;
frame.instruction = instruction;
frame_info = resolver_->FindWindowsFrameInfo(&frame);
UsedModule(module);
}
response << P::OK << FormatWindowsFrameInfo(frame_info);
BPLOG(INFO) << "Sending GETSTACKWIN response: "
<< FormatWindowsFrameInfo(frame_info);
delete frame_info;
}
string NetworkSourceLineServer::FormatWindowsFrameInfo(
WindowsFrameInfo *frame_info) {
if (frame_info == NULL)
return "";
std::ostringstream stream;
// Put "0" as the type, rva and code size because the client doesn't
// actually care what these values are, but it's easier to keep the
// format consistent with the symbol files so the parsing code can be
// shared.
stream << "0 0 0 " << hex
<< frame_info->prolog_size << " "
<< frame_info->epilog_size << " "
<< frame_info->parameter_size << " "
<< frame_info->saved_register_size << " "
<< frame_info->local_size << " "
<< frame_info->max_stack_size << " ";
if (!frame_info->program_string.empty()) {
stream << 1 << " " << frame_info->program_string;
} else {
stream << 0 << " " << frame_info->allocates_base_pointer;
}
return stream.str();
}
void NetworkSourceLineServer::HandleGetStackCFI(binarystream &message,
binarystream &response) {
string module_name, debug_file, debug_id;
u_int64_t module_base, instruction;
message >> module_name >> debug_file >> debug_id
>> module_base >> instruction;
if (message.eof()) {
BPLOG(ERROR) << "GETSTACKCFI message malformed";
response << P::ERROR;
return;
}
BPLOG(INFO) << "Received message GETSTACKCFI " << module_name << " "
<< debug_file << " " << debug_id << " "
<< hex << module_base << " " << instruction;
CFIFrameInfo *frame_info = NULL;
if (resolver_) {
StackFrame frame;
BasicCodeModule module(module_base, (u_int64_t)0,
module_name + "|" + debug_file + "|" + debug_id, "",
debug_file, debug_id, "");
frame.module = &module;
frame.instruction = instruction;
frame_info = resolver_->FindCFIFrameInfo(&frame);
UsedModule(module);
}
string frame_info_string;
if (frame_info != NULL)
frame_info_string = frame_info->Serialize();
response << P::OK << frame_info_string;
BPLOG(INFO) << "Sending GETSTACKCFI response: "
<< frame_info_string;
delete frame_info;
}
int NetworkSourceLineServer::CountNewlines(const string &str) {
int count = 0;
string::const_iterator iter = str.begin();
while (iter != str.end()) {
if (*iter == '\n')
count++;
iter++;
}
return count;
}
void NetworkSourceLineServer::UsedModule(const CodeModule &module) {
list<string>::iterator iter = find(modules_used_.begin(),
modules_used_.end(),
module.code_file());
if (iter == modules_used_.end()) {
modules_used_.push_front(module.code_file());
} else {
modules_used_.splice(modules_used_.begin(),
modules_used_,
iter);
}
}
void NetworkSourceLineServer::TryUnloadModules(
const CodeModule &just_loaded_module) {
if (!resolver_)
return;
while (symbol_lines_ > max_symbol_lines_) {
// never unload just_loaded_module
if (modules_used_.back() == just_loaded_module.code_file())
break;
string module_to_unload = modules_used_.back();
modules_used_.pop_back();
BasicCodeModule module(0, 0, module_to_unload, "", "", "", "");
BPLOG(INFO) << "Unloading module " << module_to_unload;
resolver_->UnloadModule(&module);
// reduce the symbol line count
map<string, int>::iterator iter =
module_symbol_lines_.find(module_to_unload);
if (iter != module_symbol_lines_.end()) {
symbol_lines_ -= iter->second;
module_symbol_lines_.erase(iter);
}
}
}
} // namespace google_breakpad

View file

@ -1,136 +0,0 @@
// Copyright (c) 2010, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// NetworkSourceLineServer implements a UDP-based network protocol
// to allow clients to query for source line information.
//
// A brief protocol description can be found in network_source_line_protocol.h
#ifndef GOOGLE_BREAKPAD_PROCESSOR_NETWORK_SOURCE_LINE_SERVER_H_
#define GOOGLE_BREAKPAD_PROCESSOR_NETWORK_SOURCE_LINE_SERVER_H_
#include <list>
#include <string>
#include <vector>
#include "google_breakpad/common/breakpad_types.h"
#include "google_breakpad/processor/basic_source_line_resolver.h"
#include "google_breakpad/processor/symbol_supplier.h"
#include "processor/binarystream.h"
#include "processor/network_interface.h"
#include "processor/udp_network.h"
namespace google_breakpad {
using std::list;
using std::string;
using std::vector;
class NetworkSourceLineServer {
public:
explicit NetworkSourceLineServer(SymbolSupplier *supplier,
SourceLineResolverInterface *resolver,
unsigned short listen_port,
bool ip4only,
const string &listen_address,
u_int64_t max_symbol_lines)
: initialized_(false),
net_(new UDPNetwork(listen_address, listen_port, ip4only)),
resolver_(resolver),
supplier_(supplier),
max_symbol_lines_(max_symbol_lines),
symbol_lines_(0) {};
NetworkSourceLineServer(SymbolSupplier *supplier,
SourceLineResolverInterface *resolver,
NetworkInterface *net,
u_int64_t max_symbol_lines = 0)
: initialized_(false),
net_(net),
resolver_(resolver),
supplier_(supplier),
max_symbol_lines_(max_symbol_lines),
symbol_lines_(0) {};
// Initialize network connection. Will be called automatically by
// RunOnce or RunForever if not already initialized.
// Returns false if network setup fails.
bool Initialize();
// Run forever serving connections.
// Returns false only if network setup fails.
bool RunForever();
// Look for incoming connections and serve them.
// Wait at most |wait_milliseconds| before returning. Return true
// if any connections were served, and false otherwise.
bool RunOnce(int wait_milliseconds);
private:
bool initialized_;
NetworkInterface *net_;
SourceLineResolverInterface *resolver_;
SymbolSupplier *supplier_;
// Maximum number of symbol lines to store in memory.
// The number of lines in a symbol file is used as a rough
// proxy for memory usage when parsed and loaded. When
// this limit is surpassed, modules will be unloaded until
// the sum of currently loaded modules is again lower
// than this limit.
const u_int64_t max_symbol_lines_;
// Current number of symbol lines loaded
u_int64_t symbol_lines_;
// List of modules loaded, in most-to-least recently used order
list<string> modules_used_;
// Number of symbol lines loaded, per module.
map<string, int> module_symbol_lines_;
void HandleHas(binarystream &message, binarystream &response);
void HandleLoad(binarystream &message, binarystream &response);
void HandleGet(binarystream &message, binarystream &response);
void HandleGetStackWin(binarystream &message, binarystream &response);
void HandleGetStackCFI(binarystream &message, binarystream &response);
string FormatWindowsFrameInfo(WindowsFrameInfo *frame_info);
int CountNewlines(const string &str);
// Move this module to the front of the used list.
void UsedModule(const CodeModule &module);
// Try to unload some modules to reclaim memory.
// Do not unload the module passed in, as this was just loaded.
void TryUnloadModules(const CodeModule &just_loaded_module);
protected:
// protected so we can easily unit test it
bool HandleRequest(binarystream &request, binarystream &response);
};
} // namespace google_breakpad
#endif // GOOGLE_BREAKPAD_PROCESSOR_NETWORK_SOURCE_LINE_SERVER_H_

View file

@ -1,963 +0,0 @@
// Copyright (c) 2010, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Unit tests for NetworkSourceLineServer.
#include <ios>
#include <set>
#include <string>
#include "breakpad_googletest_includes.h"
#include "google_breakpad/processor/code_module.h"
#include "google_breakpad/processor/source_line_resolver_interface.h"
#include "google_breakpad/processor/stack_frame.h"
#include "google_breakpad/processor/symbol_supplier.h"
#include "processor/binarystream.h"
#include "processor/cfi_frame_info.h"
#include "processor/network_source_line_server.h"
#include "processor/network_source_line_protocol.h"
#include "processor/windows_frame_info.h"
namespace {
using std::ios_base;
using std::set;
using std::string;
using google_breakpad::CFIFrameInfo;
using google_breakpad::CodeModule;
using google_breakpad::binarystream;
using google_breakpad::NetworkInterface;
using google_breakpad::NetworkSourceLineServer;
using google_breakpad::SourceLineResolverInterface;
using google_breakpad::StackFrame;
using google_breakpad::SymbolSupplier;
using google_breakpad::SystemInfo;
using google_breakpad::WindowsFrameInfo;
using ::testing::_;
using ::testing::DoAll;
using ::testing::Invoke;
using ::testing::Property;
using ::testing::Return;
using ::testing::SetArgumentPointee;
// Style guide forbids "using namespace", so at least shorten it.
namespace P = google_breakpad::source_line_protocol;
class MockNetwork : public NetworkInterface {
public:
MockNetwork() {}
MOCK_METHOD1(Init, bool(bool listen));
MOCK_METHOD2(Send, bool(const char *data, size_t length));
MOCK_METHOD1(WaitToReceive, bool(int timeout));
MOCK_METHOD3(Receive, bool(char *buffer, size_t buffer_size,
ssize_t &received));
};
class MockSymbolSupplier : public SymbolSupplier {
public:
MockSymbolSupplier() {}
MOCK_METHOD3(GetSymbolFile, SymbolResult(const CodeModule *module,
const SystemInfo *system_info,
string *symbol_file));
MOCK_METHOD4(GetSymbolFile, SymbolResult(const CodeModule *module,
const SystemInfo *system_info,
string *symbol_file,
string *symbol_data));
MOCK_METHOD4(GetCStringSymbolData, SymbolResult(const CodeModule *module,
const SystemInfo *system_info,
string *symbol_file,
char **symbol_data));
MOCK_METHOD1(FreeSymbolData, void(const CodeModule *module));
};
class MockSourceLineResolver : public SourceLineResolverInterface {
public:
MockSourceLineResolver() {}
virtual ~MockSourceLineResolver() {}
MOCK_METHOD2(LoadModule, bool(const CodeModule *module,
const string &map_file));
MOCK_METHOD2(LoadModuleUsingMapBuffer, bool(const CodeModule *module,
const string &map_buffer));
MOCK_METHOD2(LoadModuleUsingMemoryBuffer, bool(const CodeModule *module,
char *memory_buffer));
MOCK_METHOD0(ShouldDeleteMemoryBufferAfterLoadModule, bool());
MOCK_METHOD1(UnloadModule, void(const CodeModule *module));
MOCK_METHOD1(HasModule, bool(const CodeModule *module));
MOCK_METHOD1(FillSourceLineInfo, void(StackFrame *frame));
MOCK_METHOD1(FindWindowsFrameInfo,
WindowsFrameInfo*(const StackFrame *frame));
MOCK_METHOD1(FindCFIFrameInfo,
CFIFrameInfo*(const StackFrame *frame));
};
class TestNetworkSourceLineServer : public NetworkSourceLineServer {
public:
// Override visibility for testing. It's a lot easier to just
// call into this method and verify the result than it would be
// to mock out the calls to the NetworkInterface, even though
// that would ostensibly be more correct and test the code more
// thoroughly. Perhaps if someone has time and figures out a
// clean way to do it this could be changed.
using NetworkSourceLineServer::HandleRequest;
TestNetworkSourceLineServer(SymbolSupplier *supplier,
SourceLineResolverInterface *resolver,
NetworkInterface *net,
u_int64_t max_symbol_lines = 0)
: NetworkSourceLineServer(supplier, resolver, net, max_symbol_lines)
{}
};
class NetworkSourceLineServerTest : public ::testing::Test {
public:
MockSymbolSupplier supplier;
MockSourceLineResolver resolver;
MockNetwork net;
TestNetworkSourceLineServer *server;
NetworkSourceLineServerTest() : server(NULL) {}
void SetUp() {
server = new TestNetworkSourceLineServer(&supplier, &resolver, &net);
}
};
TEST_F(NetworkSourceLineServerTest, TestInit) {
EXPECT_CALL(net, Init(true)).WillOnce(Return(true));
EXPECT_CALL(net, WaitToReceive(0)).WillOnce(Return(false));
ASSERT_TRUE(server->Initialize());
EXPECT_FALSE(server->RunOnce(0));
}
TEST_F(NetworkSourceLineServerTest, TestMalformedRequest) {
binarystream request;
// send a request without a full sequence number
request << u_int8_t(1);
binarystream response;
EXPECT_FALSE(server->HandleRequest(request, response));
request.rewind();
// send a request without a command
request << u_int16_t(1);
EXPECT_FALSE(server->HandleRequest(request, response));
}
TEST_F(NetworkSourceLineServerTest, TestUnknownCommand) {
binarystream request;
// send a request with an unknown command
request << u_int16_t(1) << u_int8_t(100);
binarystream response;
ASSERT_TRUE(server->HandleRequest(request, response));
u_int16_t response_sequence;
u_int8_t response_status;
response >> response_sequence >> response_status;
ASSERT_FALSE(response.eof());
EXPECT_EQ(u_int16_t(1), response_sequence);
EXPECT_EQ(P::ERROR, int(response_status));
}
TEST_F(NetworkSourceLineServerTest, TestHasBasic) {
EXPECT_CALL(resolver, HasModule(_))
.WillOnce(Return(false))
.WillOnce(Return(true));
binarystream request;
const u_int16_t sequence = 0xA0A0;
// first request should come back as not loaded
request << sequence << P::HAS << string("test.dll") << string("test.pdb")
<< string("ABCD1234");
binarystream response;
ASSERT_TRUE(server->HandleRequest(request, response));
u_int16_t response_sequence;
u_int8_t response_status, response_data;
response >> response_sequence >> response_status >> response_data;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
EXPECT_EQ(P::MODULE_NOT_LOADED, int(response_data));
// second request should come back as loaded
binarystream request2;
request2 << sequence << P::HAS << string("loaded.dll") << string("loaded.pdb")
<< string("ABCD1234");
ASSERT_TRUE(server->HandleRequest(request2, response));
response >> response_sequence >> response_status >> response_data;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
EXPECT_EQ(P::MODULE_LOADED, int(response_data));
}
TEST_F(NetworkSourceLineServerTest, TestMalformedHasRequest) {
binarystream request;
// send request with just command, missing all data
const u_int16_t sequence = 0xA0A0;
request << sequence << P::HAS;
binarystream response;
ASSERT_TRUE(server->HandleRequest(request, response));
u_int16_t response_sequence;
u_int8_t response_status;
response >> response_sequence >> response_status;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence, response_sequence);
EXPECT_EQ(P::ERROR, int(response_status));
// send request with just module name
binarystream request2;
request2 << sequence << P::HAS << string("test.dll");
ASSERT_TRUE(server->HandleRequest(request2, response));
response >> response_sequence >> response_status;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence, response_sequence);
EXPECT_EQ(P::ERROR, int(response_status));
// send request with module name, debug file, missing debug id
binarystream request3;
request3 << sequence << P::HAS << string("test.dll") << string("test.pdb");
ASSERT_TRUE(server->HandleRequest(request3, response));
response >> response_sequence >> response_status;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence, response_sequence);
EXPECT_EQ(P::ERROR, int(response_status));
}
TEST_F(NetworkSourceLineServerTest, TestHasLoad) {
EXPECT_CALL(resolver, HasModule(_))
.WillOnce(Return(false))
.WillOnce(Return(false))
.WillOnce(Return(true));
EXPECT_CALL(resolver, LoadModuleUsingMapBuffer(_,_))
.WillOnce(Return(true));
EXPECT_CALL(supplier, GetSymbolFile(_,_,_,_))
.WillOnce(Return(SymbolSupplier::FOUND));
// verify that the module is not loaded, with a HAS request
binarystream request;
const u_int16_t sequence = 0xA0A0;
request << sequence << P::HAS << string("found.dll") << string("found.pdb")
<< string("ABCD1234");
binarystream response;
ASSERT_TRUE(server->HandleRequest(request, response));
u_int16_t response_sequence;
u_int8_t response_status, response_data;
response >> response_sequence >> response_status >> response_data;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
ASSERT_EQ(P::MODULE_NOT_LOADED, int(response_data));
// now send a load request for this module
binarystream request2;
const u_int16_t sequence2 = 0xB0B0;
request2 << sequence2 << P::LOAD << string("found.dll") << string("found.pdb")
<< string("ABCD1234");
ASSERT_TRUE(server->HandleRequest(request2, response));
response >> response_sequence >> response_status >> response_data;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence2, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
ASSERT_EQ(int(P::LOAD_OK), int(response_data));
// sending another HAS message should now show it as loaded
binarystream request3;
const u_int16_t sequence3 = 0xC0C0;
request3 << sequence3 << P::HAS << string("found.dll") << string("found.pdb")
<< string("ABCD1234");
ASSERT_TRUE(server->HandleRequest(request3, response));
response >> response_sequence >> response_status >> response_data;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence3, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
EXPECT_EQ(P::MODULE_LOADED, int(response_data));
}
TEST_F(NetworkSourceLineServerTest, TestLoad) {
EXPECT_CALL(resolver, HasModule(_))
.Times(3)
.WillRepeatedly(Return(false));
EXPECT_CALL(resolver, LoadModuleUsingMapBuffer(_,_))
.WillOnce(Return(false));
EXPECT_CALL(supplier, GetSymbolFile(_,_,_,_))
.WillOnce(Return(SymbolSupplier::NOT_FOUND))
.WillOnce(Return(SymbolSupplier::INTERRUPT))
.WillOnce(Return(SymbolSupplier::FOUND));
// notfound.dll should return LOAD_NOT_FOUND
binarystream request;
const u_int16_t sequence = 0xA0A0;
request << sequence << P::LOAD << string("notfound.dll")
<< string("notfound.pdb") << string("ABCD1234");
binarystream response;
ASSERT_TRUE(server->HandleRequest(request, response));
u_int16_t response_sequence;
u_int8_t response_status, response_data;
response >> response_sequence >> response_status >> response_data;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
EXPECT_EQ(int(P::LOAD_NOT_FOUND), int(response_data));
// interrupt.dll should return LOAD_INTERRUPT
binarystream request2;
const u_int16_t sequence2 = 0xB0B0;
request2 << sequence2 << P::LOAD << string("interrupt.dll")
<< string("interrupt.pdb") << string("0000");
ASSERT_TRUE(server->HandleRequest(request2, response));
response >> response_sequence >> response_status >> response_data;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence2, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
EXPECT_EQ(int(P::LOAD_INTERRUPT), int(response_data));
// fail.dll should return LOAD_FAIL
binarystream request3;
const u_int16_t sequence3 = 0xC0C0;
request3 << sequence3 << P::LOAD << string("fail.dll") << string("fail.pdb")
<< string("FFFFFFFF");
ASSERT_TRUE(server->HandleRequest(request3, response));
response >> response_sequence >> response_status >> response_data;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence3, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
EXPECT_EQ(int(P::LOAD_FAIL), int(response_data));
}
TEST_F(NetworkSourceLineServerTest, TestMalformedLoadRequest) {
binarystream request;
// send request with just command, missing all data
const u_int16_t sequence = 0xA0A0;
request << sequence << P::LOAD;
binarystream response;
ASSERT_TRUE(server->HandleRequest(request, response));
u_int16_t response_sequence;
u_int8_t response_status;
response >> response_sequence >> response_status;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence, response_sequence);
EXPECT_EQ(P::ERROR, int(response_status));
// send request with just module name
binarystream request2;
request2 << sequence << P::LOAD << string("test.dll");
ASSERT_TRUE(server->HandleRequest(request2, response));
response >> response_sequence >> response_status;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence, response_sequence);
EXPECT_EQ(P::ERROR, int(response_status));
// send request with module name, debug file, missing debug id
binarystream request3;
request3 << sequence << P::LOAD << string("test.dll") << string("test.pdb");
ASSERT_TRUE(server->HandleRequest(request3, response));
response >> response_sequence >> response_status;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence, response_sequence);
EXPECT_EQ(P::ERROR, int(response_status));
}
void FillFullSourceLineInfo(StackFrame *frame) {
frame->function_name = "function1";
frame->function_base = 0x1200;
frame->source_file_name = "function1.cc";
frame->source_line = 1;
frame->source_line_base = 0x1230;
}
void FillPartialSourceLineInfo(StackFrame *frame) {
frame->function_name = "function2";
frame->function_base = 0xFFF0;
}
TEST_F(NetworkSourceLineServerTest, TestGet) {
EXPECT_CALL(resolver, FillSourceLineInfo(_))
.WillOnce(Invoke(FillFullSourceLineInfo))
.WillOnce(Invoke(FillPartialSourceLineInfo));
binarystream request;
const u_int16_t sequence = 0xA0A0;
request << sequence << P::GET << string("loaded.dll")
<< string("loaded.pdb") << string("ABCD1234")
<< u_int64_t(0x1000) << u_int64_t(0x1234);
binarystream response;
ASSERT_TRUE(server->HandleRequest(request, response));
u_int16_t response_sequence;
u_int8_t response_status;
string function, source_file;
u_int32_t source_line;
u_int64_t function_base, source_line_base;
response >> response_sequence >> response_status >> function
>> function_base >> source_file >> source_line >> source_line_base;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
EXPECT_EQ("function1", function);
EXPECT_EQ(0x1200, function_base);
EXPECT_EQ("function1.cc", source_file);
EXPECT_EQ(1, source_line);
EXPECT_EQ(0x1230, source_line_base);
binarystream request2;
const u_int16_t sequence2 = 0xC0C0;
request2 << sequence2 << P::GET << string("loaded.dll")
<< string("loaded.pdb") << string("ABCD1234")
<< u_int64_t(0x1000) << u_int64_t(0xFFFF);
ASSERT_TRUE(server->HandleRequest(request2, response));
response >> response_sequence >> response_status >> function
>> function_base >> source_file >> source_line >> source_line_base;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence2, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
EXPECT_EQ("function2", function);
EXPECT_EQ(0xFFF0, function_base);
EXPECT_EQ("", source_file);
EXPECT_EQ(0, source_line);
EXPECT_EQ(0, source_line_base);
}
WindowsFrameInfo* GetFullWindowsFrameInfo(const StackFrame *frame) {
// return frame info with program string
return new WindowsFrameInfo(1, 2, 3, 0xA, 0xFF, 0xF00,
true,
"x y =");
}
WindowsFrameInfo* GetPartialWindowsFrameInfo(const StackFrame *frame) {
// return frame info, no program string
return new WindowsFrameInfo(1, 2, 3, 4, 5, 6, true, "");
}
TEST_F(NetworkSourceLineServerTest, TestGetStackWin) {
EXPECT_CALL(resolver, FindWindowsFrameInfo(_))
.WillOnce(Invoke(GetFullWindowsFrameInfo))
.WillOnce(Invoke(GetPartialWindowsFrameInfo))
.WillOnce(Return((WindowsFrameInfo*)NULL));
binarystream request;
const u_int16_t sequence = 0xA0A0;
request << sequence << P::GETSTACKWIN << string("loaded.dll")
<< string("loaded.pdb") << string("ABCD1234")
<< u_int64_t(0x1000) << u_int64_t(0x1234);
binarystream response;
ASSERT_TRUE(server->HandleRequest(request, response));
u_int16_t response_sequence;
u_int8_t response_status;
string stack_info;
response >> response_sequence >> response_status
>> stack_info;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
EXPECT_EQ("0 0 0 1 2 3 a ff f00 1 x y =", stack_info);
binarystream request2;
const u_int16_t sequence2 = 0xB0B0;
request2 << sequence2 << P::GETSTACKWIN << string("loaded.dll")
<< string("loaded.pdb") << string("ABCD1234")
<< u_int64_t(0x1000) << u_int64_t(0xABCD);
ASSERT_TRUE(server->HandleRequest(request2, response));
response >> response_sequence >> response_status
>> stack_info;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence2, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
EXPECT_EQ("0 0 0 1 2 3 4 5 6 0 1", stack_info);
binarystream request3;
const u_int16_t sequence3 = 0xC0C0;
request3 << sequence3 << P::GETSTACKWIN << string("loaded.dll")
<< string("loaded.pdb") << string("ABCD1234")
<< u_int64_t(0x1000) << u_int64_t(0xFFFF);
ASSERT_TRUE(server->HandleRequest(request3, response));
response >> response_sequence >> response_status
>> stack_info;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence3, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
EXPECT_EQ("", stack_info);
}
CFIFrameInfo* GetCFIFrameInfoJustCFA(const StackFrame *frame) {
CFIFrameInfo* cfi = new CFIFrameInfo();
cfi->SetCFARule("12345678");
return cfi;
}
CFIFrameInfo* GetCFIFrameInfoCFARA(const StackFrame *frame) {
CFIFrameInfo* cfi = new CFIFrameInfo();
cfi->SetCFARule("12345678");
cfi->SetRARule("abcdefgh");
return cfi;
}
CFIFrameInfo* GetCFIFrameInfoLots(const StackFrame *frame) {
CFIFrameInfo* cfi = new CFIFrameInfo();
cfi->SetCFARule("12345678");
cfi->SetRARule("abcdefgh");
cfi->SetRegisterRule("r0", "foo bar");
cfi->SetRegisterRule("b0", "123 abc +");
return cfi;
}
TEST_F(NetworkSourceLineServerTest, TestGetStackCFI) {
EXPECT_CALL(resolver, FindCFIFrameInfo(_))
.WillOnce(Return((CFIFrameInfo*)NULL))
.WillOnce(Invoke(GetCFIFrameInfoJustCFA))
.WillOnce(Invoke(GetCFIFrameInfoCFARA))
.WillOnce(Invoke(GetCFIFrameInfoLots));
binarystream request;
const u_int16_t sequence = 0xA0A0;
request << sequence << P::GETSTACKCFI << string("loaded.dll")
<< string("loaded.pdb") << string("ABCD1234")
<< u_int64_t(0x1000) << u_int64_t(0x1234);
binarystream response;
ASSERT_TRUE(server->HandleRequest(request, response));
u_int16_t response_sequence;
u_int8_t response_status;
string stack_info;
response >> response_sequence >> response_status
>> stack_info;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
EXPECT_EQ("", stack_info);
binarystream request2;
const u_int16_t sequence2 = 0xB0B0;
request2 << sequence2 << P::GETSTACKCFI << string("loaded.dll")
<< string("loaded.pdb") << string("ABCD1234")
<< u_int64_t(0x1000) << u_int64_t(0xABCD);
ASSERT_TRUE(server->HandleRequest(request2, response));
response >> response_sequence >> response_status
>> stack_info;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence2, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
EXPECT_EQ(".cfa: 12345678", stack_info);
binarystream request3;
const u_int16_t sequence3 = 0xC0C0;
request3 << sequence3 << P::GETSTACKCFI << string("loaded.dll")
<< string("loaded.pdb") << string("ABCD1234")
<< u_int64_t(0x1000) << u_int64_t(0xFFFF);
ASSERT_TRUE(server->HandleRequest(request3, response));
response >> response_sequence >> response_status
>> stack_info;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence3, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
EXPECT_EQ(".cfa: 12345678 .ra: abcdefgh", stack_info);
binarystream request4;
const u_int16_t sequence4 = 0xD0D0;
request4 << sequence4 << P::GETSTACKCFI << string("loaded.dll")
<< string("loaded.pdb") << string("ABCD1234")
<< u_int64_t(0x1000) << u_int64_t(0xFFFF);
ASSERT_TRUE(server->HandleRequest(request4, response));
response >> response_sequence >> response_status
>> stack_info;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence4, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
EXPECT_EQ(".cfa: 12345678 .ra: abcdefgh b0: 123 abc + r0: foo bar",
stack_info);
}
TEST_F(NetworkSourceLineServerTest, TestMalformedGetRequest) {
//TODO
}
TEST(TestMissingMembers, TestServerWithoutSymbolSupplier) {
// Should provide reasonable responses without a SymbolSupplier
MockSourceLineResolver resolver;
MockNetwork net;
TestNetworkSourceLineServer server(NULL, &resolver, &net);
// All LOAD requests should return LOAD_NOT_FOUND
binarystream request;
binarystream response;
const u_int16_t sequence = 0xB0B0;
u_int16_t response_sequence;
u_int8_t response_status, response_data;
request << sequence << P::LOAD << string("found.dll") << string("found.pdb")
<< string("ABCD1234");
ASSERT_TRUE(server.HandleRequest(request, response));
response >> response_sequence >> response_status >> response_data;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
ASSERT_EQ(int(P::LOAD_NOT_FOUND), int(response_data));
}
TEST(TestMissingMembers, TestServerWithoutResolver) {
// Should provide reasonable responses without a SourceLineResolver
MockSymbolSupplier supplier;
MockNetwork net;
TestNetworkSourceLineServer server(&supplier, NULL, &net);
// GET requests should return empty info
binarystream request;
binarystream response;
const u_int16_t sequence = 0xA0A0;
u_int16_t response_sequence;
u_int8_t response_status;
request << sequence << P::GET << string("loaded.dll")
<< string("loaded.pdb") << string("ABCD1234")
<< u_int64_t(0x1000) << u_int64_t(0x1234);
ASSERT_TRUE(server.HandleRequest(request, response));
string function, source_file;
u_int32_t source_line;
u_int64_t function_base, source_line_base;
response >> response_sequence >> response_status >> function
>> function_base >> source_file >> source_line >> source_line_base;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
EXPECT_EQ("", function);
EXPECT_EQ(0x0, function_base);
EXPECT_EQ("", source_file);
EXPECT_EQ(0, source_line);
EXPECT_EQ(0x0, source_line_base);
// GETSTACKWIN requests should return an empty string
binarystream request2;
const u_int16_t sequence2 = 0xB0B0;
request << sequence2 << P::GETSTACKWIN << string("loaded.dll")
<< string("loaded.pdb") << string("ABCD1234")
<< u_int64_t(0x1000) << u_int64_t(0x1234);
ASSERT_TRUE(server.HandleRequest(request, response));
string response_string;
response >> response_sequence >> response_status >> response_string;
EXPECT_EQ(sequence2, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
EXPECT_EQ("", response_string);
}
class TestModuleManagement : public ::testing::Test {
public:
MockSymbolSupplier supplier;
MockSourceLineResolver resolver;
MockNetwork net;
TestNetworkSourceLineServer server;
// Init server with symbol line limit of 25
TestModuleManagement() : server(&supplier, &resolver, &net, 25) {}
};
TEST_F(TestModuleManagement, TestModuleUnloading) {
EXPECT_CALL(supplier, GetSymbolFile(_,_,_,_))
.Times(3)
.WillRepeatedly(DoAll(SetArgumentPointee<3>(string("1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n")),
Return(SymbolSupplier::FOUND)));
EXPECT_CALL(resolver, HasModule(_))
.Times(3)
.WillRepeatedly(Return(false));
EXPECT_CALL(resolver, LoadModuleUsingMapBuffer(_,_))
.Times(3)
.WillRepeatedly(Return(true));
EXPECT_CALL(resolver, UnloadModule(Property(&CodeModule::code_file,
string("one.dll|one.pdb|1111"))))
.Times(1);
// load three modules, each with 10 lines of symbols.
// the third module will overflow the server's symbol line limit,
// and should cause the first module to be unloaded.
binarystream request;
const u_int16_t sequence = 0x1010;
request << sequence << P::LOAD << string("one.dll") << string("one.pdb")
<< string("1111");
binarystream response;
ASSERT_TRUE(server.HandleRequest(request, response));
u_int16_t response_sequence;
u_int8_t response_status, response_data;
response >> response_sequence >> response_status >> response_data;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
ASSERT_EQ(int(P::LOAD_OK), int(response_data));
binarystream request2;
const u_int16_t sequence2 = 0x2020;
request2 << sequence2 << P::LOAD << string("two.dll") << string("two.pdb")
<< string("2222");
ASSERT_TRUE(server.HandleRequest(request2, response));
response >> response_sequence >> response_status >> response_data;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence2, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
ASSERT_EQ(int(P::LOAD_OK), int(response_data));
binarystream request3;
const u_int16_t sequence3 = 0x3030;
request3 << sequence3 << P::LOAD << string("three.dll") << string("three.pdb")
<< string("3333");
ASSERT_TRUE(server.HandleRequest(request3, response));
response >> response_sequence >> response_status >> response_data;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence3, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
ASSERT_EQ(int(P::LOAD_OK), int(response_data));
}
TEST_F(TestModuleManagement, TestSymbolLimitTooLow) {
// load module with symbol count > limit,
// ensure that it doesn't get unloaded even though it's the only module
EXPECT_CALL(supplier, GetSymbolFile(_,_,_,_))
.WillOnce(DoAll(SetArgumentPointee<3>(string("1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n")),
Return(SymbolSupplier::FOUND)));
EXPECT_CALL(resolver, HasModule(_))
.WillOnce(Return(false));
EXPECT_CALL(resolver, LoadModuleUsingMapBuffer(_,_))
.WillOnce(Return(true));
EXPECT_CALL(resolver, UnloadModule(_))
.Times(0);
binarystream request;
const u_int16_t sequence = 0x1010;
request << sequence << P::LOAD << string("one.dll") << string("one.pdb")
<< string("1111");
binarystream response;
ASSERT_TRUE(server.HandleRequest(request, response));
u_int16_t response_sequence;
u_int8_t response_status, response_data;
response >> response_sequence >> response_status >> response_data;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
ASSERT_EQ(int(P::LOAD_OK), int(response_data));
}
TEST_F(TestModuleManagement, TestModuleLoadLRU) {
// load 2 modules, then re-load the first one,
// then load a third one, causing the second one to be unloaded
EXPECT_CALL(supplier, GetSymbolFile(_,_,_,_))
.Times(3)
.WillRepeatedly(DoAll(SetArgumentPointee<3>(string("1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n")),
Return(SymbolSupplier::FOUND)));
EXPECT_CALL(resolver, HasModule(_))
.WillOnce(Return(false)) // load module 1
.WillOnce(Return(false)) // load module 2
.WillOnce(Return(true)) // module 1 already loaded
.WillOnce(Return(false)); // load module 3
EXPECT_CALL(resolver, LoadModuleUsingMapBuffer(_,_))
.Times(3)
.WillRepeatedly(Return(true));
EXPECT_CALL(resolver, UnloadModule(Property(&CodeModule::code_file,
string("two.dll|two.pdb|2222"))))
.Times(1);
binarystream request;
const u_int16_t sequence = 0x1010;
request << sequence << P::LOAD << string("one.dll") << string("one.pdb")
<< string("1111");
binarystream response;
ASSERT_TRUE(server.HandleRequest(request, response));
u_int16_t response_sequence;
u_int8_t response_status, response_data;
response >> response_sequence >> response_status >> response_data;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
ASSERT_EQ(int(P::LOAD_OK), int(response_data));
binarystream request2;
const u_int16_t sequence2 = 0x2020;
request2 << sequence2 << P::LOAD << string("two.dll") << string("two.pdb")
<< string("2222");
ASSERT_TRUE(server.HandleRequest(request2, response));
response >> response_sequence >> response_status >> response_data;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence2, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
ASSERT_EQ(int(P::LOAD_OK), int(response_data));
binarystream request3;
const u_int16_t sequence3 = 0x3030;
request3 << sequence3 << P::LOAD << string("one.dll") << string("one.pdb")
<< string("1111");
ASSERT_TRUE(server.HandleRequest(request3, response));
response >> response_sequence >> response_status >> response_data;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence3, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
ASSERT_EQ(int(P::LOAD_OK), int(response_data));
binarystream request4;
const u_int16_t sequence4 = 0x4040;
request4 << sequence4 << P::LOAD << string("three.dll") << string("three.pdb")
<< string("3333");
ASSERT_TRUE(server.HandleRequest(request4, response));
response >> response_sequence >> response_status >> response_data;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence4, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
ASSERT_EQ(int(P::LOAD_OK), int(response_data));
}
TEST_F(TestModuleManagement, TestModuleGetLRU) {
// load 2 modules, then issue a GET for the first one,
// then load a third one, causing the second one to be unloaded
EXPECT_CALL(supplier, GetSymbolFile(_,_,_,_))
.Times(3)
.WillRepeatedly(DoAll(SetArgumentPointee<3>(string("1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n")),
Return(SymbolSupplier::FOUND)));
EXPECT_CALL(resolver, HasModule(_))
.Times(3)
.WillRepeatedly(Return(false));
EXPECT_CALL(resolver, LoadModuleUsingMapBuffer(_,_))
.Times(3)
.WillRepeatedly(Return(true));
EXPECT_CALL(resolver, FillSourceLineInfo(_))
.Times(1);
EXPECT_CALL(resolver, UnloadModule(Property(&CodeModule::code_file,
string("two.dll|two.pdb|2222"))))
.Times(1);
binarystream request;
const u_int16_t sequence = 0x1010;
request << sequence << P::LOAD << string("one.dll") << string("one.pdb")
<< string("1111");
binarystream response;
ASSERT_TRUE(server.HandleRequest(request, response));
u_int16_t response_sequence;
u_int8_t response_status, response_data;
response >> response_sequence >> response_status >> response_data;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
ASSERT_EQ(int(P::LOAD_OK), int(response_data));
binarystream request2;
const u_int16_t sequence2 = 0x2020;
request2 << sequence2 << P::LOAD << string("two.dll") << string("two.pdb")
<< string("2222");
ASSERT_TRUE(server.HandleRequest(request2, response));
response >> response_sequence >> response_status >> response_data;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence2, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
ASSERT_EQ(int(P::LOAD_OK), int(response_data));
binarystream request3;
const u_int16_t sequence3 = 0x3030;
request3 << sequence3 << P::GET << string("one.dll")
<< string("one.pdb") << string("1111")
<< u_int64_t(0x1000) << u_int64_t(0x1234);
ASSERT_TRUE(server.HandleRequest(request3, response));
string function, source_file;
u_int32_t source_line;
u_int64_t function_base, source_line_base;
response >> response_sequence >> response_status >> function
>> function_base >> source_file >> source_line >> source_line_base;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence3, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
// Don't care about the rest of the response, really.
binarystream request4;
const u_int16_t sequence4 = 0x4040;
request4 << sequence4 << P::LOAD << string("three.dll") << string("three.pdb")
<< string("3333");
ASSERT_TRUE(server.HandleRequest(request4, response));
response >> response_sequence >> response_status >> response_data;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence4, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
ASSERT_EQ(int(P::LOAD_OK), int(response_data));
}
TEST_F(TestModuleManagement, TestModuleGetStackWinLRU) {
// load 2 modules, then issue a GETSTACKWIN for the first one,
// then load a third one, causing the second one to be unloaded
EXPECT_CALL(supplier, GetSymbolFile(_,_,_,_))
.Times(3)
.WillRepeatedly(DoAll(SetArgumentPointee<3>(string("1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n")),
Return(SymbolSupplier::FOUND)));
EXPECT_CALL(resolver, HasModule(_))
.Times(3)
.WillRepeatedly(Return(false));
EXPECT_CALL(resolver, LoadModuleUsingMapBuffer(_,_))
.Times(3)
.WillRepeatedly(Return(true));
EXPECT_CALL(resolver, FindWindowsFrameInfo(_))
.WillOnce(Return((WindowsFrameInfo*)NULL));
EXPECT_CALL(resolver, UnloadModule(Property(&CodeModule::code_file,
string("two.dll|two.pdb|2222"))))
.Times(1);
binarystream request;
const u_int16_t sequence = 0x1010;
request << sequence << P::LOAD << string("one.dll") << string("one.pdb")
<< string("1111");
binarystream response;
ASSERT_TRUE(server.HandleRequest(request, response));
u_int16_t response_sequence;
u_int8_t response_status, response_data;
response >> response_sequence >> response_status >> response_data;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
ASSERT_EQ(int(P::LOAD_OK), int(response_data));
binarystream request2;
const u_int16_t sequence2 = 0x2020;
request2 << sequence2 << P::LOAD << string("two.dll") << string("two.pdb")
<< string("2222");
ASSERT_TRUE(server.HandleRequest(request2, response));
response >> response_sequence >> response_status >> response_data;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence2, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
ASSERT_EQ(int(P::LOAD_OK), int(response_data));
binarystream request3;
const u_int16_t sequence3 = 0x3030;
request3 << sequence3 << P::GETSTACKWIN << string("one.dll")
<< string("one.pdb") << string("1111")
<< u_int64_t(0x1000) << u_int64_t(0x1234);
ASSERT_TRUE(server.HandleRequest(request3, response));
string stack_info;
response >> response_sequence >> response_status
>> stack_info;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence3, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
// Don't care about the rest of the response, really.
binarystream request4;
const u_int16_t sequence4 = 0x4040;
request4 << sequence4 << P::LOAD << string("three.dll") << string("three.pdb")
<< string("3333");
ASSERT_TRUE(server.HandleRequest(request4, response));
response >> response_sequence >> response_status >> response_data;
ASSERT_FALSE(response.eof());
EXPECT_EQ(sequence4, response_sequence);
EXPECT_EQ(P::OK, int(response_status));
ASSERT_EQ(int(P::LOAD_OK), int(response_data));
}
} // namespace
int main(int argc, char *argv[]) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}

View file

@ -1,127 +0,0 @@
// Copyright (c) 2010, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// source_daemon.cc: Listen for incoming UDP requests for source line
// info, load symbol files and respond with source info.
//
// Author: Ted Mielczarek
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <vector>
#include "google_breakpad/processor/basic_source_line_resolver.h"
#include "processor/logging.h"
#include "processor/network_source_line_server.h"
#include "processor/scoped_ptr.h"
#include "processor/simple_symbol_supplier.h"
using std::string;
using std::vector;
using google_breakpad::BasicSourceLineResolver;
using google_breakpad::NetworkSourceLineServer;
using google_breakpad::scoped_ptr;
using google_breakpad::SimpleSymbolSupplier;
void usage(char *progname) {
printf("Usage: %s [-p port] [-a listen address] "
"[-m maximum symbol lines to keep in memory] "
"<symbol paths>\n", progname);
}
int main(int argc, char **argv) {
BPLOG_INIT(&argc, &argv);
unsigned short listen_port = 0;
char listen_address[1024] = "";
u_int64_t max_symbol_lines = 0;
int arg;
while((arg = getopt(argc, argv, "p:a:m:")) != -1) {
switch(arg) {
case 'p': {
int port_arg = atoi(optarg);
if (port_arg > -1 && port_arg < 65535) {
listen_port = port_arg;
} else {
fprintf(stderr, "Invalid port number for -p!\n");
usage(argv[0]);
return 1;
}
}
break;
case 'a':
strncpy(listen_address, optarg, sizeof(listen_address));
break;
case 'm':
max_symbol_lines = atoll(optarg);
break;
case '?':
fprintf(stderr, "Option -%c requires an argument\n", (char)optopt);
usage(argv[0]);
break;
default:
fprintf(stderr, "Unknown option: -%c\n", (char)arg);
usage(argv[0]);
return 1;
}
}
if (optind >= argc) {
usage(argv[0]);
return 1;
}
vector<string> symbol_paths;
for (int argi = optind; argi < argc; ++argi)
symbol_paths.push_back(argv[argi]);
scoped_ptr<SimpleSymbolSupplier> symbol_supplier;
if (!symbol_paths.empty()) {
symbol_supplier.reset(new SimpleSymbolSupplier(symbol_paths));
}
BasicSourceLineResolver resolver;
NetworkSourceLineServer server(symbol_supplier.get(), &resolver, listen_port,
// default to IPv4 if no listen address
// is specified
listen_address[0] == '\0',
listen_address,
max_symbol_lines);
if (!server.Initialize()) {
BPLOG(ERROR) << "Failed to initialize server.";
return 1;
}
server.RunForever();
// not reached
return 0;
}

View file

@ -1,187 +0,0 @@
// Copyright (c) 2010, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "processor/udp_network.h"
#include <arpa/inet.h>
#include <errno.h>
#include <netdb.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <string>
#include "processor/logging.h"
namespace google_breakpad {
using std::string;
using std::dec;
UDPNetwork::~UDPNetwork() {
if (socket_ != -1) {
close(socket_);
socket_ = -1;
}
}
bool UDPNetwork::Init(bool listen) {
struct addrinfo hints;
struct addrinfo *results;
memset(&hints, 0, sizeof(hints));
if (ip4only_)
hints.ai_family = AF_INET;
else
// don't care if it's IPv4 or IPv6
hints.ai_family = AF_UNSPEC;
// want a UDP socket
hints.ai_socktype = SOCK_DGRAM;
if (listen)
hints.ai_flags = AI_PASSIVE;
const char *hostname = NULL;
if (!server_.empty())
hostname = server_.c_str();
char portname[6];
sprintf(portname, "%u", port_);
if (!listen) {
BPLOG(INFO) << "Initializing network connection to " << server_
<< ":" << dec << port_;
}
if (getaddrinfo(hostname, portname, &hints, &results) != 0) {
BPLOG(ERROR) << "failed to get address info for address " << server_
<< ": " << strerror(errno);
return false;
}
// save the address of the first result.
//TODO(ted): could support multiple DNS entries, round-robin them for
// fail-over etc
memcpy(&address_, results->ai_addr, GET_SA_LEN(results->ai_addr));
socket_ = socket(results->ai_family, results->ai_socktype,
results->ai_protocol);
freeaddrinfo(results);
if (socket_ == -1) {
BPLOG(ERROR) << "failed to create socket: " << strerror(errno);
return false;
}
if (listen) {
char address_string[INET_ADDRSTRLEN];
void *addr = NULL;
if (((struct sockaddr*)&address_)->sa_family == AF_INET)
addr = &((struct sockaddr_in*)&address_)->sin_addr;
else if (((struct sockaddr*)&address_)->sa_family == AF_INET6)
addr = &((struct sockaddr_in6*)&address_)->sin6_addr;
if (inet_ntop(((struct sockaddr*)&address_)->sa_family, addr,
address_string, sizeof(address_string)) != NULL)
BPLOG(INFO) << "Listening on address " << address_string;
if (bind(socket_,
(struct sockaddr *)&address_,
GET_SA_LEN(address_)) == -1) {
BPLOG(ERROR) << "Failed to bind socket";
close(socket_);
return false;
}
socklen_t bound_addr_len = GET_SA_LEN(address_);
if (getsockname(socket_, (struct sockaddr *)&address_, &bound_addr_len)
== 0) {
if (((struct sockaddr*)&address_)->sa_family == AF_INET)
port_ = ntohs(((struct sockaddr_in*)&address_)->sin_port);
else if (((struct sockaddr*)&address_)->sa_family == AF_INET6)
port_ = ntohs(((struct sockaddr_in6*)&address_)->sin6_port);
}
BPLOG(INFO) << "Listening on port " << port_;
}
return true;
}
bool UDPNetwork::Send(const char *data, size_t length) {
int total_sent = 0;
while (total_sent < length) {
int bytes_sent = sendto(socket_,
data + total_sent,
length - total_sent,
0,
(struct sockaddr *)&address_,
GET_SA_LEN(address_));
if (bytes_sent < 0) {
BPLOG(ERROR) << "error sending message: "
<< strerror(errno) << " (" << errno << ")";
break;
}
total_sent += bytes_sent;
}
return total_sent == length;
}
bool UDPNetwork::WaitToReceive(int wait_time) {
fd_set readfds;
FD_ZERO(&readfds);
FD_SET(socket_, &readfds);
struct timeval timeout;
timeout.tv_sec = wait_time / 1000;
timeout.tv_usec = (wait_time % 1000) * 1000;
int ret = select(socket_+1, &readfds, NULL, NULL, &timeout);
if (ret == 0) {
return false;
} else if (ret == -1) {
if (errno != EINTR)
BPLOG(ERROR) << "error in select(): " << strerror(errno);
return false;
} else if (!FD_ISSET(socket_, &readfds)) {
BPLOG(ERROR) << "select returned, but our socket isn't ready?";
return false;
}
return true;
}
bool UDPNetwork::Receive(char *buffer, size_t buffer_size, ssize_t &received) {
socklen_t fromlen = GET_SA_LEN(address_);
received = recvfrom(socket_, buffer, buffer_size, 0,
(struct sockaddr *)&address_,
&fromlen);
if (received == -1) {
BPLOG(ERROR) << "Error in recvfrom reading response: "
<< strerror(errno);
}
return received != -1;
}
} // namespace google_breakpad

View file

@ -1,73 +0,0 @@
// Copyright (c) 2010, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// UDPNetwork implements NetworkInterface using UDP sockets.
#ifndef _GOOGLE_BREAKPAD_PROCESSOR_UDP_NETWORK_H_
#define _GOOGLE_BREAKPAD_PROCESSOR_UDP_NETWORK_H_
#include <sys/socket.h>
#include <string>
#include "processor/network_interface.h"
namespace google_breakpad {
class UDPNetwork : public NetworkInterface {
public:
// Initialize a UDP Network socket at this address and port.
// address can be empty to indicate that any local address is acceptable.
UDPNetwork(const std::string address,
unsigned short port,
bool ip4only = false)
: server_(address),
port_(port),
ip4only_(ip4only),
socket_(-1) {};
~UDPNetwork();
virtual bool Init(bool listen);
virtual bool Send(const char *data, size_t length);
virtual bool WaitToReceive(int timeout);
virtual bool Receive(char *buffer, size_t buffer_size, ssize_t &received);
unsigned short port() { return port_; }
private:
std::string server_;
unsigned short port_;
bool ip4only_;
struct sockaddr_storage address_;
int socket_;
};
} // namespace google_breakpad
#endif // GOOGLE_BREAKPAD_PROCESSOR_UDP_NETWORK_H_