GDB笔记

最近早手撕一个内存池,结果程序无法通过边界测试,找了许久也没找到问题,就学习了GDB进行调试,突然发现我之前过的是什么苦日子,早用上GDB我之前蓝桥杯不乱杀。特此记录一下。

编译

  • 添加-g,生成调试文件
  • 删除-O1/-O2/-O3,关闭编译器优化

一、程序启动与加载

命令 简写 用法 示例
gdb <可执行文件> - 加载调试程序 gdb a.out
run r 启动程序(可带参数) run arg1 arg2
set args - 设置程序启动参数 set args -b -x
attach <pid> - 附加到正在运行的进程 attach 1234
file <可执行文件> - 在GDB内加载程序 file a.out

二、断点管理

命令 简写 用法 示例
break <行号/函数名> b 设置断点 b mainb 101
break <文件:行号> b 指定文件断点 b test.c:20
break *<内存地址> b 内存地址断点 b *0x400448
break ... if <条件> b 条件断点 b 30 if i==5
info breakpoints i b 查看所有断点 -
delete <断点编号> d 删除断点 delete 2
disable/enable <断点编号> - 禁用/启用断点 disable 1
tbreak tb 设置临时断点(命中后自动删除) tbreak foo
watch <变量> - 监视变量变化 watch x
阅读更多...

八股文心得体会

为期40天的八股文训练营,让我收获颇丰。记得第一次面试的时候,面试官问的基本都是八股文上的题目,我虽然有着计算机网络、数据库、操作系统、C++等内容的知识储备,但是在面试的压力下,加上知识不成体系,回答的模棱两可、支支吾吾。而经过长达40天的训练,我对面试开始得心应手起来。我认为训练营的亮点如下:

  • 训练营的随时补签、周末休息的打卡机制,让意志稍微不那么坚定的同学也能够检查下来。
  • 训练营打卡要求的时口头回答,而非文字,更加贴合面试的场景,能够逐步改善我们的语言习惯,在面试的过程不在支支吾吾。我就在训练营中,逐步改掉了额、嗯等语气词,面试的回答也更加流畅自然。
  • 训练营下提供了可供参考的他人的优秀回答录音,这样可以让我们想优秀的人不断学习,修正答案,获得自己的答案。
  • 训练营鼓励答案要有自己的理解和补充,形成适合自己的答案,而非死记硬背,让我们在面试的时候能够更加流畅的回答的同时,引导面试官问题方向。
  • 训练营提供问题的详细资料,这让我们能够从更深、更细、更底层、更系统的原理解析、应用,理解问题背后形成的原因和机理,让我们不是死记硬背,而是理解后经过整理的自然阐发
    最后,非常感谢代码随想录,虽然还没有让我成功找到实习,但是在我不知所措时给出了路径和方法。我相信,亡羊补牢,为时未晚。虽然我准备和出发的时间比较晚,但我相信我终究上岸。

在未来,我将根据我的理解,不断完善和扩充这一份笔记。

资源链接整理

精品软件:各种软件的特殊版、精简版、第三方版本
中文技术文档大全:各种技术的中文技术文档
Learn Anything:学习各种技术的教程(计算机科学)
即时工具:在线工具箱,包含很多日常常用的在线功能
Adobe全套设计软件:全套的Adobe软件破解版
软仓:各种设计软件破解版
302.AI:国内外各种AI综合平台
聚合数据:各种常用的免费API数据接口服务

通信协议笔记

I2C

主要特性

  • 两根信号线通信:串行数据线SDA、串行时钟线SCL;
  • SDA和SCL的输出引脚驱动为开漏输出,外接上拉电阻
  • 所有设备通过7位地址软件寻址,高四位由厂家设定,为设备类型,低三位由用户定义
  • 所有设备都具有自动应答功能,主机和从机区别在于主机有对SCL的发送权
  • 最大挂载数取决于总线上的最大电容值,一般为400pf

工作时序

  • 数据读取在SCL为高时发生,所以当SCL为高时,数据要保持稳定
  • SCL为高时,SDA从高跳到低为开始信号start,从低跳到高为结束信号stop
  • SDA传送字节数没有限制,传送完紧跟应答信号,数据高位在前
    d3bbca378362c28829cee243a8497ef7.png
  • 当应答信号为高电平时,为ACK信号,当应答信号为高电平时,为NACK信号
  • 主机发送从机接受时,ACK由从机发出,若为NACK,主机直接尝试STOP信号终止后续传输
  • 从机发送主机接收时,ACK有主机发出,表示还要接受数据,当接受完后,发送NACK,告知从机读取结束,释放总线,随后主机发送stop命令,将释放总线,结束读操作。
阅读更多...

cmake简易入门

构建步骤

  1. 创建 CMakeLists.txt 文件:定义项目、目标和依赖。
  2. 创建构建目录:保持源代码目录整洁。
  3. 配置项目:使用 CMake 生成构建系统文件。
  4. 编译项目:使用构建系统文件编译项目。
  5. 运行可执行文件:执行生成的程序。
  6. 清理构建文件:删除中间文件和目标文件。
    1
    2
    3
    4
    5
    6
    7
    配置CMakeLists.txt后
    mkdir build 创建目录
    cd build
    cmake .. # 配置
    make # 编译
    ./MyExcutable # 运行
    make clean # 清理

