停下来环顾程序

停下来环顾程序

调试器不仅能够运行程序,还可以通知它暂停程序的运行,暂停以后,调试器提供了检查变量、跟踪执行路径的机会。

暂停机制

3中方式可以通过GDB暂停程序的执行:

l  断点:通知GDB在程序中的特定位置暂停执行;

l  监视点:通知GDB当特定内存位置(或者设计一个或多个位置的表达式)的值发生变化时暂停执行;

l  捕获点:通知GDB当特定事件发生时暂停执行;

GDB中删除断点

l  delete breakpoint_list

l  delete

l  clear

l  clear functionclear filenamefunctionclear line_numberclear filenameline_number

2.7.2 GDB中禁用断点 51

       在调试会话期间,会遇到大量断点,对于经常重复的循环结构或函数,这种情况使得调试极不方便。如果要保留断点以便以后使用,暂时又不希望GDB停止执行,可以禁用它们,在以后需要时再启用。此时我们可以使用disable/enable breakpoint_list来禁用和启用断点。

DDD

l  可以直接拖拽断点,很方便;

l  还有一个优秀的功能Undo/Redo

GDB中恢复执行的方法

l  使用stepnext单步调试程序;

l  使用continue使GDB无条件地恢复程序的执行,知道它遇到另一个断点或者程序结束;

l  finishuntil命令恢复。

nextstep的区别

       next执行函数,不会在其中暂停,然后在调用之后的第一条语句处暂停;

       step在函数中的第一个语句处暂停;

step的单步进入函数

clip_image002

next单步越过函数

clip_image004

使用continue恢复程序执行

       continue与执行一行代码的stepnext相反,这个命令使GDB恢复程序的执行,直到触发断点或者程序结束。

       continue命令可以接受一个可选的整数参数n,这个数字要求GDB忽略下面n个断点。

使用finish恢复程序执行

       命令finish指示GDB恢复执行,直到恰好在当前栈帧完成之后位置,这意味着如果你在一个不是main的函数中,finish命令会导致GDB恢复执行,直到恰好在函数返回之后为止,例如:

clip_image006

       如果在一个递归函数中,finish只会将你带到递归的上一层,这是因为每次调用都被看做在它自己权限内的函数调用,因为每个函数都有自己的栈帧,如果要在递归层次较高时完全退出递归函数,那么更适合使用临时断点及continue,或者使用until命令

使用until恢复程序执行

       命令until执行程序,直到到达当前循环体外的下一行源代码。

clip_image008

设置条件断点的方法

       break break-args if (condition)

 

监视点

       监视点是一种特殊类型的断点,它类似于正常断点,是要求GDB暂停程序执行的指令。区别在于监视点是没有住在某一行源码中,取而代之的是,监视点是指示GDB每当某个表达式改变了值就暂停执行的指令。

 

简单函数绘图

简单函数绘图

直接使用plot sin(x)就可以绘制出正弦图像;

而放大后会发现采样点比较小,此时可以使用set samples 500来增加采样点数,然后使用replot就可以重绘图性能了。

其实刚开始是有个类似Matlab中的legend位于右上方的,这个在gnuplt中成为key,我们只要使用unset key就可以暂时不显示了。

然后我们添加上标题和xy轴的信息。

set title ‘sin(x)’

set xlabel ‘x’

set ylabel ‘y’

replot

设置坐标取值范围

set xrange [xmin:xmax]

设置坐标上的刻度

set xtics pi

最好用的一个特性是直接可以对一个文件进行绘图,默认是用点绘,可以加上with lines来连接各个点。Gnuplot大约支持你30多种画图方式,默认为points方式,可以使用help来查看其它的画图方式。

基本脚本编译

基本脚本编译

8.1 使用多条命令

       如果需要执行多个命令,只需用分号隔开即可。但是要注意命令行的最大字符不能超过255个字符。

8.2 创建脚本文件

       第一行为#!/bin/bash,一般#为注释行,但是第一行是个特例,#后面跟的!告诉shell运行下面的shell,紧接着下一行可以写一行注释用于说明该shell的作用。

       如果要执行需要绝对路径或者将该路径添加到PATH环境变量中。

8.3 显示消息

       可以使用echo what you want to show 来显示你想显示的信息,默认是不需要用引号来标记的,但是如果字符串中有了引号,就需要用引号来标记了。

       另外如果想让echo命令结果和echo文本字符串在一行可以使用-n参数,不换行操作。

8.4 使用变量

8.4.1 环境变量

       echo HOME $HOME

如果使用echo “my HOME is $HOME”,也可以识别,但是这里有个缺陷,比如,你输入echo “This cost of the item is $15”,如果定义过15这个环境变量,有可能会被替换掉,所有可以使用\来防止当作环境变量echo “This cost of the item is \$15”

8.4.2 用户变量

       用户变量可以是由不超过20个字符的字母、数字或下划线组成的文本字符串。用户变量区分大小写

       shell脚本自动为变量值确定数据类型。

8.4.3 反引号

       反引号允许将shell命令的输出赋值给变量。尽管这看起来好像意义不大,但是在脚本编程中,它是主要的构件。

       比如:dateok=`date`,就会运行反引号符号的命令并把结果赋值给变量dateok

8.5 重定向输入输出

8.5.1 输出重定向

date > log        :将日期写入log,如果log存在会覆盖掉

