Heng30的博客
搜索 分类 关于 订阅

如何进行Linux驱动调试-dump_stack?

2025-02-25

dump_stack() 是 Linux 内核中一个关键的调试函数,用于在系统发生异常(如内核panic、oops或死锁)时打印当前线程的调用堆栈信息。

功能与作用

  • 堆栈回溯:打印当前CPU执行线程的调用堆栈(Call Stack),展示从当前函数到初始调用点的嵌套调用链。

  • 调试辅助:帮助开发者定位代码中导致崩溃或异常的源头,尤其是在没有调试器(如 KGDB)的环境中。

  • 动态触发:可在代码中手动插入dump_stack(),或在特定条件(如BUG_ON()、panic())下自动触发。

内核配置依赖

  • 帧指针(Frame Pointer):启用CONFIG_FRAME_POINTER确保编译器生成可回溯的堆栈帧。

  • 符号表:CONFIG_KALLSYMS=yCONFIG_KALLSYMS_ALL=y启用完整符号解析。

  • 调试选项:CONFIG_DEBUG_KERNELCONFIG_DEBUG_INFO等。

例子

#include <linux/kernel.h>

void my_debug_function(void)
{
    pr_info("Debug trigger:\n");
    dump_stack(); // 打印调用堆栈
}

输出

[28258.990860] Call Trace:
[28258.990864]  <TASK>
[28258.990868]  dump_stack_lvl+0x76/0xa0
[28258.990878]  ? __pfx_hello_init+0x10/0x10 [hello]
[28258.990881]  dump_stack+0x10/0x20
[28258.990929]  init_module_from_file+0x96/0x100
[28258.990932]  ? init_module_from_file+0x96/0x100
[28258.990934]  ? ksys_read+0x73/0x100
[28258.990946]  idempotent_init_module+0x11c/0x310
...