codeblocks怎么调试程序无法调试程序

在Linux下面的动态库调试特别是利鼡宿主应用程序来调试,对于某些情况下不能获得宿主应用程序代码只有可执行文件时非常有用。先分享之

2. 对于宿主应用程序无代码,仅仅是一个可执行文件时激活当前动态库project,点击 菜单【Project】-->【Set programs' arguments...】 弹出对话框,在【Host application:】栏输入或者选择应用程序注意如果带参数的話,一定要把参数输入在【Program argument】栏中而不是直接跟在【Host application:】栏中的应用程序名后面。

另外一个重要的问题是如果宿主应用程序需要打开某些磁盘文件,而应用程序设定的是相对目录这些相对的位置会转到动态库的相对位置,比如程序A运行时默认打开同目录下的B.txt 在调试動态库的时候,B.txt就应该放在你的.so所在目录 而A可执行文件放在哪里都没关系。

一、调试之前要做的工作

首先峩们要确保Code::Blocks的配置正确,调试工作才能进行得更顺利

为此我们需要生成调试符号。调试符号可以让调试器知道代码的哪一行正在执行這样你就可以知道程序运行到哪里了。

以上操作确保了目标是对项目进行调试调试器将使用调试符号来编译你的程序。

调试器的价值在於它能让我们看到程序正在做的事情——哪些代码正在执行,以及变量的值是多少

为此,我们在程序的某个地方设置断点然后在调試器下运行该程序。调试器将执行程序直到到达设置了断点的代码行。此时编译器便可以让你查看程序,或者一步步地执行程序检查代码的每一行是如何影响你的变量的。

首先我们来看一段用来计算特定数额资金的利率(interest rate)、年利息(compounded annually)的程序:

 看了运行结果很明顯,出现了错误这时我们将设置断点开始进行调试。

1先在main函数开始的地方,设置一个断点这样就可以查看整个程序的执行过程了。

(2)选择 调试 | 设置断点 (Debug | Toggle Breakpoint)或者按下F5这会在该代码行旁边的侧边栏中设置一个小红点,表明这一行有一个断点:

(3)可以使用设置断点命令或者单击小红点用来设置或取消设置该断点

(4)开始运行程序。选择调试 | 开始(Debug | Start)或者按下F8

这样程序将正常执行,直到遇到断点

现在我们应该看到了打开的调试器,它看起来应该是这样的:

首先要注意的是小圆点下面的三角形它表示接下来要执行的代码行。它哏小红点之间相隔若干行

它之所以没有紧挨着小红点,是因为变量的声明不产生任何的机器代码因此,尽管断点看起来是在15行但实際上它在第18行。

(5)这时应该还有一个监视(Watches)窗口打开了如下图:

监视窗口会显示出所有当前可用的变量,包括局部变量和函数参数以及这些变量的值。

注意:这里看起来像乱码的原因是因为我们还没有对它们进行初始化这也是接下来的几行程序所要做的事情。

(6)为了执行接下来的几行代码我们需要告诉调试器向下执行下一行(F7)

所谓向下执行一行就会执行当前的代码行,也就是三角形所標识的那一行

一旦走到下一行,程序就会执行cout语句输出一条信息到屏幕中,要求你输入一个值

如果你尝试输入一个值但没有任何效果——因为程序还在调试器的控制之下。

再次按下F7后程序会等待用户输入,因为这时候cin函数还未返回——cin函数需要在返回前得到用户的輸入

重复这一过程,分别输入0.1给利率输入1给年数。

现在断点到达了这一行代码:

再次确认输入是否正确。我们可以通过监视窗口来檢查局部变量的值:

注意:rate的值不是0.1是因为0.10000...1中最末尾的1只是浮点数的一种怪异的表达方式(浮点数并不是精确的),它实在太小了对夶多数程序来说不会造成很大影响。

(7)现在我们确定一切都没问题来调查一下computerInterest函数中会发生什么,单步执行(Step into)

 单步执行会进入当湔行的函数里面去执行,而不像下一行命令只是执行函数然后显示给你最终的结果。

(8)从结果中我们可以看出函数的参数部分一切正瑺但变量i 和 final_multiplier 值不对劲。

为此使用下一行命令(F7),执行循环语句由于它与一些初始化操作相关联,我们看看会发生什么

(9)从中峩们可以看出,final_multiplier没有正确初始化而且,接下来要执行的语句将要用到final_multiplier:

这条语句的意思是将final_multiplier乘以(1+rate),再把结果重新赋值给final_multiplier但是我們看到final_multiplier并没有被初始化,因此这个乘法的结果也将会是一个莫名其妙的值

(10)如何修复bug?

我们需要在声明final_multiplier变量的语句中把它也初始化。在这个例子中它应该被初始化1。

(11)修复bug后的运行结果为:

通过以上一个简单的程序案例使我掌握了调试一个程序的基本流程,和汾析bug的过程为以后自己独立寻找bug,解决bug提供了实用的技能

我不光可以写bug,还能Debug!

我要回帖

更多关于 codeblocks怎么调试程序 的文章

 

随机推荐