2016-02-04 195 views
1

在我的嵌入式Linux內核代碼中的一個異常處理程序中添加對「print_stack_trace」的調用後,我看到一個看起來像鏈接問題的錯誤。嘗試添加print_stack_trace時鏈接錯誤

詳情如下:

  1. 我的目標&背景:我想在我的A9主板我的內核的開機調試的「不精確的外部終止」的內存故障。 我得到了不精確的中止錯誤如下:

    [ 1.248680] Unhandled fault: imprecise external abort (0x406) at 0xc397ffec 
    

我的目標是儘量和收集的棧和寄存器的更多細節時,該中止正在發生。一旦中止發生,我注意到它正在被引導到名爲asmlinkage void __exception do_DataAbort(unsigned long addr, unsigned int fsr, struct pt_regs *regs)的處理程序。

我呼籲dump_stack()這個功能,這給了我下面的堆棧內登記數據:

[ 1.245755] CPU: 0 PID: 240 Comm: hotplug Not tainted 3.14.26-ts-armv7l #3 
[ 1.245845] [<c0011fe0>] (unwind_backtrace) from [<c0010934>] (show_stack+0x10/0x14) 
[ 1.245869] [<c0010934>] (show_stack) from [<c00083c0>] (do_DataAbort+0x40/0x9c) 
[ 1.245906] [<c00083c0>] (do_DataAbort) from [<c0277f74>] (__dabt_usr+0x34/0x40) 
[ 1.245919] Exception stack(0xc397ffb0 to 0xc397fff8) 
[ 1.245935] ffa0:          00000000 00000000 00000000 00000000 
[ 1.245952] ffc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
[ 1.245969] ffe0: 00000000 be95fe80 00000000 b6f98eec 00000010 ffffffff 
[ 1.245985] Unhandled fault: imprecise external abort (0x406) at 0xc397ffec 

我可以從解決FFEC對應b6f98eec上面的數據說明。我不知道這會導致中止的價值。我對我的Linux映像(vmlinux文件)運行了nmobjdump,並且無法將其跟蹤到任何符號地址。 現在,我試圖從同一個處理程序中調用save_stack_trace()print_stack_trace(),以獲取有關此中止的更多詳細信息。

  • 變化我已經完成:我加入save_stack_trace()print_stack_trace()如下: 在該文件的頂部,我有以下: 頭文件夾雜=>

    #include<linux/stacktrace.h> 
    #include<asm/stacktrace.h> 
    
    #ifdef CONFIG_STACKTRACE 
    static unsigned long stack_entries[32]; 
    
    static struct stack_trace my_trace = { 
        .nr_entries = 0, 
        .entries = &stack_entries[0], 
        .max_entries = 32, 
        .skip = 0 
    }; 
    #endif 
    
  • 功能do_DataAbort裏面,我已經添加了下面的代碼:

    #ifdef CONFIG_STACKTRACE 
        save_stack_trace(&my_trace); 
        printk(KERN_ALERT "calling print_stack \n"); 
        print_stack_trace(&my_trace, 32); 
    #endif 
    

    在頭文件include/Linux/stacktrace.h的頂部,我試圖定義CONFIG_STACKTRACE

    #define CONFIG_STACKTRACE 
    
  • 我觀察和問題: 當我編譯該代碼,我正在看起來像一個接頭誤差的誤差:

    arch/arm/mm/built-in.o: In function 'do_DataAbort': 
    :(.exception.text+0x58): undefined reference to 'print_stack_trace' 
    make[1]: *** [vmlinux] Error 1 
    
  • 請求您的幫助來解決這個問題。請讓我知道是否需要任何信息。

    回答

    0

    你不應該只是添加一個#define CONFIG_STACKTRACE。您必須在您的內核配置中啓用此功能。這將確保將所需的功能內置到您的內核中。內核的配置過程中

    // DO NOT DO THAT! 
    #define CONFIG_STACKTRACE 
    

    他們的目的是要設置(或不設置)(make menuconfigmake defconfig或其他*config目標),並存入.config文件:

    2

    決不定義手動CONFIG_*宏。

    配置參數可能取決於目標機器(體系結構)或其他參數,沒有這些參數定義的功能將無法正常工作(甚至不會編譯,就像你的情況一樣)。


    如果你需要一些配置參數進行設置,一種方式可以通過make menuconfig被設置:

    1. 按鍵/,一個對話框Search Configuration Parameter將出現。
    2. 寫入配置參數的名稱(不區分大小寫,不需要前綴CONFIG_)。例如,輸入stacktrace。按OK
    3. 在搜索輸出中找到您的參數的確切名稱:Symbol: STACKTRACE
    4. 參數的當前值將在[]中給出。如果它是[=y][=m],那麼該符號已經在內核中定義。如果是[=n],那麼請檢查,如何設置給定的符號。
    5. 可以由用戶設置的符號有Prompt:行,它描述了菜單中符號的位置。請注意,只有在Dependens on:下的表達式被滿足時,該符號纔會顯示在菜單中。例如,只有當STACKTRACE_SUPPORT符號被設置時才能設置STACKTRACE符號。表達式中已經顯示了相關符號的值。
    6. 沒有Prompt:行的符號不能由用戶設置,並且只能自動設置:以特定於圓形的方式或被其他符號選擇(Selected by:)。在x86符號STACKTRACE_SUPPORT被設置,arm也定義了這個符號。
    7. 如果任何配置已更改,則內核需要重建。
    相關問題