gpt4 book ai didi

linux - 尝试添加 print_stack_trace 时出现链接错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:12:29 26 4
gpt4 key购买 nike

在我的嵌入式 Linux 内核代码中的一个异常处理程序中添加对“print_stack_trace”的调用后,我收到一个看起来像链接问题的错误。

详情如下:

  • 我的目标和背景:我试图在 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

    我可以从上面的数据中注意到地址 fec 对应于 b6f98eec .我不知道导致中止的值是什么。我跑了 nmobjdump针对我的 Linux 镜像(vmlinux 文件),并且无法将其追溯到任何符号地址。
    现在,我正在尝试调用 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

  • 请求您的帮助以解决此问题。如果需要任何信息,请告诉我。

    最佳答案

    永远不要定义CONFIG_*手动宏 :

    // DO NOT DO THAT!
    #define CONFIG_STACKTRACE

    它们旨在在内核配置期间设置(或不设置)( make menuconfigmake defconfig 或其他 *config 目标)并存储到 .config文件。

    配置参数可能取决于目标机器(架构)或其他参数,如果没有给定参数定义的功能,将无法正常工作(甚至无法编译,就像您的情况一样)。

    如果您需要设置一些配置参数,可以通过 make menuconfig 进行设置。 :
  • 按键/ ,对话Search Configuration Parameter会出现。
  • 写入配置参数的名称(不区分大小写,不需要CONFIG_前缀)。例如,输入 stacktrace .按OK .
  • 在搜索输出中找到参数的确切名称:Symbol: STACKTRACE .
  • 参数的当前值将在 [] 中给出.如果是[=y][=m] ,则该符号已在内核中定义。如果是[=n] ,然后检查,如何设置给定的符号。
  • 可由用户设置的符号有Prompt:行,它描述了菜单中符号的位置。请注意,该符号仅在 Dependens on: 下的表达式时显示在菜单中。很满足。例如,只有在设置了 STACKTRACE_SUPPORT 符号时才能设置 STACKTRACE 符号。相关符号的值已在表达式中显示。
  • 没有 Prompt: 的符号行,不能由用户设置,只能自动设置:以特定于拱的方式,或被其他符号选择(Selected by:)。在 x86符号 STACKTRACE_SUPPORT 已设置,arm也定义了这个符号。
  • 如果任何配置已更改,则需要重新构建内核。
  • 关于linux - 尝试添加 print_stack_trace 时出现链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35194709/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com