Add stack-tracer to gRPC
This commit is contained in:
parent
01cc519b53
commit
f3e75c1fa9
3
BUILD
3
BUILD
|
|
@ -529,6 +529,7 @@ grpc_cc_library(
|
|||
"src/core/lib/gpr/tmpfile_windows.cc",
|
||||
"src/core/lib/gpr/wrap_memcpy.cc",
|
||||
"src/core/lib/gprpp/arena.cc",
|
||||
"src/core/lib/gprpp/examine_stack.cc",
|
||||
"src/core/lib/gprpp/fork.cc",
|
||||
"src/core/lib/gprpp/global_config_env.cc",
|
||||
"src/core/lib/gprpp/host_port.cc",
|
||||
|
|
@ -558,6 +559,7 @@ grpc_cc_library(
|
|||
"src/core/lib/gpr/useful.h",
|
||||
"src/core/lib/gprpp/arena.h",
|
||||
"src/core/lib/gprpp/atomic.h",
|
||||
"src/core/lib/gprpp/examine_stack.h",
|
||||
"src/core/lib/gprpp/fork.h",
|
||||
"src/core/lib/gprpp/global_config.h",
|
||||
"src/core/lib/gprpp/global_config_custom.h",
|
||||
|
|
@ -581,6 +583,7 @@ grpc_cc_library(
|
|||
"absl/strings:str_format",
|
||||
"absl/synchronization",
|
||||
"absl/time:time",
|
||||
"absl/types:optional",
|
||||
],
|
||||
language = "c++",
|
||||
public_hdrs = GPR_PUBLIC_HDRS,
|
||||
|
|
|
|||
3
BUILD.gn
3
BUILD.gn
|
|
@ -147,6 +147,8 @@ config("grpc_config") {
|
|||
"src/core/lib/gprpp/arena.cc",
|
||||
"src/core/lib/gprpp/arena.h",
|
||||
"src/core/lib/gprpp/atomic.h",
|
||||
"src/core/lib/gprpp/examine_stack.cc",
|
||||
"src/core/lib/gprpp/examine_stack.h",
|
||||
"src/core/lib/gprpp/fork.cc",
|
||||
"src/core/lib/gprpp/fork.h",
|
||||
"src/core/lib/gprpp/global_config.h",
|
||||
|
|
@ -173,6 +175,7 @@ config("grpc_config") {
|
|||
"src/core/lib/profiling/timers.h",
|
||||
]
|
||||
deps = [
|
||||
":absl/types:optional",
|
||||
":absl/time:time",
|
||||
":absl/synchronization:synchronization",
|
||||
":absl/strings:strings",
|
||||
|
|
|
|||
109
CMakeLists.txt
109
CMakeLists.txt
|
|
@ -818,6 +818,9 @@ if(gRPC_BUILD_TESTS)
|
|||
add_dependencies(buildtests_cxx error_details_test)
|
||||
add_dependencies(buildtests_cxx evaluate_args_test)
|
||||
add_dependencies(buildtests_cxx eventmanager_libuv_test)
|
||||
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
|
||||
add_dependencies(buildtests_cxx examine_stack_test)
|
||||
endif()
|
||||
add_dependencies(buildtests_cxx exception_test)
|
||||
add_dependencies(buildtests_cxx filter_end2end_test)
|
||||
add_dependencies(buildtests_cxx flaky_network_test)
|
||||
|
|
@ -896,6 +899,9 @@ if(gRPC_BUILD_TESTS)
|
|||
add_dependencies(buildtests_cxx settings_timeout_test)
|
||||
add_dependencies(buildtests_cxx shutdown_test)
|
||||
add_dependencies(buildtests_cxx simple_request_bad_client_test)
|
||||
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
|
||||
add_dependencies(buildtests_cxx stack_tracer_test)
|
||||
endif()
|
||||
add_dependencies(buildtests_cxx stat_test)
|
||||
add_dependencies(buildtests_cxx static_metadata_test)
|
||||
add_dependencies(buildtests_cxx stats_test)
|
||||
|
|
@ -1308,6 +1314,7 @@ add_library(gpr
|
|||
src/core/lib/gpr/tmpfile_windows.cc
|
||||
src/core/lib/gpr/wrap_memcpy.cc
|
||||
src/core/lib/gprpp/arena.cc
|
||||
src/core/lib/gprpp/examine_stack.cc
|
||||
src/core/lib/gprpp/fork.cc
|
||||
src/core/lib/gprpp/global_config_env.cc
|
||||
src/core/lib/gprpp/host_port.cc
|
||||
|
|
@ -1350,6 +1357,7 @@ target_include_directories(gpr
|
|||
)
|
||||
target_link_libraries(gpr
|
||||
${_gRPC_ALLTARGETS_LIBRARIES}
|
||||
absl::optional
|
||||
absl::time
|
||||
absl::synchronization
|
||||
absl::strings
|
||||
|
|
@ -2081,7 +2089,6 @@ add_library(grpc_test_util
|
|||
test/core/util/cmdline.cc
|
||||
test/core/util/debugger_macros.cc
|
||||
test/core/util/eval_args_mock_endpoint.cc
|
||||
test/core/util/examine_stack.cc
|
||||
test/core/util/fuzzer_util.cc
|
||||
test/core/util/grpc_profiler.cc
|
||||
test/core/util/histogram.cc
|
||||
|
|
@ -2095,6 +2102,7 @@ add_library(grpc_test_util
|
|||
test/core/util/reconnect_server.cc
|
||||
test/core/util/resolve_localhost_ip46.cc
|
||||
test/core/util/slice_splitter.cc
|
||||
test/core/util/stack_tracer.cc
|
||||
test/core/util/subprocess_posix.cc
|
||||
test/core/util/subprocess_windows.cc
|
||||
test/core/util/test_config.cc
|
||||
|
|
@ -2153,7 +2161,6 @@ add_library(grpc_test_util_unsecure
|
|||
test/core/util/cmdline.cc
|
||||
test/core/util/debugger_macros.cc
|
||||
test/core/util/eval_args_mock_endpoint.cc
|
||||
test/core/util/examine_stack.cc
|
||||
test/core/util/fuzzer_util.cc
|
||||
test/core/util/grpc_profiler.cc
|
||||
test/core/util/histogram.cc
|
||||
|
|
@ -2167,6 +2174,7 @@ add_library(grpc_test_util_unsecure
|
|||
test/core/util/reconnect_server.cc
|
||||
test/core/util/resolve_localhost_ip46.cc
|
||||
test/core/util/slice_splitter.cc
|
||||
test/core/util/stack_tracer.cc
|
||||
test/core/util/subprocess_posix.cc
|
||||
test/core/util/subprocess_windows.cc
|
||||
test/core/util/test_config.cc
|
||||
|
|
@ -10975,6 +10983,49 @@ target_link_libraries(eventmanager_libuv_test
|
|||
)
|
||||
|
||||
|
||||
endif()
|
||||
if(gRPC_BUILD_TESTS)
|
||||
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
|
||||
|
||||
add_executable(examine_stack_test
|
||||
test/core/gprpp/examine_stack_test.cc
|
||||
third_party/googletest/googletest/src/gtest-all.cc
|
||||
third_party/googletest/googlemock/src/gmock-all.cc
|
||||
)
|
||||
|
||||
target_include_directories(examine_stack_test
|
||||
PRIVATE
|
||||
${CMAKE_CURRENT_SOURCE_DIR}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/include
|
||||
${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
|
||||
${_gRPC_RE2_INCLUDE_DIR}
|
||||
${_gRPC_SSL_INCLUDE_DIR}
|
||||
${_gRPC_UPB_GENERATED_DIR}
|
||||
${_gRPC_UPB_GRPC_GENERATED_DIR}
|
||||
${_gRPC_UPB_INCLUDE_DIR}
|
||||
${_gRPC_ZLIB_INCLUDE_DIR}
|
||||
third_party/googletest/googletest/include
|
||||
third_party/googletest/googletest
|
||||
third_party/googletest/googlemock/include
|
||||
third_party/googletest/googlemock
|
||||
${_gRPC_PROTO_GENS_DIR}
|
||||
)
|
||||
|
||||
target_link_libraries(examine_stack_test
|
||||
${_gRPC_PROTOBUF_LIBRARIES}
|
||||
${_gRPC_ALLTARGETS_LIBRARIES}
|
||||
grpc_test_util
|
||||
grpc
|
||||
gpr
|
||||
address_sorting
|
||||
upb
|
||||
absl::symbolize
|
||||
absl::stacktrace
|
||||
${_gRPC_GFLAGS_LIBRARIES}
|
||||
)
|
||||
|
||||
|
||||
endif()
|
||||
endif()
|
||||
if(gRPC_BUILD_TESTS)
|
||||
|
||||
|
|
@ -14244,6 +14295,48 @@ target_link_libraries(simple_request_bad_client_test
|
|||
)
|
||||
|
||||
|
||||
endif()
|
||||
if(gRPC_BUILD_TESTS)
|
||||
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
|
||||
|
||||
add_executable(stack_tracer_test
|
||||
test/core/util/stack_tracer_test.cc
|
||||
third_party/googletest/googletest/src/gtest-all.cc
|
||||
third_party/googletest/googlemock/src/gmock-all.cc
|
||||
)
|
||||
|
||||
target_include_directories(stack_tracer_test
|
||||
PRIVATE
|
||||
${CMAKE_CURRENT_SOURCE_DIR}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/include
|
||||
${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
|
||||
${_gRPC_RE2_INCLUDE_DIR}
|
||||
${_gRPC_SSL_INCLUDE_DIR}
|
||||
${_gRPC_UPB_GENERATED_DIR}
|
||||
${_gRPC_UPB_GRPC_GENERATED_DIR}
|
||||
${_gRPC_UPB_INCLUDE_DIR}
|
||||
${_gRPC_ZLIB_INCLUDE_DIR}
|
||||
third_party/googletest/googletest/include
|
||||
third_party/googletest/googletest
|
||||
third_party/googletest/googlemock/include
|
||||
third_party/googletest/googlemock
|
||||
${_gRPC_PROTO_GENS_DIR}
|
||||
)
|
||||
|
||||
target_link_libraries(stack_tracer_test
|
||||
${_gRPC_PROTOBUF_LIBRARIES}
|
||||
${_gRPC_ALLTARGETS_LIBRARIES}
|
||||
grpc_test_util
|
||||
grpc
|
||||
gpr
|
||||
address_sorting
|
||||
upb
|
||||
absl::symbolize
|
||||
${_gRPC_GFLAGS_LIBRARIES}
|
||||
)
|
||||
|
||||
|
||||
endif()
|
||||
endif()
|
||||
if(gRPC_BUILD_TESTS)
|
||||
|
||||
|
|
@ -15150,7 +15243,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
|
|||
test/core/util/cmdline.cc
|
||||
test/core/util/debugger_macros.cc
|
||||
test/core/util/eval_args_mock_endpoint.cc
|
||||
test/core/util/examine_stack.cc
|
||||
test/core/util/fuzzer_util.cc
|
||||
test/core/util/grpc_profiler.cc
|
||||
test/core/util/histogram.cc
|
||||
|
|
@ -15164,6 +15256,7 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
|
|||
test/core/util/reconnect_server.cc
|
||||
test/core/util/resolve_localhost_ip46.cc
|
||||
test/core/util/slice_splitter.cc
|
||||
test/core/util/stack_tracer.cc
|
||||
test/core/util/subprocess_posix.cc
|
||||
test/core/util/subprocess_windows.cc
|
||||
test/core/util/test_config.cc
|
||||
|
|
@ -16145,7 +16238,7 @@ generate_pkgconfig(
|
|||
"gRPC platform support library"
|
||||
"${gRPC_CORE_VERSION}"
|
||||
""
|
||||
"-lgpr -labsl_status -labsl_cord -labsl_str_format_internal -labsl_bad_optional_access -labsl_synchronization -labsl_graphcycles_internal -labsl_symbolize -labsl_demangle_internal -labsl_stacktrace -labsl_debugging_internal -labsl_malloc_internal -labsl_time -labsl_time_zone -labsl_civil_time -labsl_strings -labsl_strings_internal -labsl_throw_delegate -labsl_int128 -labsl_base -labsl_spinlock_wait -labsl_raw_logging_internal -labsl_log_severity"
|
||||
"-lgpr -labsl_status -labsl_cord -labsl_str_format_internal -labsl_synchronization -labsl_graphcycles_internal -labsl_symbolize -labsl_demangle_internal -labsl_stacktrace -labsl_debugging_internal -labsl_malloc_internal -labsl_time -labsl_time_zone -labsl_civil_time -labsl_strings -labsl_strings_internal -labsl_throw_delegate -labsl_int128 -labsl_base -labsl_spinlock_wait -labsl_bad_optional_access -labsl_raw_logging_internal -labsl_log_severity"
|
||||
""
|
||||
"gpr.pc")
|
||||
|
||||
|
|
@ -16155,7 +16248,7 @@ generate_pkgconfig(
|
|||
"high performance general RPC framework"
|
||||
"${gRPC_CORE_VERSION}"
|
||||
"gpr openssl"
|
||||
"-lgrpc -laddress_sorting -lre2 -lupb -lcares -lz -labsl_raw_hash_set -labsl_hashtablez_sampler -labsl_exponential_biased -labsl_hash -labsl_bad_variant_access -labsl_city -labsl_status -labsl_cord -labsl_str_format_internal -labsl_bad_optional_access -labsl_synchronization -labsl_graphcycles_internal -labsl_symbolize -labsl_demangle_internal -labsl_stacktrace -labsl_debugging_internal -labsl_malloc_internal -labsl_time -labsl_time_zone -labsl_civil_time -labsl_strings -labsl_strings_internal -labsl_throw_delegate -labsl_int128 -labsl_base -labsl_spinlock_wait -labsl_raw_logging_internal -labsl_log_severity"
|
||||
"-lgrpc -laddress_sorting -lre2 -lupb -lcares -lz -labsl_raw_hash_set -labsl_hashtablez_sampler -labsl_exponential_biased -labsl_hash -labsl_bad_variant_access -labsl_city -labsl_status -labsl_cord -labsl_str_format_internal -labsl_synchronization -labsl_graphcycles_internal -labsl_symbolize -labsl_demangle_internal -labsl_stacktrace -labsl_debugging_internal -labsl_malloc_internal -labsl_time -labsl_time_zone -labsl_civil_time -labsl_strings -labsl_strings_internal -labsl_throw_delegate -labsl_int128 -labsl_base -labsl_spinlock_wait -labsl_bad_optional_access -labsl_raw_logging_internal -labsl_log_severity"
|
||||
""
|
||||
"grpc.pc")
|
||||
|
||||
|
|
@ -16165,7 +16258,7 @@ generate_pkgconfig(
|
|||
"high performance general RPC framework without SSL"
|
||||
"${gRPC_CORE_VERSION}"
|
||||
"gpr"
|
||||
"-lgrpc_unsecure -labsl_status -labsl_cord -labsl_str_format_internal -labsl_bad_optional_access -labsl_synchronization -labsl_graphcycles_internal -labsl_symbolize -labsl_demangle_internal -labsl_stacktrace -labsl_debugging_internal -labsl_malloc_internal -labsl_time -labsl_time_zone -labsl_civil_time -labsl_strings -labsl_strings_internal -labsl_throw_delegate -labsl_int128 -labsl_base -labsl_spinlock_wait -labsl_raw_logging_internal -labsl_log_severity"
|
||||
"-lgrpc_unsecure -labsl_status -labsl_cord -labsl_str_format_internal -labsl_synchronization -labsl_graphcycles_internal -labsl_symbolize -labsl_demangle_internal -labsl_stacktrace -labsl_debugging_internal -labsl_malloc_internal -labsl_time -labsl_time_zone -labsl_civil_time -labsl_strings -labsl_strings_internal -labsl_throw_delegate -labsl_int128 -labsl_base -labsl_spinlock_wait -labsl_bad_optional_access -labsl_raw_logging_internal -labsl_log_severity"
|
||||
""
|
||||
"grpc_unsecure.pc")
|
||||
|
||||
|
|
@ -16175,7 +16268,7 @@ generate_pkgconfig(
|
|||
"C++ wrapper for gRPC"
|
||||
"${gRPC_CPP_VERSION}"
|
||||
"grpc"
|
||||
"-lgrpc++ -labsl_raw_hash_set -labsl_hashtablez_sampler -labsl_exponential_biased -labsl_hash -labsl_bad_variant_access -labsl_city -labsl_status -labsl_cord -labsl_str_format_internal -labsl_bad_optional_access -labsl_synchronization -labsl_graphcycles_internal -labsl_symbolize -labsl_demangle_internal -labsl_stacktrace -labsl_debugging_internal -labsl_malloc_internal -labsl_time -labsl_time_zone -labsl_civil_time -labsl_strings -labsl_strings_internal -labsl_throw_delegate -labsl_int128 -labsl_base -labsl_spinlock_wait -labsl_raw_logging_internal -labsl_log_severity"
|
||||
"-lgrpc++ -labsl_raw_hash_set -labsl_hashtablez_sampler -labsl_exponential_biased -labsl_hash -labsl_bad_variant_access -labsl_city -labsl_status -labsl_cord -labsl_str_format_internal -labsl_synchronization -labsl_graphcycles_internal -labsl_symbolize -labsl_demangle_internal -labsl_stacktrace -labsl_debugging_internal -labsl_malloc_internal -labsl_time -labsl_time_zone -labsl_civil_time -labsl_strings -labsl_strings_internal -labsl_throw_delegate -labsl_int128 -labsl_base -labsl_spinlock_wait -labsl_bad_optional_access -labsl_raw_logging_internal -labsl_log_severity"
|
||||
""
|
||||
"grpc++.pc")
|
||||
|
||||
|
|
@ -16185,6 +16278,6 @@ generate_pkgconfig(
|
|||
"C++ wrapper for gRPC without SSL"
|
||||
"${gRPC_CPP_VERSION}"
|
||||
"grpc_unsecure"
|
||||
"-lgrpc++_unsecure -labsl_status -labsl_cord -labsl_str_format_internal -labsl_bad_optional_access -labsl_synchronization -labsl_graphcycles_internal -labsl_symbolize -labsl_demangle_internal -labsl_stacktrace -labsl_debugging_internal -labsl_malloc_internal -labsl_time -labsl_time_zone -labsl_civil_time -labsl_strings -labsl_strings_internal -labsl_throw_delegate -labsl_int128 -labsl_base -labsl_spinlock_wait -labsl_raw_logging_internal -labsl_log_severity"
|
||||
"-lgrpc++_unsecure -labsl_status -labsl_cord -labsl_str_format_internal -labsl_synchronization -labsl_graphcycles_internal -labsl_symbolize -labsl_demangle_internal -labsl_stacktrace -labsl_debugging_internal -labsl_malloc_internal -labsl_time -labsl_time_zone -labsl_civil_time -labsl_strings -labsl_strings_internal -labsl_throw_delegate -labsl_int128 -labsl_base -labsl_spinlock_wait -labsl_bad_optional_access -labsl_raw_logging_internal -labsl_log_severity"
|
||||
""
|
||||
"grpc++_unsecure.pc")
|
||||
|
|
|
|||
1
Makefile
1
Makefile
|
|
@ -1742,6 +1742,7 @@ LIBGPR_SRC = \
|
|||
src/core/lib/gpr/tmpfile_windows.cc \
|
||||
src/core/lib/gpr/wrap_memcpy.cc \
|
||||
src/core/lib/gprpp/arena.cc \
|
||||
src/core/lib/gprpp/examine_stack.cc \
|
||||
src/core/lib/gprpp/fork.cc \
|
||||
src/core/lib/gprpp/global_config_env.cc \
|
||||
src/core/lib/gprpp/host_port.cc \
|
||||
|
|
|
|||
|
|
@ -295,6 +295,7 @@ libs:
|
|||
- src/core/lib/gpr/useful.h
|
||||
- src/core/lib/gprpp/arena.h
|
||||
- src/core/lib/gprpp/atomic.h
|
||||
- src/core/lib/gprpp/examine_stack.h
|
||||
- src/core/lib/gprpp/fork.h
|
||||
- src/core/lib/gprpp/global_config.h
|
||||
- src/core/lib/gprpp/global_config_custom.h
|
||||
|
|
@ -343,6 +344,7 @@ libs:
|
|||
- src/core/lib/gpr/tmpfile_windows.cc
|
||||
- src/core/lib/gpr/wrap_memcpy.cc
|
||||
- src/core/lib/gprpp/arena.cc
|
||||
- src/core/lib/gprpp/examine_stack.cc
|
||||
- src/core/lib/gprpp/fork.cc
|
||||
- src/core/lib/gprpp/global_config_env.cc
|
||||
- src/core/lib/gprpp/host_port.cc
|
||||
|
|
@ -354,6 +356,7 @@ libs:
|
|||
- src/core/lib/profiling/basic_timers.cc
|
||||
- src/core/lib/profiling/stap_timers.cc
|
||||
deps:
|
||||
- absl/types:optional
|
||||
- absl/time:time
|
||||
- absl/synchronization:synchronization
|
||||
- absl/strings:strings
|
||||
|
|
@ -1410,7 +1413,6 @@ libs:
|
|||
- test/core/util/cmdline.h
|
||||
- test/core/util/debugger_macros.h
|
||||
- test/core/util/eval_args_mock_endpoint.h
|
||||
- test/core/util/examine_stack.h
|
||||
- test/core/util/fuzzer_util.h
|
||||
- test/core/util/grpc_profiler.h
|
||||
- test/core/util/histogram.h
|
||||
|
|
@ -1423,6 +1425,7 @@ libs:
|
|||
- test/core/util/reconnect_server.h
|
||||
- test/core/util/resolve_localhost_ip46.h
|
||||
- test/core/util/slice_splitter.h
|
||||
- test/core/util/stack_tracer.h
|
||||
- test/core/util/subprocess.h
|
||||
- test/core/util/test_config.h
|
||||
- test/core/util/test_tcp_server.h
|
||||
|
|
@ -1432,7 +1435,6 @@ libs:
|
|||
- test/core/util/cmdline.cc
|
||||
- test/core/util/debugger_macros.cc
|
||||
- test/core/util/eval_args_mock_endpoint.cc
|
||||
- test/core/util/examine_stack.cc
|
||||
- test/core/util/fuzzer_util.cc
|
||||
- test/core/util/grpc_profiler.cc
|
||||
- test/core/util/histogram.cc
|
||||
|
|
@ -1446,6 +1448,7 @@ libs:
|
|||
- test/core/util/reconnect_server.cc
|
||||
- test/core/util/resolve_localhost_ip46.cc
|
||||
- test/core/util/slice_splitter.cc
|
||||
- test/core/util/stack_tracer.cc
|
||||
- test/core/util/subprocess_posix.cc
|
||||
- test/core/util/subprocess_windows.cc
|
||||
- test/core/util/test_config.cc
|
||||
|
|
@ -1468,7 +1471,6 @@ libs:
|
|||
- test/core/util/cmdline.h
|
||||
- test/core/util/debugger_macros.h
|
||||
- test/core/util/eval_args_mock_endpoint.h
|
||||
- test/core/util/examine_stack.h
|
||||
- test/core/util/fuzzer_util.h
|
||||
- test/core/util/grpc_profiler.h
|
||||
- test/core/util/histogram.h
|
||||
|
|
@ -1481,6 +1483,7 @@ libs:
|
|||
- test/core/util/reconnect_server.h
|
||||
- test/core/util/resolve_localhost_ip46.h
|
||||
- test/core/util/slice_splitter.h
|
||||
- test/core/util/stack_tracer.h
|
||||
- test/core/util/subprocess.h
|
||||
- test/core/util/test_config.h
|
||||
- test/core/util/test_tcp_server.h
|
||||
|
|
@ -1490,7 +1493,6 @@ libs:
|
|||
- test/core/util/cmdline.cc
|
||||
- test/core/util/debugger_macros.cc
|
||||
- test/core/util/eval_args_mock_endpoint.cc
|
||||
- test/core/util/examine_stack.cc
|
||||
- test/core/util/fuzzer_util.cc
|
||||
- test/core/util/grpc_profiler.cc
|
||||
- test/core/util/histogram.cc
|
||||
|
|
@ -1504,6 +1506,7 @@ libs:
|
|||
- test/core/util/reconnect_server.cc
|
||||
- test/core/util/resolve_localhost_ip46.cc
|
||||
- test/core/util/slice_splitter.cc
|
||||
- test/core/util/stack_tracer.cc
|
||||
- test/core/util/subprocess_posix.cc
|
||||
- test/core/util/subprocess_windows.cc
|
||||
- test/core/util/test_config.cc
|
||||
|
|
@ -5923,6 +5926,26 @@ targets:
|
|||
- address_sorting
|
||||
- upb
|
||||
uses_polling: false
|
||||
- name: examine_stack_test
|
||||
gtest: true
|
||||
build: test
|
||||
language: c++
|
||||
headers: []
|
||||
src:
|
||||
- test/core/gprpp/examine_stack_test.cc
|
||||
deps:
|
||||
- grpc_test_util
|
||||
- grpc
|
||||
- gpr
|
||||
- address_sorting
|
||||
- upb
|
||||
- absl/debugging:symbolize
|
||||
- absl/debugging:stacktrace
|
||||
platforms:
|
||||
- linux
|
||||
- posix
|
||||
- mac
|
||||
uses_polling: false
|
||||
- name: exception_test
|
||||
gtest: true
|
||||
build: test
|
||||
|
|
@ -7330,6 +7353,25 @@ targets:
|
|||
corpus_dirs:
|
||||
- test/core/security/corpus/ssl_server_corpus
|
||||
maxlen: 2048
|
||||
- name: stack_tracer_test
|
||||
gtest: true
|
||||
build: test
|
||||
language: c++
|
||||
headers: []
|
||||
src:
|
||||
- test/core/util/stack_tracer_test.cc
|
||||
deps:
|
||||
- grpc_test_util
|
||||
- grpc
|
||||
- gpr
|
||||
- address_sorting
|
||||
- upb
|
||||
- absl/debugging:symbolize
|
||||
platforms:
|
||||
- linux
|
||||
- posix
|
||||
- mac
|
||||
uses_polling: false
|
||||
- name: stat_test
|
||||
gtest: true
|
||||
build: test
|
||||
|
|
@ -7696,7 +7738,6 @@ targets:
|
|||
- test/core/util/cmdline.h
|
||||
- test/core/util/debugger_macros.h
|
||||
- test/core/util/eval_args_mock_endpoint.h
|
||||
- test/core/util/examine_stack.h
|
||||
- test/core/util/fuzzer_util.h
|
||||
- test/core/util/grpc_profiler.h
|
||||
- test/core/util/histogram.h
|
||||
|
|
@ -7709,6 +7750,7 @@ targets:
|
|||
- test/core/util/reconnect_server.h
|
||||
- test/core/util/resolve_localhost_ip46.h
|
||||
- test/core/util/slice_splitter.h
|
||||
- test/core/util/stack_tracer.h
|
||||
- test/core/util/subprocess.h
|
||||
- test/core/util/test_config.h
|
||||
- test/core/util/test_tcp_server.h
|
||||
|
|
@ -7721,7 +7763,6 @@ targets:
|
|||
- test/core/util/cmdline.cc
|
||||
- test/core/util/debugger_macros.cc
|
||||
- test/core/util/eval_args_mock_endpoint.cc
|
||||
- test/core/util/examine_stack.cc
|
||||
- test/core/util/fuzzer_util.cc
|
||||
- test/core/util/grpc_profiler.cc
|
||||
- test/core/util/histogram.cc
|
||||
|
|
@ -7735,6 +7776,7 @@ targets:
|
|||
- test/core/util/reconnect_server.cc
|
||||
- test/core/util/resolve_localhost_ip46.cc
|
||||
- test/core/util/slice_splitter.cc
|
||||
- test/core/util/stack_tracer.cc
|
||||
- test/core/util/subprocess_posix.cc
|
||||
- test/core/util/subprocess_windows.cc
|
||||
- test/core/util/test_config.cc
|
||||
|
|
|
|||
|
|
@ -372,6 +372,7 @@ if test "$PHP_GRPC" != "no"; then
|
|||
src/core/lib/gpr/tmpfile_windows.cc \
|
||||
src/core/lib/gpr/wrap_memcpy.cc \
|
||||
src/core/lib/gprpp/arena.cc \
|
||||
src/core/lib/gprpp/examine_stack.cc \
|
||||
src/core/lib/gprpp/fork.cc \
|
||||
src/core/lib/gprpp/global_config_env.cc \
|
||||
src/core/lib/gprpp/host_port.cc \
|
||||
|
|
|
|||
|
|
@ -339,6 +339,7 @@ if (PHP_GRPC != "no") {
|
|||
"src\\core\\lib\\gpr\\tmpfile_windows.cc " +
|
||||
"src\\core\\lib\\gpr\\wrap_memcpy.cc " +
|
||||
"src\\core\\lib\\gprpp\\arena.cc " +
|
||||
"src\\core\\lib\\gprpp\\examine_stack.cc " +
|
||||
"src\\core\\lib\\gprpp\\fork.cc " +
|
||||
"src\\core\\lib\\gprpp\\global_config_env.cc " +
|
||||
"src\\core\\lib\\gprpp\\host_port.cc " +
|
||||
|
|
|
|||
|
|
@ -494,6 +494,7 @@ Pod::Spec.new do |s|
|
|||
'src/core/lib/gprpp/atomic.h',
|
||||
'src/core/lib/gprpp/debug_location.h',
|
||||
'src/core/lib/gprpp/dual_ref_counted.h',
|
||||
'src/core/lib/gprpp/examine_stack.h',
|
||||
'src/core/lib/gprpp/fork.h',
|
||||
'src/core/lib/gprpp/global_config.h',
|
||||
'src/core/lib/gprpp/global_config_custom.h',
|
||||
|
|
@ -1095,6 +1096,7 @@ Pod::Spec.new do |s|
|
|||
'src/core/lib/gprpp/atomic.h',
|
||||
'src/core/lib/gprpp/debug_location.h',
|
||||
'src/core/lib/gprpp/dual_ref_counted.h',
|
||||
'src/core/lib/gprpp/examine_stack.h',
|
||||
'src/core/lib/gprpp/fork.h',
|
||||
'src/core/lib/gprpp/global_config.h',
|
||||
'src/core/lib/gprpp/global_config_custom.h',
|
||||
|
|
|
|||
|
|
@ -817,6 +817,8 @@ Pod::Spec.new do |s|
|
|||
'src/core/lib/gprpp/atomic.h',
|
||||
'src/core/lib/gprpp/debug_location.h',
|
||||
'src/core/lib/gprpp/dual_ref_counted.h',
|
||||
'src/core/lib/gprpp/examine_stack.cc',
|
||||
'src/core/lib/gprpp/examine_stack.h',
|
||||
'src/core/lib/gprpp/fork.cc',
|
||||
'src/core/lib/gprpp/fork.h',
|
||||
'src/core/lib/gprpp/global_config.h',
|
||||
|
|
@ -1621,6 +1623,7 @@ Pod::Spec.new do |s|
|
|||
'src/core/lib/gprpp/atomic.h',
|
||||
'src/core/lib/gprpp/debug_location.h',
|
||||
'src/core/lib/gprpp/dual_ref_counted.h',
|
||||
'src/core/lib/gprpp/examine_stack.h',
|
||||
'src/core/lib/gprpp/fork.h',
|
||||
'src/core/lib/gprpp/global_config.h',
|
||||
'src/core/lib/gprpp/global_config_custom.h',
|
||||
|
|
@ -2003,8 +2006,6 @@ Pod::Spec.new do |s|
|
|||
'test/core/util/debugger_macros.h',
|
||||
'test/core/util/eval_args_mock_endpoint.cc',
|
||||
'test/core/util/eval_args_mock_endpoint.h',
|
||||
'test/core/util/examine_stack.cc',
|
||||
'test/core/util/examine_stack.h',
|
||||
'test/core/util/fuzzer_util.cc',
|
||||
'test/core/util/fuzzer_util.h',
|
||||
'test/core/util/grpc_profiler.cc',
|
||||
|
|
@ -2030,6 +2031,8 @@ Pod::Spec.new do |s|
|
|||
'test/core/util/resolve_localhost_ip46.h',
|
||||
'test/core/util/slice_splitter.cc',
|
||||
'test/core/util/slice_splitter.h',
|
||||
'test/core/util/stack_tracer.cc',
|
||||
'test/core/util/stack_tracer.h',
|
||||
'test/core/util/subprocess.h',
|
||||
'test/core/util/subprocess_windows.cc',
|
||||
'test/core/util/test_config.cc',
|
||||
|
|
|
|||
|
|
@ -735,6 +735,8 @@ Gem::Specification.new do |s|
|
|||
s.files += %w( src/core/lib/gprpp/atomic.h )
|
||||
s.files += %w( src/core/lib/gprpp/debug_location.h )
|
||||
s.files += %w( src/core/lib/gprpp/dual_ref_counted.h )
|
||||
s.files += %w( src/core/lib/gprpp/examine_stack.cc )
|
||||
s.files += %w( src/core/lib/gprpp/examine_stack.h )
|
||||
s.files += %w( src/core/lib/gprpp/fork.cc )
|
||||
s.files += %w( src/core/lib/gprpp/fork.h )
|
||||
s.files += %w( src/core/lib/gprpp/global_config.h )
|
||||
|
|
|
|||
6
grpc.gyp
6
grpc.gyp
|
|
@ -379,6 +379,7 @@
|
|||
'target_name': 'gpr',
|
||||
'type': 'static_library',
|
||||
'dependencies': [
|
||||
'absl/types:optional',
|
||||
'absl/time:time',
|
||||
'absl/synchronization:synchronization',
|
||||
'absl/strings:strings',
|
||||
|
|
@ -421,6 +422,7 @@
|
|||
'src/core/lib/gpr/tmpfile_windows.cc',
|
||||
'src/core/lib/gpr/wrap_memcpy.cc',
|
||||
'src/core/lib/gprpp/arena.cc',
|
||||
'src/core/lib/gprpp/examine_stack.cc',
|
||||
'src/core/lib/gprpp/fork.cc',
|
||||
'src/core/lib/gprpp/global_config_env.cc',
|
||||
'src/core/lib/gprpp/host_port.cc',
|
||||
|
|
@ -999,7 +1001,6 @@
|
|||
'test/core/util/cmdline.cc',
|
||||
'test/core/util/debugger_macros.cc',
|
||||
'test/core/util/eval_args_mock_endpoint.cc',
|
||||
'test/core/util/examine_stack.cc',
|
||||
'test/core/util/fuzzer_util.cc',
|
||||
'test/core/util/grpc_profiler.cc',
|
||||
'test/core/util/histogram.cc',
|
||||
|
|
@ -1013,6 +1014,7 @@
|
|||
'test/core/util/reconnect_server.cc',
|
||||
'test/core/util/resolve_localhost_ip46.cc',
|
||||
'test/core/util/slice_splitter.cc',
|
||||
'test/core/util/stack_tracer.cc',
|
||||
'test/core/util/subprocess_posix.cc',
|
||||
'test/core/util/subprocess_windows.cc',
|
||||
'test/core/util/test_config.cc',
|
||||
|
|
@ -1037,7 +1039,6 @@
|
|||
'test/core/util/cmdline.cc',
|
||||
'test/core/util/debugger_macros.cc',
|
||||
'test/core/util/eval_args_mock_endpoint.cc',
|
||||
'test/core/util/examine_stack.cc',
|
||||
'test/core/util/fuzzer_util.cc',
|
||||
'test/core/util/grpc_profiler.cc',
|
||||
'test/core/util/histogram.cc',
|
||||
|
|
@ -1051,6 +1052,7 @@
|
|||
'test/core/util/reconnect_server.cc',
|
||||
'test/core/util/resolve_localhost_ip46.cc',
|
||||
'test/core/util/slice_splitter.cc',
|
||||
'test/core/util/stack_tracer.cc',
|
||||
'test/core/util/subprocess_posix.cc',
|
||||
'test/core/util/subprocess_windows.cc',
|
||||
'test/core/util/test_config.cc',
|
||||
|
|
|
|||
|
|
@ -715,6 +715,8 @@
|
|||
<file baseinstalldir="/" name="src/core/lib/gprpp/atomic.h" role="src" />
|
||||
<file baseinstalldir="/" name="src/core/lib/gprpp/debug_location.h" role="src" />
|
||||
<file baseinstalldir="/" name="src/core/lib/gprpp/dual_ref_counted.h" role="src" />
|
||||
<file baseinstalldir="/" name="src/core/lib/gprpp/examine_stack.cc" role="src" />
|
||||
<file baseinstalldir="/" name="src/core/lib/gprpp/examine_stack.h" role="src" />
|
||||
<file baseinstalldir="/" name="src/core/lib/gprpp/fork.cc" role="src" />
|
||||
<file baseinstalldir="/" name="src/core/lib/gprpp/fork.h" role="src" />
|
||||
<file baseinstalldir="/" name="src/core/lib/gprpp/global_config.h" role="src" />
|
||||
|
|
|
|||
|
|
@ -38,8 +38,11 @@
|
|||
#include <sys/syscall.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "absl/strings/str_format.h"
|
||||
#include "src/core/lib/gprpp/examine_stack.h"
|
||||
|
||||
static long sys_gettid(void) { return syscall(__NR_gettid); }
|
||||
|
||||
|
|
@ -89,7 +92,17 @@ void gpr_default_log(gpr_log_func_args* args) {
|
|||
std::string prefix = absl::StrFormat(
|
||||
"%s%s.%09" PRId32 " %7ld %s:%d]", gpr_log_severity_string(args->severity),
|
||||
time_buffer, now.tv_nsec, tid, display_file, args->line);
|
||||
fprintf(stderr, "%-60s %s\n", prefix.c_str(), args->message);
|
||||
|
||||
absl::optional<std::string> stack_trace =
|
||||
args->severity >= GPR_LOG_SEVERITY_ERROR
|
||||
? grpc_core::GetCurrentStackTrace()
|
||||
: absl::nullopt;
|
||||
if (stack_trace) {
|
||||
fprintf(stderr, "%-60s %s\n%s\n", prefix.c_str(), args->message,
|
||||
stack_trace->c_str());
|
||||
} else {
|
||||
fprintf(stderr, "%-60s %s\n", prefix.c_str(), args->message);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* GPR_LINUX_LOG */
|
||||
|
|
|
|||
|
|
@ -30,7 +30,9 @@
|
|||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include <string>
|
||||
|
||||
#include "absl/strings/str_format.h"
|
||||
#include "src/core/lib/gprpp/examine_stack.h"
|
||||
|
||||
static intptr_t sys_gettid(void) { return (intptr_t)pthread_self(); }
|
||||
|
||||
|
|
@ -87,7 +89,17 @@ void gpr_default_log(gpr_log_func_args* args) {
|
|||
std::string prefix = absl::StrFormat(
|
||||
"%s%s.%09d %7" PRIdPTR " %s:%d]", gpr_log_severity_string(args->severity),
|
||||
time_buffer, (int)(now.tv_nsec), sys_gettid(), display_file, args->line);
|
||||
fprintf(stderr, "%-70s %s\n", prefix.c_str(), args->message);
|
||||
|
||||
absl::optional<std::string> stack_trace =
|
||||
args->severity >= GPR_LOG_SEVERITY_ERROR
|
||||
? grpc_core::GetCurrentStackTrace()
|
||||
: absl::nullopt;
|
||||
if (stack_trace) {
|
||||
fprintf(stderr, "%-70s %s\n%s\n", prefix.c_str(), args->message,
|
||||
stack_trace->c_str());
|
||||
} else {
|
||||
fprintf(stderr, "%-70s %s\n", prefix.c_str(), args->message);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* defined(GPR_POSIX_LOG) */
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@
|
|||
|
||||
#include "src/core/lib/gpr/string.h"
|
||||
#include "src/core/lib/gpr/string_windows.h"
|
||||
#include "src/core/lib/gprpp/examine_stack.h"
|
||||
|
||||
void gpr_log(const char* file, int line, gpr_log_severity severity,
|
||||
const char* format, ...) {
|
||||
|
|
@ -92,10 +93,21 @@ void gpr_default_log(gpr_log_func_args* args) {
|
|||
strcpy(time_buffer, "error:strftime");
|
||||
}
|
||||
|
||||
fprintf(stderr, "%s%s.%09u %5lu %s:%d] %s\n",
|
||||
gpr_log_severity_string(args->severity), time_buffer,
|
||||
(int)(now.tv_nsec), GetCurrentThreadId(), display_file, args->line,
|
||||
args->message);
|
||||
absl::optional<std::string> stack_trace =
|
||||
args->severity >= GPR_LOG_SEVERITY_ERROR
|
||||
? grpc_core::GetCurrentStackTrace()
|
||||
: absl::nullopt;
|
||||
if (stack_trace) {
|
||||
fprintf(stderr, "%s%s.%09u %5lu %s:%d] %s\n%s\n",
|
||||
gpr_log_severity_string(args->severity), time_buffer,
|
||||
(int)(now.tv_nsec), GetCurrentThreadId(), display_file, args->line,
|
||||
args->message, stack_trace->c_str());
|
||||
} else {
|
||||
fprintf(stderr, "%s%s.%09u %5lu %s:%d] %s\n",
|
||||
gpr_log_severity_string(args->severity), time_buffer,
|
||||
(int)(now.tv_nsec), GetCurrentThreadId(), display_file, args->line,
|
||||
args->message);
|
||||
}
|
||||
fflush(stderr);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
*
|
||||
* Copyright 2020 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include "src/core/lib/gprpp/examine_stack.h"
|
||||
|
||||
namespace grpc_core {
|
||||
|
||||
gpr_current_stack_trace_func g_current_stack_trace_provider = nullptr;
|
||||
|
||||
gpr_current_stack_trace_func GetCurrentStackTraceProvider() {
|
||||
return g_current_stack_trace_provider;
|
||||
}
|
||||
|
||||
void SetCurrentStackTraceProvider(
|
||||
gpr_current_stack_trace_func current_stack_trace_provider) {
|
||||
g_current_stack_trace_provider = current_stack_trace_provider;
|
||||
}
|
||||
|
||||
absl::optional<std::string> GetCurrentStackTrace() {
|
||||
if (g_current_stack_trace_provider != nullptr) {
|
||||
return g_current_stack_trace_provider();
|
||||
}
|
||||
return absl::nullopt;
|
||||
}
|
||||
|
||||
} // namespace grpc_core
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
*
|
||||
* Copyright 2020 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPC_CORE_LIB_GPRPP_EXAMINE_STACK_H
|
||||
#define GRPC_CORE_LIB_GPRPP_EXAMINE_STACK_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include <functional>
|
||||
#include <string>
|
||||
|
||||
#include "absl/types/optional.h"
|
||||
|
||||
namespace grpc_core {
|
||||
|
||||
typedef std::string (*gpr_current_stack_trace_func)();
|
||||
|
||||
// Returns a current_stack_trace_provider.
|
||||
gpr_current_stack_trace_func GetCurrentStackTraceProvider();
|
||||
|
||||
// Sets current_stack_trace_provider which provides a current-stack trace.
|
||||
void SetCurrentStackTraceProvider(
|
||||
gpr_current_stack_trace_func current_stack_trace_provider);
|
||||
|
||||
// Returns the current stack trace as a string via current_stack_trace_provider
|
||||
// If current_stack_trace_provider is not set, it returns absl::nullopt.
|
||||
absl::optional<std::string> GetCurrentStackTrace();
|
||||
|
||||
} // namespace grpc_core
|
||||
|
||||
#endif /* GRPC_CORE_LIB_GPRPP_EXAMINE_STACK_H */
|
||||
|
|
@ -348,6 +348,7 @@ CORE_SOURCE_FILES = [
|
|||
'src/core/lib/gpr/tmpfile_windows.cc',
|
||||
'src/core/lib/gpr/wrap_memcpy.cc',
|
||||
'src/core/lib/gprpp/arena.cc',
|
||||
'src/core/lib/gprpp/examine_stack.cc',
|
||||
'src/core/lib/gprpp/fork.cc',
|
||||
'src/core/lib/gprpp/global_config_env.cc',
|
||||
'src/core/lib/gprpp/host_port.cc',
|
||||
|
|
|
|||
|
|
@ -19,6 +19,24 @@ licenses(["notice"]) # Apache v2
|
|||
|
||||
grpc_package(name = "test/core/gprpp")
|
||||
|
||||
grpc_cc_test(
|
||||
name = "examine_stack_test",
|
||||
srcs = ["examine_stack_test.cc"],
|
||||
external_deps = [
|
||||
"absl/debugging:stacktrace",
|
||||
"absl/debugging:symbolize",
|
||||
"gtest",
|
||||
],
|
||||
language = "C++",
|
||||
# TODO(https://github.com/grpc/grpc/issues/24627): Disable this on Windows
|
||||
tags = ["no_windows"],
|
||||
uses_polling = False,
|
||||
deps = [
|
||||
"//:gpr",
|
||||
"//test/core/util:grpc_test_util",
|
||||
],
|
||||
)
|
||||
|
||||
grpc_cc_test(
|
||||
name = "fork_test",
|
||||
srcs = ["fork_test.cc"],
|
||||
|
|
|
|||
|
|
@ -0,0 +1,82 @@
|
|||
/*
|
||||
*
|
||||
* Copyright 2020 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "src/core/lib/gprpp/examine_stack.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include "absl/debugging/stacktrace.h"
|
||||
#include "absl/debugging/symbolize.h"
|
||||
|
||||
#include <grpc/support/log.h>
|
||||
|
||||
namespace {
|
||||
|
||||
std::string SimpleCurrentStackTraceProvider() { return "stacktrace"; }
|
||||
|
||||
std::string AbseilCurrentStackTraceProvider() {
|
||||
std::string result = "Stack trace:\n";
|
||||
constexpr int kNumStackFrames = 10;
|
||||
void* stack[kNumStackFrames];
|
||||
int frame_sizes[kNumStackFrames];
|
||||
int depth = absl::GetStackFrames(stack, frame_sizes, kNumStackFrames, 1);
|
||||
for (int i = 0; i < depth; i++) {
|
||||
char tmp[1024];
|
||||
const char* symbol = "(unknown)";
|
||||
if (absl::Symbolize(stack[i], tmp, sizeof(tmp))) {
|
||||
symbol = tmp;
|
||||
}
|
||||
result += symbol;
|
||||
result += +"\n";
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
TEST(ExamineStackTest, NullStackProvider) {
|
||||
grpc_core::SetCurrentStackTraceProvider(nullptr);
|
||||
EXPECT_EQ(grpc_core::GetCurrentStackTraceProvider(), nullptr);
|
||||
EXPECT_EQ(grpc_core::GetCurrentStackTrace(), absl::nullopt);
|
||||
}
|
||||
|
||||
TEST(ExamineStackTest, SimpleStackProvider) {
|
||||
grpc_core::SetCurrentStackTraceProvider(&SimpleCurrentStackTraceProvider);
|
||||
EXPECT_NE(grpc_core::GetCurrentStackTraceProvider(), nullptr);
|
||||
EXPECT_EQ(grpc_core::GetCurrentStackTrace(), "stacktrace");
|
||||
}
|
||||
|
||||
TEST(ExamineStackTest, AbseilStackProvider) {
|
||||
grpc_core::SetCurrentStackTraceProvider(&AbseilCurrentStackTraceProvider);
|
||||
EXPECT_NE(grpc_core::GetCurrentStackTraceProvider(), nullptr);
|
||||
const absl::optional<std::string> stack_trace =
|
||||
grpc_core::GetCurrentStackTrace();
|
||||
EXPECT_NE(stack_trace, absl::nullopt);
|
||||
gpr_log(GPR_INFO, "stack_trace=%s", stack_trace->c_str());
|
||||
EXPECT_TRUE(stack_trace->find("GetCurrentStackTrace") != -1);
|
||||
}
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
absl::InitializeSymbolizer(argv[0]);
|
||||
::testing::InitGoogleTest(&argc, argv);
|
||||
int ret = RUN_ALL_TESTS();
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -39,7 +39,6 @@ grpc_cc_library(
|
|||
srcs = [
|
||||
"cmdline.cc",
|
||||
"eval_args_mock_endpoint.cc",
|
||||
"examine_stack.cc",
|
||||
"fuzzer_util.cc",
|
||||
"grpc_profiler.cc",
|
||||
"histogram.cc",
|
||||
|
|
@ -63,7 +62,6 @@ grpc_cc_library(
|
|||
hdrs = [
|
||||
"cmdline.h",
|
||||
"eval_args_mock_endpoint.h",
|
||||
"examine_stack.h",
|
||||
"fuzzer_util.h",
|
||||
"grpc_profiler.h",
|
||||
"histogram.h",
|
||||
|
|
@ -89,12 +87,12 @@ grpc_cc_library(
|
|||
],
|
||||
external_deps = [
|
||||
"absl/debugging:failure_signal_handler",
|
||||
"absl/debugging:stacktrace",
|
||||
"absl/debugging:symbolize",
|
||||
],
|
||||
language = "C++",
|
||||
deps = [
|
||||
":grpc_debugger_macros",
|
||||
":stack_tracer",
|
||||
"//:gpr",
|
||||
"//:grpc_base_c",
|
||||
"//:grpc_common",
|
||||
|
|
@ -171,6 +169,43 @@ sh_library(
|
|||
srcs = ["run_with_poller.sh"],
|
||||
)
|
||||
|
||||
grpc_cc_library(
|
||||
name = "stack_tracer",
|
||||
srcs = [
|
||||
"stack_tracer.cc",
|
||||
],
|
||||
hdrs = [
|
||||
"stack_tracer.h",
|
||||
],
|
||||
external_deps = [
|
||||
"absl/debugging:stacktrace",
|
||||
"absl/debugging:symbolize",
|
||||
],
|
||||
language = "C++",
|
||||
deps = [
|
||||
"//:grpc_common",
|
||||
],
|
||||
)
|
||||
|
||||
grpc_cc_test(
|
||||
name = "stack_tracer_test",
|
||||
srcs = [
|
||||
"stack_tracer_test.cc",
|
||||
],
|
||||
external_deps = [
|
||||
"absl/debugging:symbolize",
|
||||
"gtest",
|
||||
],
|
||||
language = "C++",
|
||||
# TODO(https://github.com/grpc/grpc/issues/24627): Disable this on Windows
|
||||
tags = ["no_windows"],
|
||||
uses_polling = False,
|
||||
deps = [
|
||||
":grpc_test_util",
|
||||
":stack_tracer",
|
||||
],
|
||||
)
|
||||
|
||||
grpc_cc_library(
|
||||
name = "test_lb_policies",
|
||||
testonly = 1,
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@
|
|||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include "test/core/util/examine_stack.h"
|
||||
#include "test/core/util/stack_tracer.h"
|
||||
|
||||
#include <cstdio>
|
||||
#include <string>
|
||||
|
|
@ -26,6 +26,8 @@
|
|||
#include "absl/debugging/stacktrace.h"
|
||||
#include "absl/debugging/symbolize.h"
|
||||
|
||||
#include "src/core/lib/gprpp/examine_stack.h"
|
||||
|
||||
namespace {
|
||||
|
||||
static constexpr int kPrintfPointerFieldWidth = 2 + 2 * sizeof(void*);
|
||||
|
|
@ -87,8 +89,9 @@ static void DebugWriteToString(const char* data, void* str) {
|
|||
} // namespace
|
||||
|
||||
namespace grpc_core {
|
||||
namespace testing {
|
||||
|
||||
std::string CurrentStackTrace() {
|
||||
std::string GetCurrentStackTrace() {
|
||||
std::string result = "Stack trace:\n";
|
||||
constexpr int kNumStackFrames = 32;
|
||||
void* stack[kNumStackFrames];
|
||||
|
|
@ -99,4 +102,10 @@ std::string CurrentStackTrace() {
|
|||
return result;
|
||||
}
|
||||
|
||||
void InitializeStackTracer(const char* argv0) {
|
||||
absl::InitializeSymbolizer(argv0);
|
||||
grpc_core::SetCurrentStackTraceProvider(&GetCurrentStackTrace);
|
||||
}
|
||||
|
||||
} // namespace testing
|
||||
} // namespace grpc_core
|
||||
|
|
@ -24,11 +24,25 @@
|
|||
#include <string>
|
||||
|
||||
namespace grpc_core {
|
||||
namespace testing {
|
||||
|
||||
// Return the current stack trace as a string (on multiple lines, beginning with
|
||||
// "Stack trace:\n")
|
||||
std::string CurrentStackTrace();
|
||||
// Returns the current stack trace as a string. To have symbolized stack-traces,
|
||||
// InitializeStackTracer needs to be called beforehand.
|
||||
//
|
||||
// Example of stack-trace is
|
||||
// Stack trace:
|
||||
// @ 0x405b0f 192 StackTracerTest_Basic_Test::TestBody()
|
||||
// @ 0x7fbace6baf75 288 testing::internal::RunAllTests()
|
||||
// @ 0x7fbace6baa93 144 testing::UnitTest::Run()
|
||||
// @ 0x405d4d 64 main
|
||||
//
|
||||
std::string GetCurrentStackTrace();
|
||||
|
||||
// Initializes a stack tracer so that GetCurrentStackTrace can work.
|
||||
// This inits debug symbols and sets this as a gRPC stack-trace provider.
|
||||
void InitializeStackTracer(const char* argv0);
|
||||
|
||||
} // namespace testing
|
||||
} // namespace grpc_core
|
||||
|
||||
#endif /* GRPC_TEST_CORE_UTIL_EXAMINE_STACK_H */
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
/*
|
||||
*
|
||||
* Copyright 2020 the gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "test/core/util/stack_tracer.h"
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <string>
|
||||
|
||||
#include "absl/debugging/symbolize.h"
|
||||
|
||||
#include <grpc/support/log.h>
|
||||
|
||||
#include "test/core/util/test_config.h"
|
||||
|
||||
TEST(StackTracerTest, Basic) {
|
||||
std::string stack_trace = grpc_core::testing::GetCurrentStackTrace();
|
||||
gpr_log(GPR_INFO, "stack_trace=%s", stack_trace.c_str());
|
||||
EXPECT_TRUE(stack_trace.find("Basic") != -1);
|
||||
}
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
grpc::testing::TestEnvironment env(argc, argv);
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
int ret = RUN_ALL_TESTS();
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -32,7 +32,9 @@
|
|||
|
||||
#include "src/core/lib/gpr/string.h"
|
||||
#include "src/core/lib/gpr/useful.h"
|
||||
#include "src/core/lib/gprpp/examine_stack.h"
|
||||
#include "src/core/lib/surface/init.h"
|
||||
#include "test/core/util/stack_tracer.h"
|
||||
|
||||
#include "absl/debugging/failure_signal_handler.h"
|
||||
#include "absl/debugging/symbolize.h"
|
||||
|
|
@ -378,7 +380,7 @@ void grpc_test_init(int argc, char** argv) {
|
|||
// https://github.com/grpc/grpc/issues/24178
|
||||
install_crash_handler();
|
||||
#else
|
||||
absl::InitializeSymbolizer(argv[0]);
|
||||
grpc_core::testing::InitializeStackTracer(argv[0]);
|
||||
absl::FailureSignalHandlerOptions options;
|
||||
absl::InstallFailureSignalHandler(options);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1667,6 +1667,8 @@ src/core/lib/gprpp/arena.h \
|
|||
src/core/lib/gprpp/atomic.h \
|
||||
src/core/lib/gprpp/debug_location.h \
|
||||
src/core/lib/gprpp/dual_ref_counted.h \
|
||||
src/core/lib/gprpp/examine_stack.cc \
|
||||
src/core/lib/gprpp/examine_stack.h \
|
||||
src/core/lib/gprpp/fork.cc \
|
||||
src/core/lib/gprpp/fork.h \
|
||||
src/core/lib/gprpp/global_config.h \
|
||||
|
|
|
|||
|
|
@ -1508,6 +1508,8 @@ src/core/lib/gprpp/arena.h \
|
|||
src/core/lib/gprpp/atomic.h \
|
||||
src/core/lib/gprpp/debug_location.h \
|
||||
src/core/lib/gprpp/dual_ref_counted.h \
|
||||
src/core/lib/gprpp/examine_stack.cc \
|
||||
src/core/lib/gprpp/examine_stack.h \
|
||||
src/core/lib/gprpp/fork.cc \
|
||||
src/core/lib/gprpp/fork.h \
|
||||
src/core/lib/gprpp/global_config.h \
|
||||
|
|
|
|||
|
|
@ -4409,6 +4409,28 @@
|
|||
],
|
||||
"uses_polling": false
|
||||
},
|
||||
{
|
||||
"args": [],
|
||||
"benchmark": false,
|
||||
"ci_platforms": [
|
||||
"linux",
|
||||
"mac",
|
||||
"posix"
|
||||
],
|
||||
"cpu_cost": 1.0,
|
||||
"exclude_configs": [],
|
||||
"exclude_iomgrs": [],
|
||||
"flaky": false,
|
||||
"gtest": true,
|
||||
"language": "c++",
|
||||
"name": "examine_stack_test",
|
||||
"platforms": [
|
||||
"linux",
|
||||
"mac",
|
||||
"posix"
|
||||
],
|
||||
"uses_polling": false
|
||||
},
|
||||
{
|
||||
"args": [],
|
||||
"benchmark": false,
|
||||
|
|
@ -5667,6 +5689,28 @@
|
|||
],
|
||||
"uses_polling": true
|
||||
},
|
||||
{
|
||||
"args": [],
|
||||
"benchmark": false,
|
||||
"ci_platforms": [
|
||||
"linux",
|
||||
"mac",
|
||||
"posix"
|
||||
],
|
||||
"cpu_cost": 1.0,
|
||||
"exclude_configs": [],
|
||||
"exclude_iomgrs": [],
|
||||
"flaky": false,
|
||||
"gtest": true,
|
||||
"language": "c++",
|
||||
"name": "stack_tracer_test",
|
||||
"platforms": [
|
||||
"linux",
|
||||
"mac",
|
||||
"posix"
|
||||
],
|
||||
"uses_polling": false
|
||||
},
|
||||
{
|
||||
"args": [],
|
||||
"benchmark": false,
|
||||
|
|
|
|||
Loading…
Reference in New Issue