可视调试器--insignt

长平狐 发布于 2013/01/11 10:33
阅读 176
收藏 0

       原创文章,转载请注明出处,谢谢!       
       作者:清林,博客名:飞空静渡


       在linux写程序的人很多都是用gdb来调试程序的,而且也可以用vim来运行gdb命令。虽然gdb非常强大,但毕竟是一个命令行的程序,所以为了程序调试的直观性,出现了很多可视化的调试软件,如大名鼎鼎的ddd,insignt等。我们今天说的就是insignt。


        Insight是一个Tcl/Tk编写的gdb的图形用户接口,它是由在Red hat以及Cygnus的工程师写的。Red hat大方的将其捐赠给大众使用,甚至不时的提供人力继续完善它的功能。Insight项目始于1994年,至今已经有颇为成熟,它能很好的发挥大部分 gdb的强大功能。


        简单的Insight的介绍和安装可以参考《Insignt的使用<gdb的最优前端>》一文:http://wiki.ubuntu.org.cn/index.php?title=Insight%E7%9A%84%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95%EF%BC%88gdb%E7%9A%84%E6%9C%80%E4%BC%98%E5%89%8D%E7%AB%AF%EF%BC%89&variant=zh-cn


        Insignt又名Visual gdb。如果对于gdb的使用很熟悉或者知道gdb基本命令的人,应该说是非常非常非常容易上手,因为Insignt的快捷键和gdb是一样的。


       下面介绍gdb的基本使用。


        在命令行上运行 insignt ./yourprogram就可以进入insignt的调试,当然前提是你的程序(yourprogram)必须有调试信息。




     点击工具栏上的那个跑步的人(Run)就可以运行程序了,程序会在main函数的第一行代码处停下来,然后你就可以设置断点,再调试。断点的设置也很简单,找到你想下断点的行,然后在行的前面点击一下就出现一个红色的点,表示这行已经下了一个断点,注意:在每行前面都会有一个 “-” 的,有这一 “-” 的行才可以下断点。


     下面是insignt的几个基本命令的快捷键,和gdb是一样的。

          r:运行

          n:运行一行命令,不进入

          s:运行下一行,进入

          c:continue,直到遇到断点停止或程序结束

          f:finish的意思,是运行完一个函数。


     在菜单的view栏里,你可以调出各种窗口,可以查看变量,查看寄存器的值等等,也可以在最右边的下拉框里选择查看汇编代码。

     基本的调试就是这些,是不是很简单。


下面说明一下其它的一些调试技巧,这些都是比较常用的。


1、条件断点

      一般我们在调试程序的时候,要用到条件断点,但我们的insignt是没有下调试断点的,不过没关系,因为insignt在view菜单中有个console窗口,你可以在里面运行gdb的命令。你可以在console上运行info breakpoints来查看你的断点,可以用break ... if <condition>来对断点增加调试条件。


2、给程序加参数

      我们的一些程序一般会有要求要参数,如linux下的ls命令,可以这样ls /dev来查看/dev目录,如果我们来调试ls命令就不可以这样了

       insignt ./ls /dev

      我们可以这样,insignt ./ls,在进入insignt环境后在view菜单中选择console窗口,然后运行run /dev就可以了,注意在run之前要先下好断点。

 

3、查看父类的变量

      我们在写c++的代码的时候,会经常用到继承,当我们在insignt里调试我们的程序并进入到子类时,我们没法从wathc窗口上 直接 查看我们在父类定义的变量的值,insignt会提示说在当前找不到这个变量。我们可以在view菜单下的Local viriables窗口中找到我们的这个类(即this),然后顺着类的继承关系找到父类,然后可以在里面查看父类中的变量的值。

 

4、运行循环体

       当我们在一个循环体里面运行时,例如while,for循环等,如果我们厌倦了在循环体里面单步执行想跳到循环体后面的语句运行时,在insigned是没有想c、n等这样的命令,你可以在循环题下设置断点,然后按c到达你的断点处,但你也可以在console窗口下运行until或u命令己可以运行玩循环体到下一语句。


5、调试多线程

      这个也很方便,我们可以在insignt在view菜单中找到一个Tread List的窗口,刚开始我们只能看到我们的主线程。



     当我们运行我们的线程的时候,我们可以看到有个线程出来了(默认的是主线程)。


     我们可以选择线程,来查看我们的线程。你可以在线程函数里下断点,然后可以查看到进入哪个线程运行。你也可以在console窗口里运行:

break <linespec> thread <threadno>
break <linespec> thread <threadno> if ...

break <linespec> thread <threadno>
break <linespec> thread <threadno> if ...
linespec指定了断点设置在的源程序的行号。threadno指定了线程的ID,注意,这个ID是GDB分配的,你可以通过“info
threads”命令来查看正在运行程序中的线程信息。如果你不指定thread
<threadno>则表示你的断点设在所有线程上面。你还可以为某线程指定断点条件。


这样也可以给线程下断点。


     以上是insignt的一些基本的调试,如果想让insignt的更多功能,可以在console窗口上运行gdb的命令,基本可以满足你的要求 :)。

 

      gdb的使用可以参考:《用gdb调试程序在》:http://wiki.ubuntu.org.cn/index.php?title=%E7%94%A8GDB%E8%B0%83%E8%AF%95%E7%A8%8B%E5%BA%8F&variant=zh-cn#.E8.AE.BE.E7.BD.AE.E6.96.AD.E7.82.B9.EF.BC.88Break_Points.EF.BC.89



原文链接:http://blog.csdn.net/fjb2080/article/details/4905479
加载中
返回顶部
顶部