Luyoung
  • 首页
  • 归档
  • 分类
  • 标签
  • 关于
调试器实现(四):源代码定位与调试信息解析

调试器实现(四):源代码定位与调试信息解析

〇、前言终于来到令人激动的源代码 level 了,这里将会有一些很有意思的算法,来实现源代码级别的调试,这将会非常有趣。 一、使用 libelfin 库我们不可能直接去读取整个 .debug info 段来进行设置,这是没有必要的,可以使用现成的库。首先初始化 debugger 对象: 12345678910111213141516class debugger {public:
2024-06-10
Systems Programming
#debugger #DWARF #source code
调试器实现(三):ELF 与 DWARF 调试信息

调试器实现(三):ELF 与 DWARF 调试信息

〇、前言事实上,一个成熟的 debugger 是不会利用 break 0xADDR 类似的命令来打断点的,这个需要改进,使得它可以直接利用函数名、行数等来打断点。这就需要生成编译信息,只需要在编译的时候,在目标文件中加以下参数: 12# 添加编译器标志set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0 -gdwarf-2&
2024-06-10
Systems Programming
#ELF #debugger #DWARF
调试器实现(二):读写内存与寄存器

调试器实现(二):读写内存与寄存器

〇、前言上一节,可以通过 break 0xADDR 的方式打断点,这种打断点的原理很简单,就是修改指令的第一个字节为 int3(0xcc)。本文将会读写内存单元、读写寄存器。 一、读写内存启动 mini debugger,并打一个断点: 123456789> ./minidbg helloStart debugging the progress: hello, pid = 128959:
2024-06-10
Systems Programming
#memory #debugger #register
调试器实现(一):断点机制与案例分析

调试器实现(一):断点机制与案例分析

〇、前言最近在学习 debugger 的实现原理,并按照博客实现,是一个很不错的小项目,这是地址。由于 macOS 的问题,系统调用并不完全相同,因此实现了两个版本分支,一个是 main 版本分支(macOS M1 silicon),另一个是 linux 版本分支(Ubuntu 20.04 x86),这是仓库地址。以下以及后都用 linux 版本代码阐述其原理。 一、断点创建这很简单,主要是由
2024-05-25
Systems Programming
#debugger #breakpoint #ptrace
C++ 内存模型笔记:从 C 对象布局到语言抽象

C++ 内存模型笔记:从 C 对象布局到语言抽象

〇、前言本文将会讨论:Linux 下 C、C++的内存模型。 一、C以下是一个示例,通过打印地址的值以及借助 nm 工具,来判断内存区域: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566#incl
2024-05-20
Programming Languages
#memory model #C++
C++ 语言笔记:再谈智能指针实现细节

C++ 语言笔记:再谈智能指针实现细节

〇、前言本文会讨论 shared_ptr、weak_ptr、unique_ptr以及智能指针的相关注意事项。 一、具体实现关于 shared_ptr、weak_ptr,虽然具体的实现细节可能根据不同的编译器和版本有所不同,下面仅仅重点介绍了 std::shared_ptr 和 std::weak_ptr 析构函数的伪代码,这些代码将展示它们如何管理资源和引用计数。这些代码不是任何特定标准库实现
2024-05-18
Programming Languages
#C++ #smart pointer #RAII
C++ 调试笔记:函数调用过程与调用栈

C++ 调试笔记:函数调用过程与调用栈

正文本文会讨论C++中函数的调用过程,以及堆栈、栈帧等调试信息。平台以及工具为 Apple Silicon M1 + lldb。 这将会从这个例子开始: 12345678910111213141516171819202122232425262728293031#include <stdio.h>#include <stdlib.h>#include <sys/ty
2024-05-17
Programming Languages
#C++ #debugging #call stack
C++ 调试笔记:内存管理问题定位

C++ 调试笔记:内存管理问题定位

正文本文将会通过一个例子,通过 nm、lldb 工具查看 ELF 文件的内存管理: 123456789101112131415161718192021#include <iostream>using namespace std;/*说明:C++中不再区分初始化和未初始化的全局变量、静态变量的存储区,如果非要区分下述程序标注在了括号中*/int g_var = 0; // g_var
2024-05-16
Programming Languages
#memory #C++ #debugging
C++ 并发编程:构建线程安全队列

C++ 并发编程:构建线程安全队列

正文线程安全队列的完整的类定义,其中采用了条件变量: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455#include <condition_variable>#include <memory>#include <
2024-05-15
Programming Languages
#C++ #concurrency #thread-safe queue
C++ 并发编程:使用 condition_variable 等待条件成立

C++ 并发编程:使用 condition_variable 等待条件成立

一、用std::condition_variable等待处理数据伪代码如下: 123456789101112131415161718192021222324252627282930std::mutex mut;std::queue<data_chunk> data_queue; ⇽--- ①std::condition_variable data_cond;void dat
2024-05-15
Programming Languages
#C++ #concurrency #condition variable
1…1718192021…31

搜索

Hexo Fluid
总访问量 次 总访客数 人