西西软件园多重安全检测下载网站、值得信赖的软件下载站!
软件
软件
文章
搜索

首页编程开发其它知识 → VS和Eclipse的调试功能哪个更强大?

VS和Eclipse的调试功能哪个更强大?

相关软件相关文章发表评论 来源:西西整理时间:2013/12/30 9:19:32字体大小:A-A+

作者:西西点击:86次评论:0次标签: Eclipse

  • 类型:编程工具大小:13.8M语言:英文 评分:5.5
  • 标签:
立即下载

以前一直用VS 2012来调试C/C++代码,F5、F10、F11用起来甚是顺手,前面也写过一篇关于VS最好用的快捷键:Visual Studio最好用的快捷键(你最喜欢哪个), 所以对于调试C/C++代码我一直钟情于VS。可最近下载了一个linux环境下用C++编写的开源库,准备进行一番研究,由于我对gdb调试只处在初步 阶段,还没有对整个项目用gdb调试过,而且gdb调试看起来也不方便,还是VS看的直观。为了省懒和省时间就将代码弄到VS中进行编译调试,结果发现编 译不成功,因为里面出现了很多类似int block[2*n];这样的变长数组。大家知道传统C语言和C++是不支持变长数组功能的,不过在C99标准中新增的一项功能就是允许在C语言和C++ 中使用变长数组,节省了很多资源。可恨的是,微软的编译器跟不上时代的步伐,C++11都出来这么久了,微软到现在连C99还不完全支持(不知道最新版的 VS 2013支不支持),不知道是故意而为之还是其它什么原因。既然VS不支持变长数组,我这程序就调试不了,我也不可能一个个的把它改成定长的。后来想到用 Eclipse CDT进行调试,就下载了个完整的Eclipse CDT(没在已有的Eclipse上安装CDT插件而是下载了个完全用于C/C++开发的Eclipse,因为配置插件出现了很多问题,至今还待解决)。 Eclipse中的C/C++库支持使用的是最新版的Cygwin,最新的g++肯定是支持变长数组的,这时也发现我下载的库的原作者也是在 Eclipse CDT下开发该项目的,因为工程目录下有.cproject和.project这两个文件,因此认为在Eclipse CDT下编译调试该工程是最佳选择。经过尝试,编译是通过了,可是运行时老是出现这样一个错误:No source available for "ntdll!ZwWriteFile() at 0x77a4133a"

然后各种google、百度都搜不到相关的信息或只有少数几个没什么价值的信息。看来只能断点调试了,发现了问题所在位置:

<span style="font-size: 16px;">    if(i!=0){
        re[i]='\0';
        if (re[0]!= '#'){
            j++;
            if (j>=from && (to==-1 || j<=to)){
                if (DEBUG) fprintf(stdout,"\n%d) processing regex:: <%s> ...\n",j,re);
                parse_re(nfa,re);
            }
        }
        free(re);
    }
    if (DEBUG) fprintf(stdout, "\nAll RegEx processed\n");
    if (re!=NULL) free(re);
    //handle -m modifier
    if (m_modifier && (!anchored->get_epsilon()->empty() || !anchored->get_transitions()->empty())){
        non_anchored->add_transition('\n',anchored);
        non_anchored->add_transition('\r',anchored);
    }
//  delete non_anchored, if necessary
    if(non_anchored->get_epsilon()->empty() && non_anchored->get_transitions()->empty()){
        nfa->get_epsilon()->remove(non_anchored);
        delete non_anchored;
    }else{
        non_anchored->add_any(non_anchored);
    }
</span>

发现每次判断该条件语句if (m_modifier...)过后才报上面那个错误,所以坚信是这条语句有问题,经过一番检查觉得这语句没啥问题,无奈之下干脆将两个判断条件全部注释掉了,结果还是出现问题,问题转到注释语句的下面,实在不清楚是啥原因,就仔细看了下“No source available for "ntdll!ZwWriteFile() at 0x77a4133a"这 条错误语句,发现是和ntdll库有关,于是就搜ntdll库错误相关的资料,最终发现可能是跟堆相关,可还是没能解决问题。最终我还是转到VS下面调 试,当然前提是去掉了变长数组(还好发现变长数组只出现在两个文件的两个函数中,直接注释掉了),编译成功后运行出现错误:

点Continue接着出现错误:

看了下错误信息真的是堆问题,调试下发现是这句if (re!=NULL) free(re);执行不了,再次调试发现前面re这个对象已经通过free(re)释放了,这里按理说re应该为NULL了也就是不会再次 free(re)了啊,可是实际运行的确re不为NULL因此再次free了re,相当于一块本来已经释放了的内存空间再次被释放,肯定会出现堆错误了。 将该条件语句注释掉后,运行成功,然后在Eclipse下注释掉该句也是运行成功。现在问题就来了:

1. 为什么free(re)过后re不为NULL呢?

我一直认为将一个对象free过后该对象就为NULL了,这样就可以通过判断该对象是 否为NULL来知道该对象是否为正确的释放了,如果没有释放(上面的代码中也就是if(i!=0)没执行)那么在此进行释放以避免内存泄露。这个工程库中 也是这样做的,可是通过调试却发现不是这样的情况,现在我能想到的唯一解释就是:free(re)过后re所指内存空间的确被释放了,但re本身的值不会 改变,也就是形参的值没有改变,所以re还是原来的值当然就不是NULL了,这样后面的再次free也就会被执行,但re所指的内存已经被释放所以再次 free也就失败了。如果这个解释正确的话,那么以后怎么判断re所指的内存是否被释放了呢?当然上面的代码很好解决,直接在if(i!=0)后面加 else{ free(re); }也就解决了,可是其它情况呢?

2. Eclipse中为什么调试不出来这个错误呢?

