![](/img/trans.png)
[英]How does debug exceptions (ptrace single_step) work in arm64 on Linux kernel?
[英]How to debug ARM Linux kernel (msleep()) lock up?
我首先要寻找调试技巧。 如果有人可以指出要更改的一行代码或者要设置一个外设配置位以解决问题,那就太棒了。 但这不是我所希望的; 我正在寻找更多如何调试它。
谷歌搜索“msleep挂起linux内核站点:stackoverflow.com”产生13个答案,没有一个是关键,所以我想我可以安全地问。
我为嵌入式TI AM1808 ARM处理器(Sitara / DaVinci?)重建了ARM Linux内核。 我看到所有启动日志都登录到了来自串口的login:提示符,但尝试登录没有响应,甚至没有回显我输入的内容。
经过大量调试后,我到达内核并在第828行和第830行之间添加了调试代码(是的,内核版本是2.6.37)。 这是在调用'sbin / init'之前的内核模式中:
http://lxr.linux.no/linux+v2.6.37/init/main.c#L815
在第830行之前,我添加了一个永久循环printk,我看到了结果。 我让它运行了大约几个小时,它大约有200万。 样品行:
dbg:init/main.c:1202: 2088430
所以它没有问题就吐出了6000万字节。
但是,如果我在循环中添加msleep(1000),它只打印一次,即msleep()不会返回。
详细信息:在调度程序中的第4073行添加条件printk,该条件设置在上述永久测试循环开始时设置的标志上,表示schedule()在挂起时不再调用:
http://lxr.linux.no/linux+v2.6.37/kernel/sched.c#L4064
.config /'设备驱动程序'下的唯一选择是:块设备I2C支持SPI支持
使用uboot / TFTP加载内核及其ramdisk。 我不相信它试图使用以太网。 由于所有这些都发生在'/ sbin / init'之前,因此应该很少发生。
更多细节:我有一个非常相似的CPU与相同的CPU。 我可以运行相同的uImage和相同的ramdisk,它在那里工作正常。 我可以登录并做通常的事情。
我已经运行了内存测试(总共64 MB,将内核限制为32M并测试其他32M;它是单芯片DDR2)并且没有发现任何问题。 一块板使用UART0,另一块板使用UART2,但启动日志都来自两者,因此不应该是问题。
非常感谢任何调试技巧。 我没有合适的JTAG,所以我不能使用它。
如果msleep
没有返回或没有进行schedule
,那么为了调试我们可以跟随调用堆栈。
msleep
调用schedule_timeout_uninterruptible(timeout)
调用schedule_timeout(timeout)
,如果传递给它的jiffies中的超时为<0,则在默认情况下退出而不调用schedule,因此这是一件要检查的事情。
如果timeout
为正,则setup_timer_on_stack(&timer, process_timeout, (unsigned long)current);
调用,然后是__mod_timer(&timer, expire, false, TIMER_NOT_PINNED);
在致电schedule
之前
如果我们没有按schedule
那么必须在setup_timer_on_stack
或__mod_timer
发生一些事情。
setup_timer_on_stack的setup_timer_on_stack
是setup_timer_on_stack
调用setup_timer_on_stack_key
,如果启用了CONFIG_DEBUG_OBJECTS_TIMERS
则调用init_timer_on_stack_key
为外部调用或调用init_timer_key(timer, name, key);
而话费debug_init
其次__init_timer(timer, name, key)
。
__mod_timer
首先调用timer_stats_timer_set_start_info(timer);
然后是很多其他函数调用。
我会建议通过将一个或两个的printk在开始schedule_timeout
可能是两侧setup_timer_on_stack
来电或两侧__mod_timer
电话。
这个问题已经解决了。
随着prink的自由使用,确定schedule()确实切换到另一个任务,即空闲任务。 在这种情况下,作为嵌入式Linux,我从安装的空闲任务中复制了原始代码库。 这个空闲任务似乎不适合我的电路板,并锁定了CPU,从而导致崩溃。 注释掉对空闲任务的调用
http://lxr.linux.no/linux+v2.6.37/arch/arm/mach-davinci/cpuidle.c#L93
解决问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.