debugger(七):栈帧(backtrace)

2024-06-11 22:28
文章标签 debugger 栈帧 backtrace

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

这篇关于debugger(七):栈帧(backtrace)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1052425

相关文章

Debugging Lua Project created in Cocos Code IDE creates “Waiting for debugger to connect” in Win-7

转自 I Installed Cocos Code IDE and created a new Lua Project. When Debugging the Project(F11) the game window pops up and gives me the message waiting for debugger to connect and then freezes. Also a

【JVM】JVM栈帧中的动态链接 与 Java的面向对象特性--多态

栈帧 每一次方法调用都会有一个对应的栈帧被压入栈(虚拟机栈)中,每一个方法调用结束后,都会有一个栈帧被弹出。 每个栈帧中包括:局部变量表、操作数栈、动态链接、方法返回地址。 JavaGuide:Java内存区域详解(重点) 动态链接 动态链接:指向运行时常量池中该栈帧所属方法的引用。 多态 多态允许不同类的对象对同一消息做出响应,但表现出不同的行为(即方法的多样性)。 多态

android waiting for debugger

在eclipse中进行调试时经常出现下面这样的提示 Application XXX is waiting for the debugger to attach 但是一般情况下,过了一会之后会进入调试状态 但是最近两天进行调试的时候模拟器上九一直停留在上面这个提示对话框,一直不能进入调试状态 在按照网上说的在dos命令行中进行 adb kill-server adb start-serv

浏览器 F12调试网页出现Paused in debugger问题解决

进入网站打开调试自动进入debug模式 按了N次F8还是跳不出去,真烦啊 直接关掉得了 打开source一栏 点击Activate breakpoints按钮,或者直接 Ctrl+ F8 然后把Any XHR or fetch取消勾选 刷新一下页面 然后网页上的烦人debugger就没有了,想看啥就看啥。

H5,防止 h5 无限 debugger

0x00 方法一:停用断点 停用断点:Deactivate breakpoints 点击后,变成蓝色,即为停用。 但有时候,不生效! 0x01 方法二:条件断点 1、无限断点出现时,会自动定位,如图: 2、点击断点所在行号: 3、右键鼠标,弹出菜单,选择:Edit breakpoint 4、在输入框内,输入 false,再按 回车键 5、最后一步:刷新网页即可!

解决无限debugger总结

基本工具 1: Notepad(修改保存) + ReRes(插件替换) ReRes安装教程 2: Fidder + 编程猫 + hook 情况 fidder基本:fidder插件使用hook构造器, 例如下 //配合编程猫专用工具进行hook(function() {'use strict'//过瑞数 debugervar eval_ = window.eval;window.ev

Debugger的使用

断点调试 1.打断点 2.以debug模式运行 3.流程控制

【C++庖丁解牛】函数栈帧的创建与销毁

🍁你好,我是 RO-BERRY 📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 1. 寄存器2. ebp和esp是如何对堆栈进行维护的,mian函数栈帧如何创建2.1 push ebp2.1 move ebp esp2.2 sub

PHP中debug_backtrace函数详解

debug_backtrace() 是 PHP 中的一个内置函数,用于生成一个回溯(backtrace)数组,该数组包含了当前代码执行的轨迹。这个函数在调试和错误处理时非常有用,因为它可以帮助开发者了解函数调用的上下文、文件名、行号等信息。 基本语法 debug_backtrace([int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT], int $

pdb — The Python Debugger

调试脚本文件test.py python -m pdb test.py 常用命令: l #查看运行到哪行代码 n #单步运行,跳过函数 s #单步运行,可进入函数 p 变量 #查看变量值 b 行号 #断点设置到第几行 b #显示所有断点列表 cl 断点号 #删除某个断点 cl #删除所有断点 c #跳到下一个断点 r #return