基本

  • cmake_minimum_required(VERSION <num>):设置最低版本

  • project(<name> [version]):设置项目名和版本

  • add_executable(<target> [dependence]):添加项目可执行文件和依赖

  • set(<var> <val>):设置变量

  • ${var}:变量使用

  • configure_file(<ifile> <ofile> [copy_only] [escape_quotes] [@only]):复制一个文件到目标位置,并对文件内容进行变量替换

    • ifile:指定输入文件的路径。
    • ofile:指定输出文件的路径
    • COPY_ONLY:如果指定这个选项,CMake将不会对文件内容进行变量替换,只是简单地复制文件。
    • ESCAPE_QUOTES:如果指定这个选项,CMake将对输出文件中的双引号进行转义。
    • @ONLY:如果指定这个选项,CMake将只替换@符号包围的变量。这在某些情况下可以提高性能。
    阅读更多...

jupyter notebook简易入门

hzem0kll.l4w.png

安装

安装notebook和插件

1
2
3
4
5
6
7
8
9
10
11
12
# 安装notebook,7.*版本对插件支持有点问题
$ conda install notebook=6.4

# 安装插件管理器jupyter_contrib_nbextensions
$ pip install jupyter_contrib_nbextensions
$ jupyter contrib nbextension install --user

# 安装可视化功能
$pip install jupyter_nbextensions_configurator
## can be skipped for notebook >=5.3
$jupyter nbextensions_configurator enable --user

在conda中,jupyter为notebook的别名,notebook才是包的官方名

常用插件

  • Toggle all line numbers
  • Collapsible headings
  • Variable Inspector
  • Execute time
  • Hinterland
  • Table of Contents(2)
  • Autopep8
阅读更多...

Makefile教程

项目结构

1
2
3
4
5
6
7
<project>
├── Makefile
├── build
└── src
├── hello.c
├── hello.h
└── main.c

Makefile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
SRC_DIR = ./src
BUILD_DIR = ./build
TARGET = $(BUILD_DIR)/world.out

CC = cc
CFLAGS = -Wall

# ./src/*.c
SRCS = $(shell find $(SRC_DIR) -name '*.c')
# ./src/*.c => ./build/*.o
OBJS = $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/%.o,$(SRCS))
# ./src/*.c => ./build/*.d
DEPS = $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/%.d,$(SRCS))

# 默认目标:
all: $(TARGET)

# build/xyz.d 的规则由 src/xyz.c 生成:
$(BUILD_DIR)/%.d: $(SRC_DIR)/%.c
@mkdir -p $(dir $@); \
rm -f $@; \
$(CC) -MM $< >$@.tmp; \
sed 's,\($*\)\.o[ :]*,$(BUILD_DIR)/\1.o $@ : ,g' < $@.tmp > $@; \
rm -f $@.tmp

# build/xyz.o 的规则由 src/xyz.c 生成:
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c
@mkdir -p $(dir $@)
$(CC) $(CFLAGS) -c -o $@ $<

# 链接:
$(TARGET): $(OBJS)
@echo "buiding $@..."
@mkdir -p $(dir $@)
$(CC) -o $(TARGET) $(OBJS)

# 清理 build 目录:
clean:
@echo "clean..."
rm -rf $(BUILD_DIR)

# 引入所有 .d 文件:
-include $(DEPS)
阅读更多...

大众与小众的选择

前几天,我看到一个很有意思的问题:我们既从众,跟随潮流,同时我们又追求小众,选择与众不同。这既矛盾又统一的现象,引起了我对其本质以及我们的人生的一些思考。

场景决定我们的选择

大众与小众的选择,本质上是我们在不同场景下的选择。在面向效率的场景下,我们更倾向于大众,因为使用者众多,代表有更多的资源就行维护与优化,就有着更加方便、高效的使用体验。而在面向娱乐的场景下,可以选择小众,展示自己的与众不同,展示自己的特立独行。

真的是由场景决定的吗?

阅读更多...

山水——游山篇

前几天我无意间看到钱文忠的酒事会,谈到了中国人有关于山水的看法。我回想起我这10年的经历,浅谈一下我的看法。

游山玩水,我们骨子里或多或少都有些期待,他寄托了我们摆脱工作、生活上各种繁杂琐碎的各种想象。现在文旅开始爆火,各大名山望川的人是络绎不绝。我玩水较少,但游山频繁。但每每游山多是乘兴而去,流连忘返,败兴而归。缘由以后有时间再专门讲述一番。每次游山归来,我禁不住问自己,我为什么这么喜欢去山里。

第一次理解: 纵使晴明无雨色,入云深处亦沾衣

山中多云雾,凉爽宜人,又时有风。我很是喜欢沉浸在这种环境中,经常像效仿古人,建一小亭,叫上三五好友,带点酒,畅谈一下人生宇宙。累了便躺下,可以望着青树翠蔓、云深见寺发呆,任凭思绪四处飘悠。也可以闭上双眼,享受着清风的微抚,聆听山鸟鸣啼、流水潺潺。此行我们不为登山,只为享受这难得的良辰美景。

第二次理解:会当凌绝顶,一览众山小

高处的风景很是壮观,可以俯看群山,可以极目远眺,往往此时我们壮怀激烈,心境开阔,有达成目标、苦尽甘来的舒畅、有一马平川的豪情、甚至有征服世界的雄心。除此之外,山顶的云海、日出、日落、雾凇,都是难得的美景。这时的我,此番来,只为登顶,去享受登顶带来的征服快感,去寻找、挑战和突破身体的极限,去体验山顶的那份开阔壮观。

阅读更多...
  • Copyrights © 2023-2025 John Doe
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信