在没有打印以及ICE无法连接的情况下,如何知道kernel hang的位置

前提是reset板子不会照成memory被reset

方法一(已测试):

1. 打开你的System.map文件,找到symbol: __log_buf

比如:806d6f88 b __log_buf

这里的地址0x806d6f88是虚拟地址,不过是和物理地址一一对应的,

一般双方只差一个最高4位的偏移。本例中__log_buf的物理地址是

0x106d6f88

2. boot板子进入uboot,运行一下命令:

md 0x106d6f88 40

你就能够看到上次的输出了(如下)。


106d6f88: 00000000 00000000 001f0030 c6000000    ........0.......
106d6f98: 746f6f42 20676e69 756e694c 6e6f2078    Booting Linux on
106d6fa8: 79687020 61636973 5043206c 00302055     physical CPU 0.
106d6fb8: 00000000 00000000 007a0090 a6000000    ..........z.....
106d6fc8: 756e694c 65762078 6f697372 2e33206e    Linux version 3.


方法二(未测试)

1. 加入如下的改动:

> diff --git a/kernel/printk.c b/kernel/printk.c index7982a0a..a67a178

> 100644

> --- a/kernel/printk.c

> +++ b/kernel/printk.c

> @@ -661,6 +661,8 @@ static voidcall_console_drivers(unsigned start,

> unsigned end)

>        _call_console_drivers(start_print, end, msg_level);  }

> +extern void printch(const char c);

> +

>  static void emit_log_char(char c)

>  {

>        LOG_BUF(log_end) = c;

> @@ -671,6 +673,8 @@ static void emit_log_char(charc)

>                con_start = log_end - log_buf_len;

>         if(logged_chars < log_buf_len)

>                logged_chars++;

> +

> +      printch(c);

>  }

目的应该是用earlyprintk打印出上次printk的buffer。

2. 加入 CONFIG_DEBUG_LL重新编译kernel

3. 加入earlyprintk到你的bootloader的参数里。

4,然后启动kernel就能看到上次的打印了。


你可能感兴趣的:(在没有打印以及ICE无法连接的情况下,如何知道kernel hang的位置)