Abseil的GetStackTrace功能返回

发布于 2025-01-23 00:30:00 字数 639 浏览 2 评论 0原文

    void show_stackframe() {
        std::cout << "Show stack frame function from Abseil." << std::endl;
        void *trace[100];
  
        int i, trace_size = 0;

        trace_size = absl::GetStackTrace(trace, 100, 0);
        printf("[bt] Execution path: %d\n", trace_size);
        for (i=0; i<trace_size; ++i)
        {
             printf("[bt] %s\n", (char*)trace[i]);
        }
     }

我正在使用此功能在大型代码库中的某个点获得stackTrace。我知道一个事实,我试图在10个函数呼叫的情况下尝试获得stacktrace的点(以前我在这一点上造成了分割故障,我使用GDB看了堆栈跟踪。)但是,我没有堆栈 - 完全追溯。即,trace_size返回的trace_ize是0。为什么这不起作用?

是因为我试图获得堆栈跟踪的点是线程中的吗?这在多线程环境中不起作用吗?

    void show_stackframe() {
        std::cout << "Show stack frame function from Abseil." << std::endl;
        void *trace[100];
  
        int i, trace_size = 0;

        trace_size = absl::GetStackTrace(trace, 100, 0);
        printf("[bt] Execution path: %d\n", trace_size);
        for (i=0; i<trace_size; ++i)
        {
             printf("[bt] %s\n", (char*)trace[i]);
        }
     }

I was using this function get stacktrace at a certain point in a large code base. I know for a fact that the point at which I am trying to get stacktrace at is at 10 function calls deep(Previously I caused a segmentation fault at this point and I looked the stack trace using GDB.) However I am getting no stack-trace back at all. I.e. the trace_size that Abseil is returning back is 0. Why is this not working?

Is it because the point at which I am trying to obtain a stack-trace is inside a thread? Does this not work in a multithreaded environment?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

壹場煙雨 2025-01-30 00:30:00

absl :: getStackTrace仅返回代码地址(程序计数器),而不是函数名称,因此您不能像字符串一样执行printf(“%s”)内容。
要将代码地址转换为函数名称,您需要诸如symernize,来自 https://clickhouse.com/codebrowser/clickhouse/contrib/contrib/contrib/abseil-cpp/absl/debugging/symbolize_elf.inc.inc.html#_zn4absl12lts _20211111111111111029symbolizeepkvppcipciepkvppciepkvppciepkvppci

bool Symbolize(const void *pc, char *out, int out_size) {
  // Symbolization is very slow under tsan.
  ABSL_ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN();
  SAFE_ASSERT(out_size >= 0);
  debugging_internal::Symbolizer *s = debugging_internal::AllocateSymbolizer();
  const char *name = s->GetSymbol(pc);
  bool ok = false;
  if (name != nullptr && out_size > 0) {
    strncpy(out, name, out_size);
    ok = true;
    if (out[out_size - 1] != '\0') {
      // strncpy() does not '\0' terminate when it truncates.  Do so, with
      // trailing ellipsis.
      static constexpr char kEllipsis[] = "...";
      int ellipsis_size =
          std::min(implicit_cast<int>(strlen(kEllipsis)), out_size - 1);
      memcpy(out + out_size - ellipsis_size - 1, kEllipsis, ellipsis_size);
      out[out_size - 1] = '\0';
    }
  }
  debugging_internal::FreeSymbolizer(s);
  ABSL_ANNOTATE_IGNORE_READS_AND_WRITES_END();
  return ok;
}

absl::GetStackTrace only return the code address(program counter), it's not the function name, so you cannot do printf("%s") stuff as if it's a string.
To convert code address to function name, you need something like Symbolize, code from https://clickhouse.com/codebrowser/ClickHouse/contrib/abseil-cpp/absl/debugging/symbolize_elf.inc.html#_ZN4absl12lts_202111029SymbolizeEPKvPci:

bool Symbolize(const void *pc, char *out, int out_size) {
  // Symbolization is very slow under tsan.
  ABSL_ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN();
  SAFE_ASSERT(out_size >= 0);
  debugging_internal::Symbolizer *s = debugging_internal::AllocateSymbolizer();
  const char *name = s->GetSymbol(pc);
  bool ok = false;
  if (name != nullptr && out_size > 0) {
    strncpy(out, name, out_size);
    ok = true;
    if (out[out_size - 1] != '\0') {
      // strncpy() does not '\0' terminate when it truncates.  Do so, with
      // trailing ellipsis.
      static constexpr char kEllipsis[] = "...";
      int ellipsis_size =
          std::min(implicit_cast<int>(strlen(kEllipsis)), out_size - 1);
      memcpy(out + out_size - ellipsis_size - 1, kEllipsis, ellipsis_size);
      out[out_size - 1] = '\0';
    }
  }
  debugging_internal::FreeSymbolizer(s);
  ABSL_ANNOTATE_IGNORE_READS_AND_WRITES_END();
  return ok;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文