随笔分类 - Windows C/C++开发
摘要:扬长避短使用Windbg和Visual Studio高效调试调试你的代码 经常被问及这样的问题: 你为什么非要使用Windbg调试你的程序? 记得有一次面试的时候笔者也被问到这样的问题,我的回答是:不是我非要使用Windbg, 只是在不同的情况下使用不同的工具会更加方便而高效。 那么这两者到底有什么区别?在什么情况下用什么工具会更方便呢? 所谓尺有所短,寸有所长,那么笔者就总结一下在什么情况下用什么工具会更方便,可能不是100%的全面,但是应该可以说明一定的问题,希望给初学者以指引。 Case 1: 分析.dmp文件的时候,可以使用Windbg和Visual St...
阅读全文
摘要:STL map 内存改变,迭代器失效,_Isnil(_Ptr)和红黑树最近在做项目时发现一个crash的问题,当时得到的dmp文件显示crash在一个以map为循环变量的循环中,crash位置在如下的代码中标出。void_Inc(){//movetonodewithnextlargervalue#if_HAS_ITERATOR_DEBUGGINGif(this->_Mycont==0||_Ptr==0||_Isnil(_Ptr)){_DEBUG_ERROR("map/setiteratornotincrementable");_SCL_SECURE_OUT_OF_RA
阅读全文
摘要:我为什么要学习C++反汇编 写在开始从6月7日开始到今天已经有5天了,在这5天的业余时间(工作之余)里终于系统的完成了C++反汇编的大部分问题的学习,今天写篇总结,算是对这几天学习的总结。首先我想说明的一个问题就是我为什么要花时间研究C++反汇编?这事得从笔者遇到的一个问题开始说起,大约2周前我们项目做在开发过程中遇到了一个Crash的问题,由于只有客户提供的一个.dmp文件,我们只能从这个地方入手,说起来很奇怪,从C++代码的角度根本看不出来问题,我找来了一个传说中的公司的大牛,大牛就在我面前给我详细的分析了一遍这个转储文件,感觉他看反汇编出来的代码就像看C++源代码一样,看问题也会更透彻,
阅读全文
摘要:最近在分析C++ dump 文件的时候觉得有必要将一些必要的反汇编东西总结一下以备别人参考,自己有时间的时候也可以进行更多的改进。下面通过一个简单的C++代码转成汇编代码后的详细解释说明一下C++和汇编的对应关系,以及如何识别汇编代码中进行的一些操作的意义。代码的调用关系如下图所示:完整C++代码下:intInternalFunctionA(intnSizeA1,intnSizeA2){intlocalnSizeA1=nSizeA1;intlocalnSizeA2=nSizeA2;intnFunctionA=localnSizeA1+localnSizeA2;returnnFunctionA;
阅读全文
摘要:上文说明了C++反汇编后的EBP,ESP寄存器都是做什么用的,相信大家已经有所了解,如果有没看过的请参考下文:http://www.cnblogs.com/pugang/archive/2012/05/25/2518499.html本文不会对其再做过多的讲解,如果还有问题,欢迎大家留言讨论。首先明确本文要解决的问题:在没有源代码的情况下如何看明白我们的汇编代码中哪些是局部变量。为了便于说明我将C++代码和汇编代码在一起,完整代码如下:intInternalFunctionA(intnSizeA1,intnSizeA2){00401000pushebp00401001movebp,esp0040
阅读全文
摘要:首先解释一下,什么是堆内存? 堆是一种常见的内存管理器,应用程序通过堆来动态地分配和释放内存,通常使用堆的情况是无法预先知道所需要的内存大小,或者申请内存太大,无法通过栈内存来自动分配,下面让我们再来看一段英文解释。A heap is a form of memory manager that an application can use when it needs to allocate and free memory dynamically. Common situations that call for the use of a heap are when the size of the
阅读全文
摘要:详解C++代码反汇编后的堆栈寄存器EBP和ESP最近在分析一个进程崩溃的严重问题,其中有些过程分析需要对ebp, esp 有清晰的理解,对于ebp 和esp 相信大家都很熟悉了,但是为了使本文自成体系,我还是解释一下。ebp--栈底指针esp--栈顶指针如图所示,简化后的代码调用过程如下:void Layer02(){ int b = 2;}void Layer01(){ int a = 1; Layer02();}那么函数执行过程中ebp和esp是如何变化的呢?如下是反汇编后的代码:void Layer02(){00413700push ebp00413701mov ebp,esp 0041
阅读全文
摘要:最近一直忙于项目,好久没写文章了,今天终于有些时间,把一些沉淀和思考总结一下,希望对大家有所帮助,也是对知识的一次梳理。转眼做windows开发已经又有5年的时间了,5年时间一直徘徊在几个大系统之间,原型设计,组件设计,重构,features实现,调试,修改bug,写过C++,用过COM,ATL,写过.Net,做过互操作,写过services用过WCF,可以说十八般武艺至少都尝试过,不敢说精通,但是至少对大部分的问题有自己的理解。首先我把目标锁定在Windows平台,因为我的工作要求我在这个平台下去做,实战经验也都是在这个平台上面积累起来的。对于Linux和Java我也会关注一些相关的东西,也
阅读全文
摘要:强制结束进程的两种实现方式--C#和C++实现最近在做一个大型的项目,由于进程之间的关联出了一些问题,长话短说,就是我们不得不强制停止某些进程以保证系统正常的运行,在网上找了一下,没发现有这方面详细的介绍和写的比较全面的文章,于是按照MSDN的说明写了两种方法,希望对遇到类似问题的朋友有所帮助。首先,我们来看看C#的实现方式, 由于C#对进程的封装比较好,所以我们只需要较少的语句就可以完成这个工作,值得强调的是参数有效性检测和名字比较,由于系统中可能运行很多意想不到的进程,所以在比较名字的时候一定要用等于而不是包含或者之比较开头和结尾,否则很可能杀错进程,相关代码如下。C# Code://Re
阅读全文
摘要:Books Programmers Don't Really ReadFrom:http://www.billthelizard.com/2008/12/books-programmers-dont-really-read.htmlMark Twain once said that a classic novel is one that many people want to have read, but few want to take the time to actually read. The same could be said of "classic" p
阅读全文
摘要:--写在开始 按照今年的计划,需要研究一个有使用价值的linux下的C++开源项目,无意中发现了V8,觉得还不错,于是记录下来,希望对大家有所帮助。V8是一个由丹麦Google开发的开源JavaScript引擎,用于Google Chrome中,Chrome是现有的浏览器中速度相对比较快的一个,这完全得益于V8的效率,另外,作为一个独立的项目,V8也可以嵌入到我们自己开发的项目中运行,查了一下才知道,前一这被大家热炒的Node.js也是基于V8的,可见V8值得大家稍微研究一番。作为一个开源JavaScript引擎,V8是以源代码的形式开源,而我们使用的时候是以库的形式进行使用,这就涉及到源代.
阅读全文
摘要:春节期间一次用手机上网无意间发现了这本书,说起来还得感谢智能手机的发展,有时候还是很方便的。当时随便的翻了几页,于是我停不下来了,因为我发现原来我不知道的东西太多了。我第一次接触STL的时候大约在7年前,那个时候刚从C语言转到C++,记得那个时候知道了STL 的vector, list, map, 但是只是把这些东西当作C++的语法,一带而过,用的时候查查文档,只要逻辑和结果对了就OK,到处是for循环,到处是迭代器,现在回想起来的感触是:… 没文化,真可怕。第二次我想深入学习STL的时候是研究生毕业以后,记得那个时候刚入行,公司的产品出现了一个问题,是关于STL 的一个容器的erase()
阅读全文
摘要:经常发现有人在网上提出这样的问题,现实中也确实有不少人在经历了3-5年的Windows开发之后就开始迷失方向,每天浑浑噩噩混日子,可能是因为这个问题粒度太大,没人愿意花时间回答,希望本文可以抛砖引玉,给大家节省些时间,同时也希望园子里面的兄弟们能尽力的补充,从而使这篇文章可以帮助更多的后来人。 首先说明的是,本文提到的各种技术不分先后,没有顺序,虽然先学什么,再学什么对某些人来说可能更方便,但是这些都不是绝对的,因为每个人的情况不同。 Windows开发首先必须学习的就是操作系统的API,因为其他的一切都是构建于OS之上,所谓九层之台,起于垒土,如果你对linux的系统调用很熟悉就会发现其..
阅读全文
摘要:关键字:COM,.NET,互操作,封送 多年来在程序设计领域微软技术一直引领着每个时代,在每一代的技术背后都有相关的动机,而这些动机及其实现细节往往是大部分的程序设计课程没有涉及的,但是对于我们理解相关的技术又十分重要,本文将对几种相关技术和隐藏在动机背后的细节做简要的阐述,算是抛砖引玉。 COM技术于1993年首次发布,称得上是微软技术的一个里程碑,其意义在于使组件编程化得以实现。COM技术最初的思想起源于将类做成可重用的二进制组件,把类的实现和接口分离以便把类的实现封装到二进制防火墙的背后,而这道防火墙以VPTR和VTBL的形式保证了这个防火墙的不变性。.NET技术则在语言层面上支持了基于
阅读全文