date >> log :将日期追加写入

8.5.2 输入重定向

       输入重定向是输出重定向的相反过程。输入重定向不是将命令的输出重定向到一个文件中,而是将一个文件的内容重定向到一条命令中。

       形式为:command < inputfile

       比如$ wc < filename,就可以输出filename的行数、字数、字符数的统计信息。

       还有一种重定向为内置输入重定向(inline input redirection)。这种方法允许在命令行中而非文件中为输入重定向指定数据。内置输入重定向符号是两个<<,除了这个符号,还需要指定一个文本标记来说明输入数据的开始和结尾。

       形式为:

$ command << marker

Data

Data

Data

marker

比如一个实例为:

$wc << EOF

>test string 1

>test string 2

>test string 3

>EOF

8.6 管道

       管道传送为将输出重定向到另一条命令,而不是将命令的输出重定向到一个文件。

       不要认为管道传送是一个一个地运行两个命令,Linux系统实际上同时运行两条命令,并在系统内部把它们连接在一起,第一条命令生成输出时,输出就立即发送给第二条命令,没有使用中间文件或者缓冲区来传送数据。

8.7 学计算

8.7.1 expr命令

       expr命令允许处理命令行中的等式,但是很笨拙,也能够区分一些不同的数学操作符和字符串操作符。

       例如,如果计算5*6,需要为expr 5 \* 6 ,而不能是expr 5*6,这会导致直接输出5*6,而中间用空格分开还必须防止*被误解,需要加上\

8.7.2 使用括号

       一种计算数学等式更简单的方法是,使用美元符号和方括号。例如a=$[5*8],当然这里就不用在担心*被误解的情况了。

8.7.3 浮点解决方案

       比较普遍的解决浮点的方案是使用内置的bash计算机,即bcBash计算器其实是一种编程语言,该语言允许在命令行中输入浮点表达式,然后解释表达式并计算它们,最后返回结果。Bash计算器可以识别:

l  数字(整数和浮点);

l  变量(简单变量和数组);

l  注释(以#符号开始的行或C语言的/**/对)

l  表达式;

l  编程语句(如if-then语句);

l  函数。

 

浮点运算被称为scale的内置变量控制,默认值为0,所以你计算1/3将为0,需要设置scale=N,然后1/3的精度就为小数点后N位。

       bc –q可以禁止bash计算器的冗余欢迎标语。

在脚本中使用bc

#!/bin/bash

var1=`echo “ scale=4;3.44/5” | bc`

echo The answer is $var1

对于简单的计算还好,但是如果计算很复杂,我们可以使用内置的输入重定向方法,而不使用文件重定向。例如:

#!/bin/bash

var1=10.46

var2=43.67

var3=33.2

var4=71

 

var5=`bc <<EOF

scale = 4

a1 = {$var1 & $ var2}

b1 = {$ var3 * $ var4}

a1+b1

EOF

`

echo The final answer for this message is $var5

       使用该种技术,可以在脚本中把每个操作和表达式放在单独的行中,使其更加清晰并便于阅读。

8.8 退出脚本

       在我们前面的脚本中,执行完最后一条命令,就终止了脚本,其实我们可以用一种更优雅的方式来完成。      

8.8.1 核对退出状态

       Linux提供$?特殊变量来保存最后一条命令执行结束的退出状态,如果想核对一条命令的退出状态,必须在这条命令运行完成之后立即查看或使用变量$?。它会改变为shell执行的最后一条命令的退出状态值。

       按照惯例,一条命令成功完成的退出状态时0。如果命令执行错误,那么退出状态会是一个正整数。范围在0~255

       Linux退出状态代码:

代码

描述

0

命令成功完成

1

通常的未知错误

2

误用shell命令

126

命令无法执行

127

没有找到命令

128

无效的退出参数

128+x

使用Linux信号x的致命错误

130

使用Ctrl-C终止的命令

255

规范外的退出状态

8.8.2 退出命令

       我们可以使用exit N命令来指定一个退出状态,不过如果N超过了255,那么将返回一个对256取模以后的值。

Gvim 字体大小设置

Gvim 字体大小设置

在控制台下的VIM是不能够改变字体的,因为字体的改变是随着终端字体的变化而变化的,但是GVIM中,你却有权力将字体改变成自己想要的样子

Linux下设置字体的命令是:

: set guifont = Courier\   14

而在Windows下则是:

: set guifont = Courier:h14

当然,如果需要设置多个字体,则我们可以在各个字体之间添加逗号(,)来设置多个字体,如:

: set  guifont = Courier\ New\ 12 , Arial\ 10

 

如果字体名字中含有空格,则我们需要将其使用\进行转义,而在windows下则可以将空格转换为:字符。当然,这样设置之后只会对当前会话有效,而如果想每次都使用的话,则需要将其加入到其gvimrc设置文件中(将命令中前面的:去掉)

如果你不知道可用的字体名字,使用下面的命令可以得到一个字体名字的列表:

 

:set guifont=*

 

如果需要想对特定的文件类型使用特定的字体,则可以将下面的语句加入到vimrc文件中去:

 

autocmd BufEnter  *. txt set guifont = Arial \ 12

这样,在下次打开.txt文件的时候,就会设置字体Arial 12字体。

 

需要注意的是,每次改变字体大小的时候,GVim会调整自己的窗口大小来适应字体的变化。