debugger(七):栈帧(backtrace)

〇、前言

在前面已经详细得介绍了栈帧,这里实现 backtrace

一、backtrace

思路是遍历 stack,搜索 stack pointer,逐个打印栈帧信息,一直打印到 main 函数。

void Debugger::print_backtrace() {
    auto output_frame = [frame_number = 0] (auto&& func) mutable {
        std::cout << "frame #" << frame_number++ << ": 0x" << dwarf::at_low_pc(func)
                  << ' ' << dwarf::at_name(func) << std::endl;
    };

    auto current_func = get_function_from_pc(get_pc());
    output_frame(current_func);

    auto frame_pointer = get_register_value(m_pid, reg::rbp);
    auto return_address = read_memory(frame_pointer+8);

    while (dwarf::at_name(current_func) != "main") {
        current_func = get_function_from_pc(return_address);
        output_frame(current_func);
        frame_pointer = read_memory(frame_pointer);
        return_address = read_memory(frame_pointer+8);
     }
}

这样就好了,测试一下:

> ./minidbg stack
Start debugging the progress: stack, pid = 147785:
unknown SIGTRAP code 0
minidbg> b a
Set breakpoint at address 0x555555555131
minidbg> continue
Hit breakpoint at adsress 0x555555555131
  void a() {
>     int foo = 1;
      int foo1 = 1;
      int foo2 = 1;
      int foo3 = 1;
  }
  
  void b() {
      int foo = 1;
      int foo1 = 1;
      a();
  
minidbg> backtrace
frame #0: 0x1129 a
frame #1: 0x1150 b
frame #2: 0x1180 c
frame #3: 0x11b0 d
frame #4: 0x11e0 e
frame #5: 0x1210 f
frame #6: 0x1240 main

backtrace 符合预期。

通过读取帧指针(frame pointer)和返回地址来遍历整个调用栈,直到达到main函数为止。每次循环都会输出当前函数的栈帧信息,并更新帧指针和返回地址以跳转到下一个栈帧。

相关推荐

  1. debugger):backtrace

    2024-06-11 22:16:03       30 阅读
  2. Linux x86_64 backtrace 回溯

    2024-06-11 22:16:03       29 阅读
  3. UntiyShader(Debug

    2024-06-11 22:16:03       68 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-11 22:16:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-11 22:16:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-11 22:16:03       87 阅读
  4. Python语言-面向对象

    2024-06-11 22:16:03       96 阅读

热门阅读

  1. kivy 画画

    2024-06-11 22:16:03       23 阅读
  2. 在Windows上,使用RDP连接Ubuntu 22.04

    2024-06-11 22:16:03       31 阅读
  3. C#面:请解释web.config⽂件中的重要节点

    2024-06-11 22:16:03       27 阅读
  4. 服务器升级Nacos2.2.3报错、rocksdb报错问题处理

    2024-06-11 22:16:03       27 阅读
  5. Django:如何将多个数据表内容合在一起返回响应

    2024-06-11 22:16:03       28 阅读
  6. ssh远程管理和nfs共享存储服务

    2024-06-11 22:16:03       26 阅读
  7. nginx自签证书生成及配置

    2024-06-11 22:16:03       30 阅读
  8. BigDecimal金额计算以及实战运用问题记录

    2024-06-11 22:16:03       29 阅读
  9. 【Mysql】mysql 拼接字符

    2024-06-11 22:16:03       29 阅读
  10. C++之assert惯用法

    2024-06-11 22:16:03       30 阅读