23天英语背诵
引言
大学已经过了两年,这期间好几次下定决心学好英语,然而每次都半途而废。
DAY 1
Reach the goals 必须达成目标
My life has been a trade-off.
我的人生是一场交易。
If I wanted to reach the goals I set for myself, I had to get at it and stay at it everyday.
如果我想达到我给自己设定的目标,就必须每天为之奋斗,坚持不懈。
I had to think about it all the time.
必须时刻把它放在心上。
I had to get up everyday with my mind set on improving something.
我每天一起床,脑子里就想着要去改进些什么。
I was driven by a desire to always be on the top of the heap.
我一直被一种想要追求卓越的渴望驱策着。
DAY 2
Mean something 成为举足轻重的人,而 ...
gdb调试-基础
本文是对以下文章的摘录:
C语言中文网-gdb调试
调试前提
只有具备调试信息的可执行文件才可被调试,即,编译时需要添加 -g 参数:
1#gcc main.c main -g
调试时最好不要优化代码,使用 -O0 默认级别即可。对 GDB 调试器更友好的是 -Og 选项,-Og 对代码所做的优化程序介于 O0 ~ O1 之间,真正可做到“在保持快速编译和良好调试体验的同时,提供较为合理的优化级别”。
常用命令
调试指令
作 用
(gdb) help
help commands 能够显示 commands 命令的具体用法
(gdb) file program
调试 program 程序
(gdb) break xxx (gdb) b xxx
在源代码指定的某一行设置断点,其中 xxx 用于指定具体打断点的位置,可以是函数名、行号(当前源文件)、指定文件中的行号(b main.c:3)等
(gdb) run (gdb) r
执行被调试的程序,其会自动在第一个断点处暂停执行。其后可以传入参数
(gdb) start
执行到 main 函数中的第一条指令停 ...
gdb调试-进阶
C:/Users/JiangYuxuan/Desktop/Typora/img/
查看系统调用与库调用
跟踪每一次函数调用
这是一个非常常见的需求
readelf -s 程序路径 | gawk '
{
if($4 == "FUNC" && $2 != 0) {
print "# code for " $NF;
print "b " $NF;
print "commands";
print "silent";
print "bt 1";
print "c";
print "end";
print "";}
}' > 输出文件
1
gdb --command=输出文件 调试文件 -q
跟踪一类函 ...
练习2-编译调试Nginx
前置内容:练习1-编译调试teamTalk,cmake入门笔记,对 makefile 有一定了解。
参考:nginx依赖库,Windows下编译Nginx,gdb远程调试,《深入剖析Nginx》,chatgpt 。
前言
Nginx 是一款高性能的开源Web服务器和反向代理服务器,其特点是占用内存少、并发能力强、处理静态文件快、可扩展性好、稳定性高、配置简单等。毫无疑问,花时间学习它将是一笔划算的投资,那么第一步便是编译、运行并调试它。本文给出以下几种途径来编译调试 Nginx:
原生 gdb 调试
CLion 编译数据库组织项目 + 远程 gdb 调试
CLion 原生支持 CMake 管理项目并调试
(转载)VS 编译调试 Nginx
在上节练习1-编译调试teamTalk中,我们熟悉了 Windows 的 Visual Studio 开发环境,本节我们则重点讲述 Linux 下的 CLion 开发环境,本机 Linux 环境为 Ubuntu 20.4.6 。
原生 gdb 调试
此方式直接对包含调试信息的可执行程序 nginx 进行 gdb 调试,这种方式当然是最简单的, ...
非阻塞套接字及其注意事项
同时,如果对这种套接字进行读操作,那么 read/recv 将返回 -1 。
《高》P163,清除错误。
cmake学习-从实例入手
概要
本篇笔记从实例出发,逐步分析 cmake 的使用方法。为了更好地拟合真实项目,本实例有如下功能:
添加项目版本号
添加编译选项,可选择使用 myMath 库或第三方 3rdMath 库
使用了静态链接库和动态链接库,既有项目生成的库,也有第三方库
提供了安装功能
能够在 Windows 和 Linux 下成功编译运行
读者可能认为 cmake 本来就是跨平台的,所以支持 Windows 和 Linux 应该是理所当然的。实际上,支持跨平台还需要注意一些问题,后文会提到它们。
项目地址:cmake实例
另外,初学 cmake 的朋友们可以在 Linux 下试试 CLion ,其本身就是用 cmake 管理项目,很容易上手。
分析本项目之前,先来简单了解一下 cmake 。
cmake、nmake、make、makefile
make 是 Unix/Linux 下的一个构建工具,用于自动化构建和编译过程。它可以读取一个名为 Makefile 的文件,根据其中的指令来编译和链接源代码文件,生成可执行文件或库文件。实际上,make 最后也是调用的 gcc ...
如何使用VS编译调试一个大型项目?
它指定哪些文件类型进入解决方案资源管理器中的逻辑文件夹。 在下图中 .cpp ,文件位于 “源文件” 节点下。 .h文件位于“**头文件”节点下,.ico文件.rc位于“资源文件”**下。 此位置由筛选器文件控制。
参考:C/C++网络训练营 、.vs的作用 、chatgpt 。
VS 工程概览
你有没有这样一种感受:想学习 github 上的一些优秀项目时不知道怎么开始;拿到源码后不知道如何运行;项目中密密麻麻的文件是怎么被组织起来的…于是,万里长征路,你就被难在了第一步。确实,学习和使用一个大型项目可能会让人感到困难和无从下手。但是,编译和调试大型项目的过程并不是无法掌握的。下面我将为你提供一些有用的建议和技巧,帮助你更好地理解和使用大型项目。
1)了解项目的结构和依赖关系是非常重要的。在大多数情况下,大型项目都会有一些文档或者说明文件,尤其是 README 文件,它会告诉你项目的基本信息,包括项目的结构、依赖关系、编译和运行方式等等。你可以先仔细阅读这些文件,了解项目的大致框架和组织方式。
2)了解项目的编译和构建过程也是非常重要的。大多数大型项目都会使用一些构建工具来自动化 ...
练习1-编译调试teamtalk
TeamTalk 是一款蘑菇街开源的企业内部即时通讯软件,代码质量优秀,具有较高的学习价值。源码由张小方老师提供,在此表示感谢。
此次的任务仍然是在 Visual Studio 中将源码跑起来,这个过程碰到了许多编译和链接的问题,通过不断调整试错终于跑通了代码,实属不易!学习源码,往往就难在这第一步,只要将源码运行起来,我们就成功了一半。后续的代码细节直接边调试边理解,再爽不过!这个过程大大加深了我对编译与链接的理解,也熟悉了 Visual Studio 的开发环境。
勘误:文中图片的路径有时候为 TeamTalk,有时为 TeamTalk_test,前者是笔者为写此博客而重新开的项目,后者是之前的项目,由于本人疏忽不小心混淆了,大家直接将 TeamTalk_test 视作 TeamTalk 即可。
1)从 github 上拉取源码,然后打开客户端的 .sln 解决方案文件:
2)VS可能提示我们更新项目的编译工具集,默认即可:
3)配置 configuration manager,指定 Build Solution 时是将该方案下的所有项目进行编译。
4)点击 Buil ...
C语言宏的几处陷阱
参考文章:《C与指针》
为宏定义中的变量以及宏定义体加上括号:
1234//正确方式#define MUL(x,y) ((x)*(y))//错误方式#define MUL(x,y) (x*y)
否则按错误方式书写则可能出现如下错误:
12MUL(a+b, c+d);//被编译为 a + b * c + d , 显然是错误的
定义多语句宏代码时,请使用 do{…}while() 语句:
1234//错误方式#define ERROR_RET(x) {error_code=x;return false;}//正确方式#define ERROR_RET(x) do{error_code=x;return false;}while(0);
是否感觉到很莫名其妙,为什么不能使用 {} ?看下面的例子:
1234if(condition == true) ERROR_RET(x);else return true;
这段代码被编译成:
123456if(condition == true){ ...
<转载>do{}while()有什么用?
一直以来我都认为 do{}while() 语句十分鸡肋,直到最近才发现它的一些妙用,下面这篇文章总结了 do{}while() 的一些使用场景,希望对各位有所帮助。
原文:do{}while()有什么用?
在一些Linux内核和其它的开源代码中,我们经常看到像下面这样的代码:
123do{ ...}while(0)
该代码片段并非循环,这样想想似乎使用do…while没有任何意义,那么为什么还要使用它呢?
实际上,do{…}while(0)的用途并不仅仅是优化你的代码。经过一系列的调研和探索,我们总结出它的一些用途如下。
帮助定义多语句宏以避免错误
如果你是一名 C 程序员,你肯定很熟悉宏,它们非常强大,如果正确使用可以让你的工作事半功倍。然而,如果你在定义宏时很随意没有认真检查,那么它们可能使你发狂,浪费N多时间。在很多的C程序中,你可能会看到许多看起来不是那么直接的较特殊的宏定义。下面就是一个例子:
12#define __set_task_state(tsk, state_value) \ do { (tsk)->state ...