当前位置: 首页 > news >正文

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 0x555555555131void 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函数为止。每次循环都会输出当前函数的栈帧信息,并更新帧指针和返回地址以跳转到下一个栈帧。

http://www.lryc.cn/news/369650.html

相关文章:

  • kafka-重试和死信主题(SpringBoot整合Kafka)
  • electron-Vue: Module parse failed: Unexpected character ‘ ‘
  • 贪心算法-数组跳跃游戏(mid)
  • C++经典150题
  • 超详解——Python 序列详解——基础篇
  • DVWA-DC-6
  • ubuntu早期版本以及18.04后的版本,通过rc.local配置开机自启
  • 【环境搭建】1.阿里云ECS服务器 安装jdk8
  • idea插件开发之定义侧边栏
  • HarmonyOS未来五年的市场展望
  • R语言:什么是向量化操作(Vectorization)?
  • Python 机器学习 基础 之 【实战案例】中药数据分析项目实战
  • python中报错“ModuleNotFoundError: No module named ‘docx2txt‘”
  • json.dumps参数
  • 未来已来,划时代革命性产品——全息数字人管家系统,全网首发
  • psql导入数据报错排查
  • 项目:双人五子棋对战-对战模块(6)
  • LeakSearch:针对网络公开凭证的安全扫描与检测工具
  • ArcoDesgin a-model中自定义样式model-class无效
  • 持续总结中!2024年面试必问 20 道分布式、微服务面试题(十)
  • 北航第四次数据结构与程序设计编程题复习
  • golang调用外部程序包os/exec中的 Command和CommandContext 函数创建的Cmd对象的区别
  • Redis进阶知识个人汇总
  • 从中序与后序遍历序列构造二叉树-力扣
  • 操作系统期末复习(大题)
  • 解决富文本中抖音视频无法播放的问题——403
  • 2024最新华为OD机试(C卷+D卷)真题目录+使用说明+在线评测
  • hana 中的缓存视图功能,类似ORACLE 中的 物化视图功能
  • express入门02静态资源托管
  • Java常见的引用类型