如何在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不是面向对象的语言,所以开始看起来非常难看,难以理解,可以分析C代码的IDE。 我不想在debugging器下开始运行Linux。 注意:如果你是一个内核开发新手,想要在debugging器下运行Linux,不要付出努力…这将被certificate是徒劳无功的(步调毫无意义)。

Linux内核在这里有非常有名的dump_stack()函数,它可以打印堆栈的内容。 根据查看堆栈信息将它放在你的函数中。

@rakib当然是正确的。

另外,我想指出的是,可以定义简单而优雅的宏,以便在需要时帮助打印调试信息。 多年来,我已经把这些宏和习惯放到一个头文件中, 您可以查看并下载:“方便的标题” 。

有宏/函数来:

  • 使调试打印与funcname /行#信息(通常通过printk()或trace_printk()),只有在DEBUG模式是开
  • 转储内核模式堆栈
  • 打印当前上下文(进程或中断与ftrace使用的形式的标志一起)
  • 一个简单的assert()宏(!)
  • 一个cpu密集型DELAY_LOOP(对于必须在处理器上旋转的测试设备很有用)
  • 相当于用户模式的睡眠功能
  • 计算给定两个时间戳(timeval结构)的时间增量的函数
  • 转换十进制到二进制,和
  • 多一些。

Whe 🙂