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

作者:小菜 更新时间:2025-04-29 点击数:
简介:以前一直用VS 2012来调试C/C++代码,F5、F10、F11用起来甚是顺手,前面也写过一篇关于VS最好用的快捷键:Visual Studio最好用的快捷键

【菜科解读】

以前一直用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、百度都搜不到相关的信息或只有少数几个没什么价值的信息。

看来只能断点调试了,发现了问题所在位置:

if(i!=0){re[i]= \0 if(re[0]!= # ){j++;if(j>=from && (to==-1 || j ...\n",j,re);parse_re(nfa,re);}}free(re);}if(DEBUG) fprintf(stdout, "\nAll RegEx processed\n");if(re!=NULL) free(re);//handle -m modifierif(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 necessaryif(non_anchored->get_epsilon()->empty() && non_anchored->get_transitions()->empty()){nfa->get_epsilon()->remove(non_anchored);deletenon_anchored;}else{non_anchored->add_any(non_anchored);}

发现每次判断该条件语句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,完全可以用它来开发你想要开发的任何程序。

和,Eclipse,的,调试,功能,哪个,更,强大,以前,

海东社保卡里的医疗保险凭证到底如何给家人使用

社保即社会保险,是一种为丧失劳动能力、暂时失去劳动岗位或因健康原因造成损失的人口提供收入或补偿的一种社会和经济体系。

海东职工社保卡上的个人账户如何共济给家人?这些要点需注意随新社通小编来了解一下:海东社保卡里的医疗保险凭证到底怎么给家人使用?社保卡怎么给家人用?绑定流程及方法社保卡里的余额给家人使用,主要可以通过以下几种方式实现:一、电子社保卡亲情服务此外,还可以通过电子社保卡的亲情服务功能,为家人提供便捷的电子社保卡签发和应用服务。

具体步骤如下:打开电子社保卡首页,点击右上角“我的”-“亲情服务”。

点击“添加”,验证电子社保卡密码后,阅读并同意添加亲情账户告知书。

输入要开通人的姓名、社保号码、亲情关系,点击“添加亲情账户”并上传身份凭证(小于16岁需同时上传人脸正面照)。

亲情服务绑定对象进行人脸识别操作,认证通过后则开通亲情服务成功。

通过电子社保卡亲情服务,可以帮家人查询个人社保权益单、进行社保待遇资格认证、办理社保网上转移申请等,同时也可以使用社保卡里的余额。

二、社保卡绑定家人通过社保卡的家庭共享功能,可以将社保卡的余额绑定给家人使用。

具体操作步骤如下:社会保险服务个人网页自助办理:登陆个人网页,进入社保业务办理-医疗业务办理-个人账户家庭共享-新增绑定,输入亲属社保电脑号、亲属身份证号及亲属关系,提交保存,即完成绑定。

到社保分局医疗保险窗口申请办理:在社保部门医保现金报销窗口刷卡绑定,刷被使用人的社保卡,并录入使用人的社保卡号。

在定点医院医疗保险办公室办理:在医院医保办,通过“网上医院”刷卡绑定,刷被使用人的卡,并录入使用人的社保卡号。

完成绑定后,家人在就医时就可以使用社保卡里的余额进行支付了。

需要注意的是,社保卡里的余额属于个人所有,给家人使用时需确保符合要求,不得进行违法违规操作。

另外,不同地区的社保卡使用可能有所不同,具体操作方法还需根据当地而定。

目前首批开通个人账户跨省家庭共济的地区(统筹区)有哪些?1、重庆市(云阳县)2、河南省(郑州市、信阳市)3、甘肃省(临夏回族自治州)4、河北省(石家庄市、唐山市、秦皇岛市、邯郸市、邢台市、保定市、张家口市、承德市、沧州市、廊坊市、衡水市、辛集市、定州市、雄安新区、省本级)5、安徽省(淮南市)6、山东省(德州市)7、湖北省(襄阳市、黄冈市、咸宁市、随州市、恩施土家族苗族自治州、潜江市)8、江苏省(苏州市)9、四川省(省本级、成都市、广安市)共31个地区(统筹区)已开通个人账户跨省共济使用。

海东社保卡怎么激活?有三种激活方法社保卡激活第1种方式如下:请注意,参保人在领取到社保卡需要在半年内办理激活,否则原医疗保险卡将限制使用。

激活社保卡的具体方法可能因地区和银行而有所不同,如有疑问,请咨询当地社保局或相关银行。

社保卡激活第2种方式如下:社保定点药店激活参保人员在医保定点药店首次使用社保卡时,插入原医保卡,再按要求插入社保卡后,即可启用社保卡。

社保卡激活第3种方式如下:银行营业网点激活参保人需持本人社保卡、身份证明原件到对应银行营业网点激活社保卡,激活后医疗保险账户将恢复正常。

社保卡激活第4种方式如下:社保定点医院激活参保人员在定点医疗机构首次使用社保卡时,只需正常办理门诊或住院挂号登记业务,即可直接启用社保功能。

社保卡如何激活的呢

社保卡怎么激活的呢?社保卡怎么激活?第1种方式:电话激活拨打社保热线12333,接通后按“0”转接人工服务。

提供个人身份证信息和社保卡卡号,以便客服人员核实身份。

在客服人员的协助下,按照提示完成社保卡的激活。

社保卡怎么激活?第2种方式:社保经办机构激活携带身份证和社保卡,前往当地社保经办机构。

在经办机构窗口,提交身份证和社保卡,并告知工作人员需要激活社保卡。

工作人员会核实个人信息,并完成激活手续。

社保卡怎么激活?第3种方式:银行激活携带本人有效身份证和社保卡,前往社保卡的开卡银行的柜台。

在银行柜台,按照工作人员的指引,填写相关激活表格。

提交身份证和社保卡,工作人员会核实个人信息,并完成激活过程。

社保交够多少年就能够退休拿到退休金?社保需要缴纳多少年,才能领取退休待遇?社保的缴费年限直接影响到个人退休金的领取。

累计缴费满15年是领取退休金的基本条件。

本质上,社保的缴费年限与个人账户都对养老保险待遇有影响,缴费年限越长,领取的退休金一般也会相应增加,体现“多缴多得”的原则。

如果个人在达到法定退休年龄时,社保缴费年限未满15年,有几种选择:一是可以继续缴费至满15年,然后按月领取基本养老金;二是可以转入新型农村社会养老保险或者城镇居民社会养老保险,按照相关要求享受养老保险待遇。

综上所述,为了确保能够在达到法定退休年龄时按月领取退休金,个人应当至少累计缴纳社会保险满15年。

温馨提示:本数据仅供参考!具体需以当地有关法规为准!

加入收藏
               

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

点击下载文档

格式为doc格式

  • 账号登录
社交账号登录