xref: /DragonOS/docs/kernel/debug/traceback.md (revision 63de30bbe0a20058c4c16c634effee78fe4e8bf3)
1b8c3d97eSfslongjin# 内核栈traceback
2b8c3d97eSfslongjin
3*427c71b3Sfslongjin## 简介
4*427c71b3Sfslongjin
5*427c71b3Sfslongjin  内核栈traceback的功能位于`kernel/debug/traceback/`文件夹中。为内核态提供traceback的功能,打印调用栈到屏幕上。
6*427c71b3Sfslongjin
7*427c71b3Sfslongjin---
8*427c71b3Sfslongjin
9*427c71b3Sfslongjin## API
10*427c71b3Sfslongjin
11*427c71b3Sfslongjin### `void traceback(struct pt_regs * regs)`
12*427c71b3Sfslongjin
13*427c71b3Sfslongjin#### 作用
14*427c71b3Sfslongjin
15*427c71b3Sfslongjin  该接口定义于`kernel/debug/traceback/traceback.h`中,将会对给定内核栈进行traceback,并打印跟踪结果到屏幕上。
16*427c71b3Sfslongjin
17*427c71b3Sfslongjin#### 参数
18*427c71b3Sfslongjin
19*427c71b3Sfslongjin##### regs
20*427c71b3Sfslongjin
21*427c71b3Sfslongjin  要开始追踪的第一层内核栈栈帧(也就是栈的底端)
22*427c71b3Sfslongjin
23*427c71b3Sfslongjin---
24*427c71b3Sfslongjin
25*427c71b3Sfslongjin## 实现原理
26*427c71b3Sfslongjin
27*427c71b3Sfslongjin  当内核第一次链接之后,将会通过Makefile中的命令,运行`kernel/debug/kallsyms`程序,提取内核文件的符号表,然后生成`kernel/debug/kallsyms.S`。该文件的rodata段中存储了text段的函数的符号表。接着,该文件将被编译为`kallsyms.o`。最后,Makefile中再次调用`ld`命令进行链接,将kallsyms.o链接至内核文件。
28*427c71b3Sfslongjin
29*427c71b3Sfslongjin  当调用`traceback`函数时,其将遍历该符号表,找到对应的符号并输出。
30*427c71b3Sfslongjin
31*427c71b3Sfslongjin---
32*427c71b3Sfslongjin
33*427c71b3Sfslongjin## 未来发展方向
34*427c71b3Sfslongjin
35*427c71b3Sfslongjin- 增加写入到日志文件的功能