【问题标题】:Debugging scheduling while atomic原子时调试调度
【发布时间】:2015-10-11 14:19:16
【问题描述】:

我被分配到另一个人编写的内核模块上工作,我现在没有代码并且存在“原子时调度”错误。

据我了解,这是由于在由自旋锁保护的关键部分中休眠造成的。

有什么东西可以帮助我找到源头 - 睡眠发生的关键部分或在睡眠尝试期间获得的自旋锁? (通常任何关于调试自旋锁的好文章推荐都会受到赞赏)。

问候 雷内

【问题讨论】:

  • 通常,如果您看到该消息,则会打印堆栈跟踪。那么这有什么问题呢?
  • 是的,你是对的,在某些调用跟踪中,有有用的信息,但其中许多只是说:i386_start_kernel -> start_kernel -> rest_init -> cpu_idle -> cpuidle_idle_call
  • 现在我明白了 - 不是来自未触发错误的内核的调用跟踪(评论上方)吗?
  • 回溯应该加上类似 _schedule 的东西。发布描述问题的完整日志
  • 关于核心 - 有可能,检查代码

标签: debugging linux-kernel spinlock


【解决方案1】:

您可以使用 Kprobes 动态中断任何内核函数:

  1. Kprobes (Kernel probes) documentation
  2. An introduction to Kprobes

有一篇关于 Linux 分析的好文章,但它是用俄语写的。

Mechanisms of profiling in Linux

此外,调试 Linux 内核模块 (LKM) 的老派是使用 printk() 函数。

你可以写一个宏,它会显示文件名、函数名、行号。

我为自己写了一个类似的宏。

  1. Macros for debugging
  2. Example of how to use this macro.

希望您在不久的将来解决问题!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-15
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多