QCustomerPlot 在linux下执行

Linux下执行一个可执行的文件不需偠命令,直接写文件路径会自动执行

如:执行当前目录下的文件:./文件名;

非当前目录下的文件执行直接用绝对路径,如:/hone/will/cmm

当然,前提条件是该文件是可执行文件当前登录的角色是有执行权限的用户

权限:-rwx rwx rwx,使用:ls -l 文件名查看文件权限,当前用户有x权限即可执行

我们测试过程中经常需要执行升级脚本或导入生产测试数据,对于轻量的升级脚本可以直接在客户端工具中打开执行但是对于文件内容比较大的.sql文件,比如几百M几G嘚sql文件,直接拖到客户端工具打开执行执行速度非常的慢,而且工具可能会直接卡死甚至整个电脑都处于不可操作的状态,严重的影響工作效率这个情况,我们可以在数据库服务器上通过命令的方式来执行sql文件 执行速度快,且不影响客户端的操作方法如下:

1、把需要执行的sql文件上传到数据库服务器指定,目录如/data

2、通过linux客户端工具连接进入数据库服务器

国内私募机构九鼎控股打造APP来僦送 20元现金领取地址:
内部邀请码:C8E245J (不写邀请码,没有现金送)
国内私募机构九鼎控股打造九鼎投资是在全国股份转让系统挂牌的公眾公司,股票代码为430719中国PE第一股,市值超1000亿元 

Linux下C程序的编辑,编译和运行以及调试

安装很简单(以下是以在CentOS中安装为例):

1.使鼡vim编辑源文件
首先打开终端练下手:

按下"i",进入编辑模式在编辑模式下输入:

输入完成,按"ESC"键回到一般模式,然后按下":wq"即可保存並退出vim。

查看hello.c的二进制形式按下":%!xxd -b",这是hello.c保存在磁盘上的存储状态
至此,在vim已完成C源文件的编辑
关于vim的使用,直接上网搜索vim相关的攵章是相当多的;或者参考vim的联机帮助,在命令行上键入"man vim"即可

gcc命令的基本用法:

当不使用任何编译选项编译hello.c时,gcc将会自动编译产生一个a.out嘚可执行文件:

使用-o编译选择可以为编译后的文件指定一个名字:

注意:使用-o选项时,-o后面必须跟一个文件名即:-o outfile。

为了便于描述后媔的选项删除hello和a.out可执行文件。

结合介绍gcc的编译选项分析hello.c的编译和执行过程:
(1)预处理阶段:使用-E选项,对输入文件只做预处理不编譯当使用这个选项时,预处理器的输出被送到标准输出而不是存储到文件如果想将预处理的输出存储到文件,可结合-o选项使用使用洳下:

(2)编译阶段:使用-S选项,将C程序编译为汇编语言文件后停止编译gcc编译产生汇编文件的默认后缀为.s。

使用-S编译时也可以和-o结合使用指定编译产生的汇编语言文件的名字:

可使用less命令查看汇编代码。

(3)汇编阶段:使用-c选项将C源文件或者汇编语言文件编译成可重萣向的目标文件(二进制形式),其默认后缀为.o

也可以和-o结合使用指定编译产生的目标文件的名字:

由于hello.o是二进制文件,使用less查看显示為乱码;

然后使用vim hello.o打开也显示为乱码按下":%!xxd"查看其16进制形式,按下":%!xxd -r"退出 16进制查看模式回到乱码状态。在退出vim时若提示已经修改了文件,则使用":q!"强制退出

(4)链接阶段:链接器将可重定向的目标文件hello.o以及库文件(如printf.o)执行并入操作,形成最终可执行的可执行目标文件

鈳使用-o选项,指定输出文件(即可执行目标文件)的名字:

由此看出前面使用的gcc hello.c -o hello命令,将hello.c直接编译为可执行的目标文件中间经过于处悝器的预处理阶段(源文件到预处理文件),编译器的编译阶段(预处理文件到汇编文件)汇编器的汇编阶段(汇编文件到可重定向的目标文件),链接器的链接阶段(可重定向的目标文件到可执行的目标文件)

-Idir:dir是头文件所在的目录
-Ldir:dir是库文件所在的目录


编译优化选項:-O和-O2
-O选项告诉GCC 对源代码进行基本优化。这些优化在大多数情况下都会使程序执行的更快-O2选项告诉GCC产生尽可能小和尽可能快的代码。
-O2选項将使编译的速度比使用-O时慢但通常产生的代码执行速度会更快。

除了-O和-O2优化选项外还有一些低级选项用于产生更快的代码。这些选項非常的特殊而且最好只有当你完全理解这些选项将会对编译后的代码产生什么样的效果时再去使用。这些选项的详细描述请参考GCC的聯机帮助,在命令行上键入"man gcc"即可

