在沒有打印以及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就能看到上次的打印了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章