SimpleKernel 1.17.0
Loading...
Searching...
No Matches
backtrace.cpp File Reference
#include <cpu_io.h>
#include <elf.h>
#include <array>
#include <cerrno>
#include <cstdint>
#include "arch.h"
#include "basic_info.hpp"
#include "kernel.h"
#include "kernel_elf.hpp"
#include "kernel_log.hpp"
Include dependency graph for backtrace.cpp:

Go to the source code of this file.

Functions

auto backtrace (std::array< uint64_t, kMaxFrameCount > &buffer) -> int
 
auto DumpStack () -> void
 打印调用栈
 

Function Documentation

◆ backtrace()

auto backtrace ( std::array< uint64_t, kMaxFrameCount > &  buffer) -> int

Definition at line 18 of file backtrace.cpp.

18 {
19 auto* rbp = reinterpret_cast<uint64_t*>(cpu_io::Rbp::Read());
20 size_t count = 0;
21 while ((rbp != nullptr) && (*rbp != 0U) && count < buffer.max_size()) {
22 auto rip = *(rbp + 1);
23 if (rip < reinterpret_cast<uint64_t>(__executable_start) ||
24 rip > reinterpret_cast<uint64_t>(__etext)) {
25 break;
26 }
27 rbp = reinterpret_cast<uint64_t*>(*rbp);
28 buffer[count++] = rip;
29 }
30
31 return static_cast<int>(count);
32}
void * __etext[]
代码段结束
void * __executable_start[]

◆ DumpStack()

auto DumpStack ( ) -> void

打印调用栈

Note
调用 backtrace 获取调用栈并解析符号后输出到日志

Definition at line 34 of file backtrace.cpp.

34 {
35 std::array<uint64_t, kMaxFrameCount> buffer{};
36
37 // 获取调用栈中的地址
38 auto num_frames = backtrace(buffer);
39
40 for (auto current_frame_idx = 0; current_frame_idx < num_frames;
41 current_frame_idx++) {
42 // 打印函数名
43 for (auto symtab : KernelElfSingleton::instance().symtab) {
44 if ((ELF64_ST_TYPE(symtab.st_info) == STT_FUNC) &&
45 (buffer[current_frame_idx] >= symtab.st_value) &&
46 (buffer[current_frame_idx] <= symtab.st_value + symtab.st_size)) {
47 klog::Err("[{}] {:#x}",
48 reinterpret_cast<const char*>(
49 KernelElfSingleton::instance().strtab + symtab.st_name),
50 buffer[current_frame_idx]);
51 }
52 }
53 }
54}
__always_inline auto backtrace(std::array< uint64_t, kMaxFrameCount > &buffer) -> int
Definition backtrace.cpp:18
etl::singleton< KernelElf > KernelElfSingleton
auto Err(etl::format_string< Args... > fmt, Args &&... args) -> void
以 ERROR 级别记录日志
Here is the call graph for this function: