2024.06.16 刷题日记 前言今天刷了大概两个半小时,一边刷一边学,一边吃零食。效率有点低了~ 以后每天都会刷,并且写刷题日记,题目标题有题目序号以及题目名称,方便以后查询。 1. 两数之和重点是要降低时间复杂度,所以用哈希表了,由于不能重复出现,所以是先查询后插入: 12345678910111213141516class Solution {public: vector<int> two 2024-06-16 LeetCode #算法 #数据结构
mmap() 的几种用法 〇、前言mmap 是一个非常强大的系统调用,常用于映射文件到内存中,以实现快速和方便的文件访问,也用于进程间通信等多种场景。下面是一些 mmap 的常见用法: 1. 文件映射(Memory-mapped files)文件映射是 mmap 最直接的用途之一,可以将整个文件或文件的一部分映射到进程的地址空间。这允许程序像访问普通内存那样访问文件数据,可以提高文件操作的性能,特别是对于大文件的随机访 2024-06-12 OS > 系统编程 > Unix/Linux #系统调用 #mmap #文件
debugger(七):栈帧(backtrace) 〇、前言在前面已经详细得介绍了栈帧,这里实现 backtrace。 一、backtrace思路是遍历 stack,搜索 stack pointer,逐个打印栈帧信息,一直打印到 main 函数。 12345678910111213141516171819void Debugger::print_backtrace() { auto output_frame = [frame_n 2024-06-11 系统编程 > C++ > debugger #c++ #debugger
debugger(六):source level 断点 〇、前言前面一直使用 break 0xADDR 来打断点,这种打断点的方式及其不方便,需要手动获取某一行的断点,这一节的目标是采用以下方式打断点: 123456// 函数名break main// 源代码break main.cpp:10// 地址break 0xADDR 一、break 函数名这个可以在所有的编译单元中搜索。对于每一个 cu,只需要判断:(die.has(dwarf::DW 2024-06-11 C++ debugger #c++ #lldb #debugger
debugger(五):source level stepping 〇、前言前面的源代码打印,利用了 DWARF 格式化的信息,现在我们更进一步,利用它分别进行 stepi、step_over、step_in、step_out。 一、stepi这个最简单,我们只需要利用 ptrace 就行: 1234567891011121314151617181920212223242526void Debugger::single_step_instruction() & 2024-06-11 系统编程 > C++ > debugger #c++ #lldb #debugger
debugger(四):源代码 〇、前言终于来到令人激动的源代码 level 了,这里将会有一些很有意思的算法,来实现源代码级别的调试,这将会非常有趣。 一、使用 libelfin 库我们不可能直接去读取整个 .debug info 段来进行设置,这是没有必要的,可以使用现成的库。首先初始化 debugger 对象: 12345678910111213141516class debugger {public: 2024-06-10 C++ debugger #c++ #lldb #debugger
debugger(三):dwarf 文件 〇、前言事实上,一个成熟的 debugger 是不会利用 break 0xADDR 类似的命令来打断点的,这个需要改进,使得它可以直接利用函数名、行数等来打断点。这就需要生成编译信息,只需要在编译的时候,在目标文件中加以下参数: 12# 添加编译器标志set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0 -gdwarf-2& 2024-06-10 C++ > debugger #c++ #debugger
debugger(二):读、写内存以及寄存器 〇、前言上一节,可以通过 break 0xADDR 的方式打断点,这种打断点的原理很简单,就是修改指令的第一个字节为 int3(0xcc)。本文将会读写内存单元、读写寄存器。 一、读写内存启动 mini debugger,并打一个断点: 123456789> ./minidbg helloStart debugging the progress: hello, pid = 128959: 2024-06-10 C++ > debugger #c++ #debugger
debugger(一):打断点的实现以及案例分析 〇、前言最近在学习 debugger 的实现原理,并按照博客实现,是一个很不错的小项目,这是地址。由于 macOS 的问题,系统调用并不完全相同,因此实现了两个版本分支,一个是 main 版本分支(macOS M1 silicon),另一个是 linux 版本分支(Ubuntu 20.04 x86),这是仓库地址。以下以及后都用 linux 版本代码阐述其原理。 一、断点创建这很简单,主要是由 2024-05-25 系统编程 > C++ > debugger #c++ #debugger
C++内存模型 〇、前言本文将会讨论:Linux 下 C、C++的内存模型。 一、C以下是一个示例,通过打印地址的值以及借助 nm 工具,来判断内存区域: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566#incl 2024-05-20 C++ #c++