如何在 Linux 内核中打印当前线程堆栈跟踪?

问题描述 投票:0回答:2

我希望能够打印 Linux 内核中线程的堆栈跟踪。

详细信息:我想向特定函数添加代码(例如

swap_writepage()
),该函数将打印调用该函数的线程的完整堆栈跟踪。像这样的东西:

int swap_writepage(struct page *page, struct writeback_control *wbc)
{

    /* code goes here to print stack trace */

    int ret = 0;

    if (try_to_free_swap(page)) {
        unlock_page(page);
        goto out;
    }
    if (frontswap_store(page) == 0) {
        set_page_writeback(page);
        unlock_page(page);
        end_page_writeback(page);
        goto out;
    }
    ret = __swap_writepage(page, wbc, end_swap_bio_write);
out:
    return ret;
}
c linux linux-kernel stack-trace
2个回答
30
投票

Linux 内核有一个非常著名的函数,称为

dump_stack()
here,它可以打印堆栈的内容。根据查看堆栈信息将其放入您的函数中。


3
投票

@rakib 当然是完全正确的。

此外,我想指出,可以定义简单而优雅的宏,以帮助在需要时打印调试信息。多年来,我将这些宏和便利例程放入头文件中;您可以查看并在这里下载:“方便的标题”

有宏/函数可以:

  • 制作调试打印以及 funcname / line# 信息(通过通常的 printk() 或trace_printk()) 并且仅当调试模式打开时
  • 转储内核模式堆栈
  • 打印当前上下文(进程或中断以及表单中的标志) ftrace 使用)
  • 一个简单的assert()宏(!)
  • CPU 密集型 DELAY_LOOP(对于必须在处理器上旋转的测试装置很有用)
  • 相当于用户模式睡眠功能
  • 计算给定两个时间戳(timeval 结构)的时间增量的函数
  • 将十进制转换为二进制,并且
  • 还有一些。

哇:-)

© www.soinside.com 2019 - 2024. All rights reserved.