Eclipse的调试功能也十分强大,可是这里的调试却不友善,一个是错误信息看不 懂,一个是出错位置调试不出来,虽然出错位置就在调试出来的位置的正上面,但调试的时候if (re!=NULL) free(re);这句的确是执行成功了,所以也就不会认为是这句的问题,难道程序真正的出错位置是在Eclipse下调试出来的出错位置的正上面吗?额,应该不会吧。

下面不得不简单比较下VS和Eclipse调试功能的差异:

1. 首先如果你习惯了用VS的调试,那么转到Eclipse下可能会有些不太习惯,尤其是大家熟知的VS下的F5、F10、F11到了Eclipse下却变成了F8、F6、F5,其它的也不同,这样的转变有时候真不习惯。

2. 我觉得Eclipse下调试有一点的确比VS好,就是对函数的智能提示,Eclipse下当你讲鼠标放到一个自定义函数上面,会自动显示该函数的实现,而VS下只能显示该函数的声明,要知道定义还得按F12跳过去。

Eclipse下:

VS下:

其它的我就不多作比较了,比如快捷键方面,因为对VS快捷键较熟,对Eclipse快捷键还不是很了解(虽然自己最熟的语言是Java,但调试Java的次数较少),所以两者快捷键方便的差异性我也就不太清楚了,如果清楚的麻烦告诉我。

好了,以自己亲自调试的一 个小错误引出了这么一个问题:Eclipse与VS,你更喜欢哪个呢?当然有人会说,开发C/C++与C#就用VS,开发Java就用Eclipse,可 是Eclipse可不仅仅是Java的编辑器,Eclipse是全能型的,可以编译常见的所有语言如C/C++、C#、Python、Ruby等等,如果 你钟爱Eclipse,完全可以用它来开发你想要开发的任何程序。

    app制作
    (8)app制作
    一款好的不仅需要有创意的开发人员还要有一款合适的制作软件,有时候一款好用的制作软件可以让开发人员节省很多不必要的时间。另外对于一些不懂编程的人员来说制作一款也不是没有可能的,有些功能强大的制作软件可以让完全不懂编程的人也能制作出一些精美的来,比如一些公司的产品展示这类不需要有自己特色的就可以通过制作软件轻松做出来。这里西西给大家收整理了一些好用的制作软件下载,希望对大家有所帮助。...更多>>
    • appBookv1.0 官方版

      07-04 / 132.6M

      推荐理由:appBook 一次编辑多平台发布 轻松拥有自己的app,appBook是全球首家运行在PC和Mac的移动平台应用编辑制作软
    • 安卓平台反编译神器(Apktool)v6.0.

      02-19 / 13.0M

      推荐理由:Apktool,一款安卓移动平台上的反编译利器!Apktool现已完美兼容Android5.0L,使用它可以修改软件应用名称,
    • myeclipse 10.0

      11-03 / 886M

      推荐理由:MyEclipse 10使用最高级的桌面和Web开发技术,包括 HTML5 和 Java EE 6,支持 JPA 2.0、JSF 2.0 、Eclipsel
    • 移动应用开发工具(AppCan IDE)V3.1

      11-14 / 421.8M

      推荐理由:AppCan应用使用HTML5、CSS3和JavaScript语言编写,通过AppCan IDE提供的本地打包工具或在线编译系统生成可在
    • appMaker中文版v1.0 官方免费版

      03-06 / 315.8M

      推荐理由:appMaker中文版是一款免费的app制作软件,可以制作各种展示类的app。如:移动互动电子书、电子杂志、地产楼
    • 安卓开发(Google Android SDK)r24.

      05-15 / 85.8M

      推荐理由:Google Android SDKAndroid是Google自己研发的手机平台操作系统,该平台基于开源软件Linux,由操作系统、中
    eclipse
    (119)eclipse
    是对的扩展,利用它我们可以在数据库和的开发发布以及应用程序服务器的整合方面极大的提高工作效率。它是功能丰富的集成开发环境,包括了完备的编码调试测试和发布功能,完整支持,,,,,,,。分类在结构上,的特征可以被分为类模型开发工具开发工具应用程序服务器的连接器项目部署服务数据库服务整合帮助...更多>>
    eclipse中文版下载
    (27)eclipse中文版下载
    是一个开放源代码的基于的可扩展开发平台。还包括插件开发环境,,这个组件主要针对希望扩展的软件开发人员,因为它允许他们构建与环境无缝集成的工具。它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,附带了一个标准的插件集,包括开发工具,。汉化方法把语言包中的,文件夹直接覆盖到安装目录中,或者把汉化包放到目录下面。常用快捷键.快速修复.删除当前行.复制当前行到下一行.或者说是空格由于后者与输入法...更多>>
    JAVA软件
    (60)JAVA软件
    软件下载,编程软件下载专题有多款适合编程爱好者学习使用的软件,我们提供了适用于开发者使用的相关软件的各个版本跟新的下载地址,以方便各位爱好者使用学习。如果您有什么好的编程软件可以向我们提供分享下载,如果下载的软件有什么问题也可以向我们提供建议,祝程序员们学习愉快软件开发其实可以不用其他软件的。只需要安装了工具包即可,这个是必须的。并且一定要配置好系统的环境变量。这个可以到网上去查,网上很多。然后进...更多>>

    相关评论

    阅读本文后您有什么感想? 已有人给出评价!

    • 8 喜欢喜欢
    • 3 顶
    • 1 难过难过
    • 5 囧
    • 3 围观围观
    • 2 无聊无聊

    热门评论

    最新评论

    发表评论 查看所有评论(0)

    昵称:
    表情: 高兴 可 汗 我不要 害羞 好 下下下 送花 屎 亲亲
    字数: 0/500 (您的评论需要经过审核才能显示)