【问题标题】:How to print the current thread stack trace inside the Linux kernel?如何在 Linux 内核中打印当前线程堆栈跟踪?
【发布时间】:2014-02-04 07:20:20
【问题描述】:

我希望能够打印 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;
}

我的故事: 最近,Linux 内核开发人员在改进内核时开始采用面向对象的原则,内核是用 C 编写的。由于 C 不是 OO 语言,事情开始看起来很丑陋,更难理解,更不用说没有像样的 IDE 了分析C代码。而且我不想开始在调试器下运行 Linux。注意:如果你是内核开发新手,并且想在调试器下运行 Linux,请不要为此付出努力……这将证明是徒劳的(单步执行毫无意义)。

【问题讨论】:

    标签: c linux linux-kernel stack-trace


    【解决方案1】:

    Linux内核有一个众所周知的函数dump_stack()here,它打印堆栈的内容。根据堆栈信息将其放入您的函数中。

    【讨论】:

    • 谢谢!做得很好!
    【解决方案2】:

    @rakib 当然是完全正确的。

    此外,我想指出,可以定义简单而优雅的宏,以帮助在需要时打印调试信息。多年来,我将这些宏和便利例程放入头文件中;你可以看看download it here: "A Header of Convenience"

    有宏/函数可以:

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

    哇 :-)

    【讨论】:

      猜你喜欢
      • 2017-08-31
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      • 2010-10-06
      相关资源
      最近更新 更多