2014-01-15 46 views
6

我希望能够在Linux内核中打印线程的堆栈跟踪。如何在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不是面向对象的语言,事情开始看起来很难理解,更别说没有一个体面的IDE可以分析C代码了。我不想在调试器下开始运行Linux。注意:如果你是一个内核开发newb并且想要在调试器下运行Linux,不要付出努力......它将被证明是徒劳无功的(步调毫无意义)。

回答

9

Linux内核具有非常着名的功能,称为dump_stack()here,它打印堆栈的内容。根据堆栈信息将它放入你的函数中。

+0

谢谢!做得很好! – hebbo

2

@rakib当然是正确的。

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

有宏/功能:

  • 化妆调试输出与funcname的/线路#信息(通过平时 的printk()或trace_printk())沿且仅当DEBUG模式是在
  • 转储内核模式堆栈
  • 打印当前上下文(进程或形式连同标志中断 是ftrace用途)
  • 一个简单的断言()宏(!)
  • 一个CPU密集型DELAY_LOOP(对于试验台必须在处理器上旋有用)
  • 等效到用户模式睡眠功能
  • 一个函数来计算给定的时间增量两个时间戳(的timeval结构)
  • 转换十进制以二进制,并
  • 更多。

呼:-)

+0

好东西......谢谢! – hebbo