ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux——基础工具

Linux——基础工具 1 软件包管理器1-1 什么是软件包• 在 Linux 下安装软件一个通常的办法是下载到程序的源代码并进行编译得到可执行程序。• 但是这样太麻烦了于是有些人把一些常用的软件提前编译好做成软件包可以理解成 Windows 上的安装程序放在一个服务器上通过包管理器可以很方便地获取到这个编译好的软件包直接进行安装。• 软件包和软件包管理器就好比“App”和“应用商店”这样的关系。• yumYellowdog Updater Modified是 Linux 下非常常用的一种包管理器主要应用在 Fedora、RedHat、CentOS 等发行版上。• Ubuntu 主要使用 aptAdvanced Package Tool作为其包管理器。apt 同样提供了自动解决依赖关系、下载和安装软件包的功能。1-2 Linux 的软件生态• Linux 下载软件的过程Ubuntu、CentOS、otherUbuntu 用 aptCentOS 用 yum• 操作系统的好坏评估——生态问题是通过操作系统生态的社区论坛、官方文档、软件体系、维护更新速度、操作系统本身以及客户群体来评价的。• 为什么有人免费为特定社区提供软件还发布还提供云服务器让你下载• 软件包的依赖问题软件的使用不仅仅是你自己本身的应用层的代码还有开发者所开发使用的库的代码文件你也需要有但是往往我们自己去配置这些库文件的时候非常容易丢失或者遗漏所以才会有软件包管理器解决依赖问题。1-3 apt 具体操作1-3-1 查看软件包apt show git注意事项软件包名称主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构。“x86_64”后缀表示 64 位系统的安装包“i686”后缀表示 32 位系统安装包。选择包时要和系统匹配。最后一列base 表示的是“软件源”的名称类似于“小米应用商店”、“华为应用商店”这样的概念。1-3-2 安装软件apt install lrzsz -y• yum/apt 会自动找到都有哪些软件包需要下载这时候敲 “y” 确认安装。• 出现 “complete” 字样或者中间未出现报错说明安装完成。注意事项安装软件时由于需要向系统目录中写入内容一般需要 sudo 或者切到 root 账户下才能完成。yum/apt 安装软件只能一个装完了再装另一个。正在 yum/apt 安装一个软件的过程中如果再尝试用 yum/apt 安装另外一个软件yum/apt 会报错。如果 yum/apt 报错请自行百度。1-3-3 卸载软件apt remove lrzsz -y1-3-4 其他常用操作与注意事项(了解)更新软件包列表apt update在安装新软件前建议先运行此命令从配置的软件源服务器获取最新的软件包列表信息。升级已安装的软件包apt upgrade根据apt update获取的列表升级所有可升级的已安装软件包。搜索软件包apt search 关键词例如apt search editor可以搜索包含 “editor” 的软件包。清理缓存apt clean删除/var/cache/apt/archives/目录下已下载的软件包文件.deb释放磁盘空间。网络连通性检查关于 yum/apt 的所有操作必须保证主机虚拟机网络畅通可以通过 ping 指令验证ping www.baidu.com补充说明依赖关系apt 会自动处理依赖关系但有时会遇到无法解决的依赖冲突。可以尝试apt --fix-broken install或使用aptitude工具进行更复杂的依赖解析。软件包状态使用dpkg -l | grep 软件包名可以查看通过 apt 安装的软件包的详细状态如是否已安装、版本等。安装特定版本可以使用apt install 软件包名版本号来安装指定版本的软件包。1-4 安装源软件源配置apt 的软件源列表文件位于/etc/apt/sources.list和/etc/apt/sources.list.d目录下。可以更换为国内镜像源如阿里云、清华源以加速下载。ll /etc/apt/sources.list # 标准源ll /etc/apt/sources.list.d # 扩展源2 vim编辑器2-1 Linux编辑器-vim使用vi/vim的区别简单点来说它们都是多模式编辑器不同的是vim是vi的升级版本它不仅兼容vi的所有指令而且还有一些新的特性在里面。例如语法加亮可视化操作不仅可以在终端运行也可以运行于x window、 mac os、 windows。2-2 vim的基本模式对于vim我们在日常开发展经常用到的只有5种我们需要掌握着五种模式还有其他模式我门在开发中需要用到了再查1 正常/普通/命令模式(Normal mode)控制屏幕光标的移动字符、字或行的删除移动复制某区段及进入Insert mode下或者到 last line mode2 插入模式(Insert mode)只有在Insert mode下才可以做文字输⼊按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。3 底行模式(last line mode)文件保存或退出也可以进行文件替换找字符串列出行号等操作。在命令模式下*shift;* 即可进入该模式4 替换模式(Replacement mode)对于文本进行字符替换5 可视块模式(Visual Block Mode)可以快速选中多行进行批量化操作2-3 vim的基本操作1 进入vim的方式vim test.cc注意:正常进入是[命令模式]这个时候不可以输入文字只有在[插入模式]下才可以输入2 [命令模式]切换到[插入模式]• 输入i(常用)• 输入a• 输入o3 [命令模式]切换到[底行模式]在命令模式下输入shift;:就可以切换到底行模式退出vim及保存文件,在[正常模式]下按⼀下「:」冒号键进入「Last line mode」,例如:• :w保存当前文件• :wq(输入「wq」,存盘并退出vim)• :q!(输入 q!,不存盘强制退出vim)4 [插入模式]切换到[命令模式]目前处于[插入模式]就只能⼀直输入文字如果发现输错了字,想用光标键往回移动将该字删除可以先按一下「ESC」键转到[正常模式]再删除文字。当然也可以直接删除。2-4 vim [命令模式] 的命令集• 插入模式• 按「i」切换进入插入模式「insert mode」按“i”进入插入模式后是从光标当前位置开始输入文件• 按「a」进入插入模式后是从目前光标所在位置的下一个位置开始输入文字• 按「o」进入插入模式后是插入新的一行从行首开始输入文字。• 从插入模式切换为命令模式• 按「ESC」键。• 移动光标•vim可以直接用键盘上的光标来上下左右移动但正规的vim是用小写英文字母「h」、「j」、「k」、「l」分别控制光、标左、下、上、右移一格• 按「 $ 」移动到光标所在行的“行尾”• 按「^」移动到光标所在行的“行首”• 按「w」光标跳到下个字的开头• 按「e」光标跳到下个字的字尾• 按「b」光标回到上个字的开头• 按「#l」光标移到该行的第#个位置如5l,56l• 按gg进入到文本开始• 按shiftg「G」进入文本末端• 按「ctrl」「b」屏幕往“后”移动一页• 按「ctrl」「f」屏幕往“前”移动一页• 按「ctrl」「u」屏幕往“后”移动半页• 按「ctrl」「d」屏幕往“前”移动半页• 删除文字• 「x」每按一次删除光标所在位置的一个字符• 「#x」例如「6x」表示删除光标所在位置的“后面包含自己在内”6个字符•「X」大写的X每按一次删除光标所在位置的“前面”一个字符• 「#X」例如「20X」表示删除光标所在位置的“前面”20个字符• 「dd」删除光标所在行• 「#dd」从光标所在行开始删除#行• 复制• 「yw」将光标所在之处到字尾的字符复制到缓冲区中。• 「#yw」复制#个字到缓冲区• 「yy」复制光标所在行到缓冲区。• 「#yy」例如「6yy」表示拷贝从光标所在的该行“往下数”6行文字。• 「p」将缓冲区内的字符贴到光标所在位置。注意所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。• 替换• 「r」替换光标所在处的字符。• 「R」替换光标所到之处的字符直到按下「ESC」键为止。• 撤销上⼀次操作• 「u」如果您误执行⼀个命令可以马上按下「u」回到上一个操作。按多次“u”可以执行多次回复。• 「ctrl r」: 撤销的恢复• 更改• 「cw」更改光标所在处的字到字尾处• 「c#w」例如「c3w」表示更改3个字• 跳到指定的行• 「ctrl」「g」列出光标所在行的行号。• 「#G」例如「15G」表示移动光标到文章的第15行行首。2-5 vim[底行模式]命令集在使用底行模式之前请记住先按「ESC」键确定您已经处于正常模式再按「」冒号即可进入末行模式。• 命令行• 「! 命令」: 输入命令后可以在vim中执行shell的命令。•打开多窗口• 「vs filename」: filename表示任意一个文件可以在vim中打开多文件切换光标可以用 [ctrl][w][W]循环切换。• 列出行号• 「set nu」: 输入「set nu」后会在文件中的每一行前面列出行号。• 跳到文件中的某一行• 「#」:「#」号表示一个数字在冒号后输入一个数字再按回车键就会跳到该行了如输入数字15再回车就会跳到文章的第15行。• 查找字符• 「/关键字」(向下查找): 先按「/」键再输⼊您想寻找的字符如果第一次找的关键字不是您想要的可以⼀直按「n」会往后寻找到您要的关键字为止。• 「?关键字」(向上查找)先按「?」键再输⼊您想寻找的字符如果第一次次找的关键字不是您想要的可以⼀直按「n」会往前寻找到您要的关键字为⽌。• 保存文件• 「w」: 在冒号输入字母「w」就可以将文件保存起来• 离开vim• 「q」按「q」就是退出如果无法离开vim可以在「q」后跟⼀个「!」强制离开vim。• 「wq」⼀般建议离开时搭配「w」一起使用这样在退出的时候还可以保存文件。3 编译器g/gcc3-1 g/gcc的编译选项gcc [选项] 要编译的⽂件 [选项] [⽬标⽂件]3-2-1 预处理(进行宏替换)•预处理功能主要包括宏定义,文件包含,条件编译,去注释等。• 预处理指令是以#号开头的代码行。• 选项“-E”,该选项的作用是让 gcc/g在预处理结束后停止编译过程。• 选项“-o”是指目标文件,“.i”文件件为已经过预处理的C原始程序。gcc -E text.c -o text.i条件编译的运用场景:1 使用条件编译可以动态裁剪代码2 内核源代码也是采用条件编译的方式裁剪的3 开发工具应用软件3-1-2 编译生成汇编• 在这个阶段中,gcc/g首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。• 用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。gcc -S text.i -o text.s3-1-3 汇编生成机器可识别代码• 汇编阶段是把编译阶段生成的“.s”文件转成目标文件• 读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了让机器可以识别代码gcc -c text.s -o text.o3-1-4 连接生成可执行文件或库文件)在成功编译之后,就进入了链接阶段gcc text.o -o text3-2 动静态链接3-2-1 静态链接在我们的实际开发中不可能将所有代码放在一个源文件中所以会出现多个源文件而且多个源文件之间不是独立的而会存在多种依赖关系如⼀个源文件可能要调用另一个源文件中定义的函数但是每个源文件都是独立编译的即每个*.c文件会形成一个*.o文件为了满足前面说的依赖关系则需要将这些源文件产生的目标文件进行链接从而形成一个可以执行的程序。这个链接的过程就是静态链接。以静态库链接为例就是在链接过程中发现你调了库函数直接把静态库里用到的那部分目标代码复制出来合并到最终的可执行程序里,同时把函数调用地址全部修好函数调用直接指向可执行文件内部的函数地址。静态链接的缺点:1浪费空间因为每个可执行程序中对所有需要的目标文件都要有一份副本所以如果多个程序对同一个目标文件都有依赖如多个程序中都调用了printf()函数则这多个程序中都含printf.o所以同一个目标文件都在内存存在多个副本2 更新比较困难因为每当库函数的代码修改了这个时候就需要重新进行编译链接形成可执行程序。静态链接的优点就是1 在可执行程序中已经具备了所有执行程序所需要的任何东西在执行的时候运行速度快。3-2-2 动态链接为了解决上述静态链接的问题于是就引入了动态链接动态链接的基本思想:是把程序按照模块拆分成各个相对独独立部分在程序运行时才将它们链接在一起形成一个完整的程序而不是像静态链接一样把所有程序模块都链接成一个单独的可执行文件。动态链接其实远比静态链接要常用得多以动态库库链接为例:就是在链接过程中发现你调了库函数直接跳转到已经拷贝到内存上的动态库函数进行执行注意这种拷贝只有一次而静态库的拷贝是每个程序都有一份3-3静态库和动态库3-3-1 什么是库库是一套方法或者数据集为我们开发提供最基本的保证(基本接口功能加速我们的二次开发)3-3-2 静态库静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”3-3-3 动态库动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库在内存中只有一份库文件进行跳转这样可以节省系统的开销。动态库⼀般后缀名为“.so”本质:是吧语言层面的公共代码在未来中只出现一份 所用代码共享一个动态库注意:Linux下动态库XXX.so, 静态库XXX.aWindows下动态库XXX.dll, 静态库XXX.lib一般编译形成的都是默认动态库3-3-4 深入了解我讲举个网咖的例子来深入了解一下这个过程我们在高中里上课就是我们相当于在内存里执行我们自己的程序但是我们还想做跟学校无关的事情比如去网咖就是在调用函数但是我们如果是第一次去就就必须从别人比如学长的口中知道学校附近哪里有网咖这个过程就是进行动态链接而到了我们要上网的时间段我们就像库函数的调用和返回一样去网咖然后再回来然后继续上课这个过程就是动态库的调用.静态库就不太一样了不去网咖直接把网吧的电脑搬回学校就是静态库的拷贝所以不再依赖网咖就是库每次想上网直接在学校里上网就行了3-3-5 动静态库对比1 动态库形成的可执行程序体积一定很小2 可执行程序对静态库依赖小动态库不能缺失3 程序运行需要加载到内存静态链接的会在内存中出现大量重复代码4 动态链接比较节省内存4 自动化构建-make/Makefile4-1 背景• 会不会写makefile从一个侧面说明了一个人是否具备完成大型工程的能力• 一个工程中的源文件不计数其按类型、功能、模块分别放在若干个目录中makefile定义了一系列的规则来指定哪些文件需要先编译哪些文件需要后编译哪些文件需要重新编译甚至于进行更复杂的功能操作• makefile带来的好处就是⸺“自动化编译”一旦写好只需要⼀个make命令整个工程完全自动编译极大的提高了软件开发的效率。• make是一个命令工具是一个解释makefile中指令的命令工具一般来说大多数的IDE都有这个命令比如Delphi的makeVisual C的nmakeLinux下GNU的make。可见makefile都成为了一种在工程方面的编译方法。•make是⼀条命令makefile是一个文件两个搭配使用完成项目自动化构建。4-2 理解makefile的基本概念 --- 依赖关系和依赖方法4-3 基本使用实例代码1 #includestdio.h 2 3 int main() 4 { 5 printf(hello world\n); 6 return 0; 7 }Makefile文件1 exe:main.c 2 gcc main.c -o exe 3 .PHONY:clear 4 clear: 5 rm exe -rf依赖关系上面的文件exe它依赖的就是main.c依赖方法gcc main.c -o exe,就是与之对应的依赖关系伪目标上面的.PHONY:clear 就是伪目标.PHONY:让make忽略源文件和可执行目标文件的M时间对比总是被执行避免出现和磁盘文件撞名然后磁盘文件是最新的不执行依赖方法虽然如果你不创建同名磁盘文件和不加.PHONY一样都可以总是执行但是在大型工程项目中避免这个隐患还是选择加上伪目标。项目清理• 工程是需要被清理的•像clear这种没有被第一个目标文件直接或间接关联那么它后面所定义的命令将不会被自动执行不过我们可以显示要make执行。即命令⸺“make clear”以此来清除所有的目标文件以便重编译。• 但是一般我们这种clear的目标文件我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是总是被执行的。依赖方法执行make 读取 Makefile 文件时是从上到下解析文本内容Makefile 里书写的第一个目标就是 make 的默认执行目标。但 make 的执行顺序并不完全按照文本从上往下执行它会先构建完整的依赖树再根据依赖关系决定规则的运行先后。make 通过文件的修改时间戳mtime判断是否需要重新执行编译命令针对每一条编译规则对比目标文件和它所有依赖文件的时间。查看文件属性状态stat xxx注意:文件 内容 属性Modify: 内容变更时间更新Change属性变更时间更新Access常指的是文件最近一次被访问的时间。在Linux的早期版本中每当文件被访问时其atime都会更新。但这种机制会导致大量的IO操作。具体更新原则不做过多解释。4-4 推导过程1 test:test.o 2 gcc test.o -o test 3 test.o:test.s 4 gcc -c test.s -o test.o 5 test.s:test.i 6 gcc -S test.i -o test.s 7 test.i:test.c 8 gcc -E test.c -o test.i 9 10 .PHONY:clear 11 clear: 12 rm test test.i test.o test.s -rf编译:先构建完整的依赖树再根据依赖关系决定规则的运行先后推导规则:make是如何工作的,在默认的方式下也就是我们只输入make命令。那么1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。2. 如果找到它会找文件中的第一个目标文件target在上面的例子中他会找到test这个文件并把这个文件作为最终的目标文件。3. 如果test文件不存在或是test所依赖的后面的test.o文件的文件修改时间要比test这个新那么他就会执行后面定义的命令生成test这个文件4. 如果test依赖的test.o文件不存在那么make就会在当前文件中找目标test.o的依赖如果找到再根据依赖方法生成test.o文件(这有点像堆栈的过程)5. 当然你的C文件和H文件是存在的啦于是 make 会生成 test.o 文件然后再用 test.o 文件声明 make 的终极任务也就是执行文件 test 了。6. 这就是整个make的依赖性make会一层又一层地去找文件的依赖关系直到最终编译出第一个目标文件7. 在找寻的过程中如果出现错误比如最后被依赖的文件找不到那么make就会直接退出并报错而对于所定义的命令的错误或是编译不成功make根本不理。8. make只管文件的依赖性即如果在我找了依赖关系之后冒号后面的文件还是不在那么对不起我就不工作啦4-5 makefile的扩展语法BINproc.exe # 定义变量 CCgcc SRC$(shell ls *.c) # 采⽤shell命令⾏⽅式获取当前所有.c⽂件名 #SRC$(wildcard *.c) # 或者使⽤ wildcard 函数获取当前所有.c⽂件名 OBJ$(SRC:.c.o) # 将SRC的所有同名.c 替换 成为.o 形成⽬标⽂件列表 LFLAGS-o # 链接选项 FLAGS-c # 编译选项 RMrm -f # 引⼊命令 $(BIN):$(OBJ) $(CC) $(LFLAGS) $^ $ # $:代表⽬标⽂件名。 $^: 代表依赖⽂件列表 %.o:%.c # %.c 展开当前⽬录下所有的.c。 %.o: 同时展开同名.o $(CC) $(FLAGS) $(SRC) $(LFLAGS) $(OBJ) #将.c文件全部编译成.o文件 .PHONY:clean clean: $(RM) $(OBJ) $(BIN) # $(RM): 替换⽤变量内容替换它定义和使用变量在Makefile开头定义变量变量的值是任意的可以是字符 命令 或者选项你可以通过$(shell XXX)来使用命令提取文件名还有你可以通过如上图的OBJ一样的进行文件替换将 .c 后缀换成 .o 后缀再赋值在依赖方法中可以用 $ 来代表目标文件名 用 $^ 来表示依赖的文件列表在Makefile中使用变量用 $(变量名)Makefile中的通配符如上图中的 %.o %.c中可以看出Makefile中的通配符跟shell中的通配符 * 不一样 用的是%关闭回显如果你不想要执行make命令的时候回显执行的依赖方法你可以在依赖方法前加一个 就可以关闭回显5 版本控制器-git不知道你工作或学习时有没有遇到这样的情况我们在编写各种文档时为了防止文档丢失更改失误失误后能恢复到原来的版本不得不复制出一个副本比如“报告-v1”“报告-v2”“报告-v3”“报告-确定版”“报告-最终版”“报告-究极进化版” ...每个版本有各自的内容但最终会只有⼀份报告需要被我们使用。但在此之前的工作都需要这些不同版本的报告于是每次都是复制粘贴副本产出的文件就越来越多文件多不是问题问题是随着版本数量的不断增多你还记得这些版本各自都是修改了什么吗文档如此我们写的项目代码也是存在这个问题的5-1 版本控制器为了能够更方便我们管理这些不同版本的文件便有了版本控制器。所谓的版本控制器就是能让你了解到⼀个文件的历史以及它的发展过程的系统。通俗的讲就是⼀个可以记录工程的每⼀次改动和版本迭代的⼀个管理系统同时也方便多人协同作业。目前最主流的版本控制器就是Git。Git 可以控制电脑上所有格式的文件例如 doc、excel、dwg、dgn、rvt等等。对于我们开发人员来说Git 最重要的就是可以帮助我们管理软件开发项目中的源代码文件所以接下我会着重讲解git5-2 Git5-2-1 基本概念Git 是分布式版本控制系统核心不是记录文件的差异而是保存文件完整快照。每一次提交Git 把当前全部文件打包成快照生成唯一 ID串联成版本历史。5-2-2 四大工作区域工作区 (Working Directory)你肉眼看到的文件夹实际编辑代码的地方暂存区 (Index / Stage).git/index文件临时存放要提交的改动。git add就是把修改放入暂存区本地仓库 (Repository).git隐藏文件夹保存所有版本快照、分支、提交历史远程仓库 (Remote)服务器上的仓库GitHub/Gitee多个人共享版本5-2-3 流转流程5-3 Git 的使用方法5-3-1 下载项目到本地创建好⼀个放置代码的目录.git clone [url]这里的 url 就是刚刚建立好的 项目 的链接.5-3-2 拉取远端仓库在git的工作区内拉取最新的从仓库数据git pull注意:每次想要对工作区的代码做修改并且远端仓库已经更新过git强制要求要拉去一次远端仓库进行更新5-3-3 三板斧1.git add将代码放到刚才下载好的目录中git add [文件名]将需要用 git 管理的文件告知 git将代码放入缓存区2 git commit提交改动到本地git commit -m XXX提交的时候应该注明提交日志, 描述改动的详细内容。将代码放进本地仓库3 git push同步到远端服务器git push6 调试器 - gdb/cgdb使用6-1 预备程序的发布方式有两种debug模式和release模式 Linux gcc/g出来的⼆进制程序默认是release模式。要使用gdb调试必须在源代码生成二进制程序的时候, 加上-g选项如果没有添加程序无法被编译例:gcc test.c -o test #默认模式不可以调试 gcc test.c -g -o test #debug模式可以支持调试6-2 调试和断点的本质6-2-1 调试的本质1 找到问题找到问题命令2 查看代码上下文6-2-2 断点的本质断点的本质是将代码进行块级别的划分以块为单位进行快速定位区域6-3 常见使用命令作用样例list/l显示源代码从上次位置开始每次列出 10 行list/l 10list/l 函数名列出指定函数的源代码list/l mainlist/l 文件名行号列出指定文件的源代码list/l mycmd.c:1r/run从程序开始连续执行runn/next单步执行不进入函数内部逐过程 F10nexts/step单步执行进入函数内部逐语句 F11stepbreak/b [文件名:] 行号在指定行号设置断点break 10break test.c:10break/b 函数名在函数开头设置断点break maininfo break/b查看当前所有断点的信息info breakfinish执行到当前函数返回然后停止finishprint/p 表达式打印表达式的值print startendp 变量打印指定变量的值p xset var 变量 值修改变量的值set var i10continue/c从当前位置开始连续执行程序continuedelete/d breakpoints删除所有断点delete breakpointsdelete/d breakpoints n删除序号为 n 的断点delete breakpoints 1disable breakpoints禁用所有断点disable breakpointsenable breakpoints启用所有断点enable breakpointsinfo/i breakpoints查看当前设置的断点列表info breakpointsdisplay 变量名跟踪显示指定变量的值每次停止时display xundisplay 编号取消对指定编号的变量的跟踪显示undisplay 1until X 行号执行到指定行号until 20backtrace/bt查看当前执行栈的各级函数调用及参数backtraceinfo/i locals查看当前栈帧的局部变量值info localsquit退出 GDB 调试器quit6-4 常见技巧6-4-1 watch执行时监视一个表达式如变量的值。如果监视的表达式在程序运行期间的值发生变化gdb会暂停程序的执行并通知使用者注意:• 如果你有一些变量不应该修改但是你怀疑它修改导致了问题你可以watch它如果变化了就会通知你• 监视变量的变化6-4-2 set var确定问题原因更改⼀下标志位假设我们想得到 -result 然后看看程序运行中标志位的值来进行对代码问题的确定set var 变量值6-4-3 条件断点6-4-3-1 添加条件断点b 行号 if 条件 例如 b 9 if i10 #给第9行代码加上条件为i等于10才执行或者停下的断点6-4-3-2 给已经存在的断点新增条件condition 断点号 条件 例如 condition 2 i9 #给2号断点加上i9这个条件
返回列表