Luyoung
  • 首页
  • 归档
  • 分类
  • 标签
  • 关于
2024.06.18 刷题日记

2024.06.18 刷题日记

76. 最小覆盖子串这道题目的思路是利用哈希表来存储字符串的字符出现的频率,然后利用滑动窗口来确定是否包含目标串,如果没有包含,就继续滑动右指针。当子串已经包含的时候,就收缩窗口,更新答案,以及右移 left。 12345678910111213141516171819202122232425262728293031323334353637383940414243class Solution
2024-06-18
LeetCode
#算法 #数据结构 #leetcode
2024.06.17 刷题日记

2024.06.17 刷题日记

42. 接雨水这道题的关键点是基于贪心策略,同时设置双指针,left_max 追踪左边的最大值 height[left],right_max 同理。如果 height[left] < height[right],那么就可以收集雨水,雨水量为 water += left_max - height[left],同时右移左指针;反之同理: 1234567891011121314151
2024-06-18
LeetCode
#算法 #数据结构 #leetcode
2024.06.16 刷题日记

2024.06.16 刷题日记

前言今天刷了大概两个半小时,一边刷一边学,一边吃零食。效率有点低了~ 以后每天都会刷,并且写刷题日记,题目标题有题目序号以及题目名称,方便以后查询。 1. 两数之和重点是要降低时间复杂度,所以用哈希表了,由于不能重复出现,所以是先查询后插入: 12345678910111213141516class Solution {public: vector<int> two
2024-06-16
LeetCode
#算法 #数据结构
mmap() 的几种用法

mmap() 的几种用法

〇、前言mmap 是一个非常强大的系统调用,常用于映射文件到内存中,以实现快速和方便的文件访问,也用于进程间通信等多种场景。下面是一些 mmap 的常见用法: 1. 文件映射(Memory-mapped files)文件映射是 mmap 最直接的用途之一,可以将整个文件或文件的一部分映射到进程的地址空间。这允许程序像访问普通内存那样访问文件数据,可以提高文件操作的性能,特别是对于大文件的随机访
2024-06-12
OS > 系统编程 > Unix/Linux
#系统调用 #mmap #文件
debugger(七):栈帧(backtrace)

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 断点

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

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(四):源代码

debugger(四):源代码

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

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(二):读、写内存以及寄存器

debugger(二):读、写内存以及寄存器

〇、前言上一节,可以通过 break 0xADDR 的方式打断点,这种打断点的原理很简单,就是修改指令的第一个字节为 int3(0xcc)。本文将会读写内存单元、读写寄存器。 一、读写内存启动 mini debugger,并打一个断点: 123456789> ./minidbg helloStart debugging the progress: hello, pid = 128959:
2024-06-10
C++ > debugger
#c++ #debugger
1…1112131415…26

搜索

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