stack_tracer.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2020 the gRPC authors.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
20 
22 
23 #include <cstdio>
24 #include <string>
25 
26 #include "absl/debugging/stacktrace.h"
27 #include "absl/debugging/symbolize.h"
28 
30 
31 namespace {
32 
33 constexpr int kPrintfPointerFieldWidth = 2 + 2 * sizeof(void*);
34 
35 void DumpPCAndFrameSizeAndSymbol(void (*writerfn)(const char*, void*),
36  void* writerfn_arg, void* pc,
37  void* symbolize_pc, int framesize,
38  const char* const prefix) {
39  char tmp[1024];
40  const char* symbol = "(unknown)";
41  if (absl::Symbolize(symbolize_pc, tmp, sizeof(tmp))) {
42  symbol = tmp;
43  }
44  char buf[1024];
45  if (framesize <= 0) {
46  snprintf(buf, sizeof(buf), "%s@ %*p (unknown) %s\n", prefix,
47  kPrintfPointerFieldWidth, pc, symbol);
48  } else {
49  snprintf(buf, sizeof(buf), "%s@ %*p %9d %s\n", prefix,
50  kPrintfPointerFieldWidth, pc, framesize, symbol);
51  }
52  writerfn(buf, writerfn_arg);
53 }
54 
55 void DumpPCAndFrameSize(void (*writerfn)(const char*, void*),
56  void* writerfn_arg, void* pc, int framesize,
57  const char* const prefix) {
58  char buf[100];
59  if (framesize <= 0) {
60  snprintf(buf, sizeof(buf), "%s@ %*p (unknown)\n", prefix,
62  } else {
63  snprintf(buf, sizeof(buf), "%s@ %*p %9d\n", prefix,
64  kPrintfPointerFieldWidth, pc, framesize);
65  }
66  writerfn(buf, writerfn_arg);
67 }
68 
69 void DumpStackTrace(void* const stack[], int frame_sizes[], int depth,
70  bool symbolize_stacktrace,
71  void (*writerfn)(const char*, void*), void* writerfn_arg) {
72  for (int i = 0; i < depth; i++) {
73  if (symbolize_stacktrace) {
74  DumpPCAndFrameSizeAndSymbol(writerfn, writerfn_arg, stack[i],
75  reinterpret_cast<char*>(stack[i]) - 1,
76  frame_sizes[i], " ");
77  } else {
78  DumpPCAndFrameSize(writerfn, writerfn_arg, stack[i], frame_sizes[i],
79  " ");
80  }
81  }
82 }
83 
84 void DebugWriteToString(const char* data, void* str) {
85  reinterpret_cast<std::string*>(str)->append(data);
86 }
87 
88 } // namespace
89 
90 namespace grpc_core {
91 namespace testing {
92 
94  std::string result = "Stack trace:\n";
95  constexpr int kNumStackFrames = 32;
96  void* stack[kNumStackFrames];
97  int frame_sizes[kNumStackFrames];
98  int depth = absl::GetStackFrames(stack, frame_sizes, kNumStackFrames, 1);
99  DumpStackTrace(stack, frame_sizes, depth, true, DebugWriteToString, &result);
100  return result;
101 }
102 
103 void InitializeStackTracer(const char* argv0) {
106 }
107 
108 } // namespace testing
109 } // namespace grpc_core
xds_interop_client.str
str
Definition: xds_interop_client.py:487
_gevent_test_main.result
result
Definition: _gevent_test_main.py:96
testing
Definition: aws_request_signer_test.cc:25
grpc_core
Definition: call_metric_recorder.h:31
buf
voidpf void * buf
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
absl::GetStackFrames
ABSL_ATTRIBUTE_NOINLINE ABSL_ATTRIBUTE_NO_TAIL_CALL int GetStackFrames(void **result, int *sizes, int max_depth, int skip_count)
Definition: abseil-cpp/absl/debugging/stacktrace.cc:87
stack_tracer.h
grpc_core::SetCurrentStackTraceProvider
void SetCurrentStackTraceProvider(gpr_current_stack_trace_func current_stack_trace_provider)
Definition: src/core/lib/gprpp/examine_stack.cc:31
stack
NodeStack stack
Definition: cord_rep_btree.cc:356
data
char data[kBufferLength]
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1006
examine_stack.h
absl::Symbolize
bool Symbolize(const void *pc, char *out, int out_size)
grpc_core::testing::InitializeStackTracer
void InitializeStackTracer(const char *argv0)
Definition: stack_tracer.cc:103
absl::debugging_internal::DumpPCAndFrameSizeAndSymbol
static void DumpPCAndFrameSizeAndSymbol(void(*writerfn)(const char *, void *), void *writerfn_arg, void *pc, void *symbolize_pc, int framesize, const char *const prefix)
Definition: third_party/bloaty/third_party/abseil-cpp/absl/debugging/internal/examine_stack.cc:131
absl::InitializeSymbolizer
ABSL_NAMESPACE_BEGIN void InitializeSymbolizer(const char *argv0)
prefix
static const char prefix[]
Definition: head_of_line_blocking.cc:28
grpc_core::testing::GetCurrentStackTrace
std::string GetCurrentStackTrace()
Definition: stack_tracer.cc:93
absl::debugging_internal::DumpStackTrace
ABSL_ATTRIBUTE_NOINLINE void DumpStackTrace(int min_dropped_frames, int max_num_frames, bool symbolize_stacktrace, OutputWriter *writer, void *writer_arg)
Definition: third_party/abseil-cpp/absl/debugging/internal/examine_stack.cc:274
autogen_x86imm.tmp
tmp
Definition: autogen_x86imm.py:12
absl::debugging_internal::DumpPCAndFrameSize
static void DumpPCAndFrameSize(void(*writerfn)(const char *, void *), void *writerfn_arg, void *pc, int framesize, const char *const prefix)
Definition: third_party/bloaty/third_party/abseil-cpp/absl/debugging/internal/examine_stack.cc:152
mkowners.depth
depth
Definition: mkowners.py:114
absl::debugging_internal::kPrintfPointerFieldWidth
static constexpr int kPrintfPointerFieldWidth
Definition: third_party/bloaty/third_party/abseil-cpp/absl/debugging/internal/examine_stack.cc:125
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
port_platform.h


grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:01:21