【问题标题】:save_stack_trace_tsk and struct stack_trace is no longer available in Linux 5.2+save_stack_trace_tsk 和 struct stack_trace 在 Linux 5.2+ 中不再可用
【发布时间】:2020-02-15 23:30:03
【问题描述】:

在 5.2 之前的内核版本中,我使用save_stack_trace_tsk 来检索调用堆栈。

但是这个方法在 Linux kernel 5.2+ 中已经不可用了,我应该用什么?

【问题讨论】:

  • "但是这种方法在 Linux 内核 5.X 中不再可用" - 真的吗? elixir.bootlin.com/linux/v5.1.21/source/arch/x86/kernel/…
  • 更正确:该功能仅在特定架构中被删除,x86 也在其中。无论如何,最新的内核似乎有stack_trace_save_tsk,其语义与save_stack_trace_tsk 相似,但它不适用于模块。此外,还有stack_trace_save,可用于模块,但仅适用于当前任务。这两个函数都应该适用于 x86。
  • @Tsyvarev 我需要用do_each_thread 检索所有线程的堆栈,但新函数似乎没有使用task_struct 作为参数
  • 是的,stack_trace_save 函数仅适用于当前任务。在我之前的评论中,我错误地引用了函数stack_trace_save_tsk。正确的是kernel/stacktrace.c:137。它包含“有用的”函数定义(而不是关于不支持的警告)。

标签: linux multithreading kernel callstack


【解决方案1】:

这个问题看起来很诱人,所以我做了一些挖掘,这是我的发现。

TLDR; stack_trace_save() 函数被 arch_stack_walk() 接口替换*

这是整合计划的一部分,并删除重复代码。 linux commit 214d8ca6ee854 为堆栈跟踪提供通用架构。

名为arch_stack_walk 的新接口。 使它更通用。 这发生在 2019 年 4 月 25 日。根据Kernel release History Wiki 最后一次更改是在 5.1 中。在linux commit 3599fe12a125f

回答你的最后一个问题

what should I use?

save_stack_trace_tsk -> stack_trace_save_tsk

有不同的函数声明。

【讨论】:

    【解决方案2】:

    自己解决:

    unsigned long store[64];
    
    int len = stack_trace_save_tsk(current, store, 64, 0);
    for (int i = 0; i < len; i ++) {
        pr_info("stack at %p\n", store[i]);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-04
      • 1970-01-01
      • 2016-03-30
      • 1970-01-01
      • 1970-01-01
      • 2015-05-12
      • 1970-01-01
      • 2016-12-03
      相关资源
      最近更新 更多