调试选项:-g(使用详情见第3部分)
-g选项告诉GCC产生能被GNU调试器使用的调试信息以便调试你的程序。
即:在苼成的目标文件中添加调试信息所谓调试信息就是源代码和指令之间的对应关系,在gdb调试和objdump反汇编时要用到这些信息

虽然GCC提供了调试選项,但是本身不能用于调试Linux 提供了一个名为gdb的GNU调试程序。gdb是一个用来调试C和C++程序的调试器它使你能在程序运行时观察程序的内部结構和内存的使用情况。以下是gdb所提供的一些功能: 
a.它使你能监视你程序中变量的值;
b.它使你能设置断点以使程序在指定的代码行上停止执行;
c.它使你能一行行的执行你的代码

在命令行上键入"gdb"并按回车键就可以运行gdb了,如下:

当启动gdb之后即可在命令行上输入命令进行相关的調试操作。
也可以以下面的方式来启动gdb:

这种方式启动gdb直接将指定调试的程序文件装载到调试环境中。也就是让gdb装入名称为filename的可执行文件从而准备调试。
为了能够进行调试当前调试的程序文件中必须包含调试信息。其中调试信息包含程序中的每个变量的类型和其在可执荇文件里的地址映射以及源代码的行号gdb利用这些信息使源代码和机器码相关联。因此在使用gcc编译源程序的时候必须使用-g选项以便将调試信息包含在可执行文件中。

gdb还提供了其他的启动选项请参考gdb的联机帮助。在命令行上键入"man gdb"并回车即可

<1>单步执行和跟踪函数调用

以上程序的结果中,显然第二个结果是不正确的有基础的人会一眼看出问题处在哪里,呵呵这里只是为了演示使用gdb调试而故意为之。当然茬开发人员最好不要太过于依赖gdb才能找到错误

在编译时加上-g选项,生成的目标文件才能用gdb进行调试:

-g选项的作用是在目标文件中加入源玳码的信息比如目标文件中的第几条机器指令对应源代码的第几行,但并不是把整个源文件嵌入到目标文件中所以在调试时目标文件必须保证gdb也能找到源文件。
gdb提供一个类是shell的命令行环境上面的(gdb)就是提示符,在这个提示符下输入help可以查看命令的类别:

可以进一步查看某一个类别中有哪些命令例如查看files类别下有哪些命令可以用:

使用list命令从第一行开始列出源代码:

一次只列出10行,如果要从11行开始继续列出源代码可以输入:

也可以什么都不输入直接敲回车gdb提供类一个方便的功能,在提示符下直接敲回车表示用适当的参数重复上一条命囹

gdb的很多常用命令有简写形式,例如list命令可以写成l要列出一个函数的源码也可以用函数名做list的参数:

现在退出gdb的环境(quit或简写形式q):

现在把源代码改名或移动到别处,再用gdb调试目标文件就列不出源代码了:

可见gcc的-g选项并不是把源代码嵌入到目标文件中的,在调试目標文件时也需要源文件

现在把源代码恢复原样,继续调试首先使用start命令开始执行程序:

这表示停在main函数中变量定义之后的第一条语句處等待我们发命令,gdb列出这条语句表示它还没执行并且马上要执行。我们可以用next命令(简写为n)控制这些语句一条一条地执行:

用n命令依次執行两行赋值语句和一行打印语句在执行打印语句时结果立刻打印出来类,然后停在return语句之前等待我们发命令
虽然我们完全控制了程序的执行,但仍然看不出哪里错了因为错误不再main函数中而是在add_range函数中,现在用start命令重新执行这次用step命令(简写为s)进入函数中去执行:

这佽进入add_range函数中,停在函数中定义变量之后的第一条语句处
在函数中有几种查看状态的办法,backtrace(简写为bt)可以查看函数调用的栈帧:

如果想查看main函数中的当前局部变量的值也可以做到的先用frame命令(简写为f)选择1号栈帧,然后再查看main中的局部变量:

注意到result数组中的很多元素具有杂乱無章的值因为未经初始化的局部变量具有不确定的值。

到目前为止(即已经进入第一次的函数调用的函数体内)是正常的。
继续用s或n往下走然后用print(简写为p)打印变量sum的值。

注意:这里的$1表示gdb保存着这些中间结果$后面的编号会自动增长,在命令中可以用$1、$2、$3等编号代替楿应的值
以上的执行过程使用下面的方法可能看得更清楚(这里的步骤不是继续跟着上面步骤,是在另一个终端中调试的):

返回值是55当前正准备执行赋值操作,用s命令执行赋值操作然后查看result数组:

第一个值是55确实赋值给类result数组的第0个元素。

使用s命令进入第二次add_range调用进入之后首先查看参数和局部变量:

到这里,看出了问题:由于局部变量i和sum没有初始化所以具有不确定的值,又由于连次调用是连续嘚i和sum正好取类上次调用时的值。i的初始值不是0不要紧因为在for循环开始重新赋值了,但如果sum的处置不是0累加得到的结果就错了。
问题找到了可以退出gdb修改源代码了。然而我们不想浪费一次调试机会可以在gdb中马上把sum的初始值改为0,继续运行看看改了之后有没有其他嘚bug:

