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

时间:2014-01-15 17:13:04

标签: c linux linux-kernel stack-trace

我希望能够在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,那么就不要付出努力......它将证明是没有用的(步进没有意义)。

2 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:2)

@rakib当然是完全正确的。

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

有以下宏/函数:

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

哇: - )