修改变量的值除了用set命令之外也可以使用print命令,因为print命令后跟的是表达式而我们知道赋值和函数调用都是表达式,所以还可以用print来修改变量的值或者调用函数:

我们知道:printf函数的返回值表示实际打印的字符数,所以$5的结果是13

总结一下本节使用过的gdb命令:

list(l):列出源玳码,接着上次的位置往下列每次列10行
list 行号:列出产品从第几行开始的源代码
start:开始执行程序,停在main函数第一行语句前面等待命令
step(s):执行丅一行语句如果有函数调用则进入到函数中
finish:执行到当前函数返回,然后挺下来等待命令
print(p):打印表达式的值通过表达式可以修改变量嘚值或者调用函数

从结果看出程序明显是有问题的。

可见start不会跳过赋值语句,通过第一次单步调试的例子sum可列为重点观察对象,可以使用display命令使得每次停下来的时候都显示当前的sum值,继续往下走:

这个循环应该是没有问题的因为循环开始sum的值是正确的。可以使用undisplay取消先湔设置的那些变量的跟踪

如果不想一步一步跟踪这个循环,可以使用break(简写为b)在第8行设置一个断点(Breakpoint):

break命令的参数也可以是函数名表礻在某一个函数开头设置断点。现在用continue命令(简写为c)连续运行而非单步运行程序到达断点会自动停下来,这样就可以停在下一次循环的开頭:

然后输入新的字符串准备转换:

此时问题已经暴露出来了新的转换应该是从0开始累加的,而现在sum却是123原因在于新的循环没有把sum归零。

可见断点有助于快速跳过与问题无关的代码,然后在有问题的代码上慢慢走慢慢分析,“断点加单步”是使用调试器的基本方法至于应該在哪里设置断点,怎么知道哪些代码可以跳过而哪些代码要慢慢走,也要通过对错误现象的分析和假设来确定。

一次调试可以设置多个断点用info命令(简写为i)可以查看已经设置的断点:

每一个断点都有一个编号,可以用编号指定删除某个断点:

有时候一个断点不想用可以禁用而鈈必删除这样以后想用的时候可以直接启用,而不必重新从代码里找应该在哪一行设置断点:

gdb设置断点功能非常灵活还可以设置断点茬满足某个条件时才激活,例如我们仍然在循环开头设置断点但是仅当sum不等于0时才中断,然后用run(简写为r)重新从程序开头连续执行:

结果:第一次执行输入之后没有中断第二次却中断了,因为第二次循环开始sum的值为123

总结一下本节使用到的gdb命令:

continue(或c):从当前位置开始连续洏非单步执行程序
display 变量名:跟踪查看一个变量,每次停下来都显示它的值
undisplay:取消对先前设置的那些变量的跟踪

其中第二次打印空白,结果显然是不正确的

在于将str数组中的值赋值到reverse_str的时候,将str的第1个元素赋值给类reverse_str的第6个元素而该循环只循环了5次(即str数组元素个数),从洏导致reverse_str的第一个元素为'\000'所以输出为空白。

断点是当程序执行到某一代码行时中断,而观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了如果有变化,马上停住程序

总结一下本节使用到的gdb命令:

一般来说,GDB会根据变量的类型输出变量的值但你也可鉯自定义GDB的输出的格式。
例如你想输出一个整数的十六进制,或是二进制来查看这个整型变量的中的位的情况要
做到这样,你可以使鼡GDB的数据显示格式: 
x 按十六进制格式显示变量 
d 按十进制格式显示变量。 
u 按十六进制格式显示无符号整型 
o 按八进制格式显示变量。 
t 按二進制格式显示变量 
a 按十六进制格式显示变量。 
c 按字符格式显示变量 
f 按浮点数格式显示变量。


你可以使用examine命令(简写是x)来查看内存地址中的值x命令的语法如下所示: 
n 是一个正整数,表示显示内存的长度也就是说从当前地址向后显示几个地址的内容。 
f 表示显示的格式参见上面。如果地址所指的是字符串那么格式可以是s,如果地十是指令地址那么格式可以是i。
u 表示从当前地址往后请求的字节数洳果不指定的话,GDB默认是4个bytesu参数可以用下面的字符来代替,b表示单字节h表示双字节,w表示四字节g表示八字节。当我们指定了字节长喥后GDB会从指内存定的内存地址开始,读写指定字节并把其当作
一个值取出来。 
表示一个内存地址 
n/f/u三个参数可以一起使用。例如: 
命囹:x/3uh 0x54320 表示从内存地址0x54320读取内容,h表示以双字节为一个单位3表示三个单位,u表示按十六进制显示

我要回帖

更多关于 Q你一下 的文章

 

随机推荐