posts - 9,  comments - 9,  trackbacks - 0
  2010年7月23日

Normally, the break instruction exception can be triggered in following conditions:

1.       Hardcode interrupt request, like: __asm int 3 (ASM), System.Diagnostics.Debugger.Break (C#), DebugBreak() (WinAPI).

2.       OS enable memory runtime check, like Application Verifier can trigger after heap corruption, memory overrun.

3.       Compiler can have some configuration to decide what should be filled to the uninitialized memory block and end of function(blank area, after retun..).  For example, Microsoft VC complier can fill 0xCC if enable /GZ.  0xCC is actually a opcode of __asm int 3.  So if some error cause the application run into such block, will trigger a break point.

A quick summary of what Microsoft's compilers use for various bits of unowned/uninitialized memory when compiled for debug mode (support may vary by compiler version):

Value     Name           Description 

------   --------        -------------------------

0xCD     Clean Memory    Allocated memory via malloc or new but never 

                         written by the application. 


0xDD     Dead Memory     Memory that has been released with delete or free. 

                         Used to detect writing through dangling pointers. 


0xFD     Fence Memory    Also known as "no mans land." This is used to wrap 

                         the allocated memory (surrounding it with a fence) 

                         and is used to detect indexing arrays out of 

                         bounds or other accesses (especially writes) past

                         the end (or start) of an allocated block.


0xCC                     When the code is compiled with the /GZ option,

                         uninitialized variables are automatically assigned 

                         to this value (at byte level). 



// the following magic values are done by the OS, not the C runtime:


0xAB  (Allocated Block?) Memory allocated by LocalAlloc(). 


0xBAADF00D Bad Food      Memory allocated by LocalAlloc() with LMEM_FIXED,but 

                         not yet written to. 


0xFEEEFEEE               OS fill heap memory, which was marked for usage, 

                         but wasn't allocated by HeapAlloc() or LocalAlloc(). 

                         Or that memory just has been freed by HeapFree().

Disclaimer: the table is from some notes I have lying around - they may not be 100% correct (or coherent).


As others have noted, one of the key properties of these values is that is a pointer variable with one of these values is dereferenced, it will result in an access violation, since on a standard 32-bit Windows configuration, user mode addresses will not go higher than 0x7fffffff.


For the related issue, we can use Application Verifier to enable heap page, which can break after memory overrun, heap corruption.


 

 

posted @ 2010-07-23 16:22 MicroYang 阅读(1994) | 评论 (0)编辑 收藏
  2007年4月25日
     摘要: 关于C++的诡异,以及算法学习的开始  阅读全文
posted @ 2007-04-25 16:58 MicroYang 阅读(1488) | 评论 (6)编辑 收藏
  2007年4月18日

有子曰:其为人也孝弟,而好犯上者,鲜矣;不好犯上,而好作乱者,未之有也。君子务本,本立而道生。孝弟也者,其为仁之本与。

                                                                                      --《论语今解·学而第一》

 若要达到一个目标,必须循其根本,根本如能确定(本立),那么便容易找出解决的方法(道生)。很多时候就是这样的道理,遇到一个问题,要追究到底才是,更何况是我们做技术的,记得第一次看见这个“本立道生”的词的时候是在候捷翻译的《Inside C++ Object Model》这个是作为他的序言的标题的。其实当你真的了解很多细节的时候你才能真正的体会到技术的魅力,而不是代码的奴隶!

 前几天去微软面试的时候,当时那个主考官问我什么叫overload operator()?以及如何区分它和callback?当时回答的时候,我是这么想的,我是没有用过这个仿函数啦,但是我知道仿函数是怎么实现的,就是通过重载operator()的方法实现的,而至于callback那么肯定就是通过函数指针去实现了。当时我的第一反应就是可能这个performance算是一个吧,我就这么说了,这个operator()可能是作为inline展开了,节省了函数调用的时间,提高了性能。  但是如果是callback的话,就不可能是作为inline展开了。当时也就这么回答了。主考官给我的回复是这样的,其实至于performance这一块来讲了,也不是最主要的影响,关键的地方在于这个operator()可以保存调用的状态或标志什么的私有数据,而callback只能用static的变量来取代,但是不好的还是static只能为所有的代码服务,而overload operator()可以为每一个obj保存私有数据部分。他说了,对的,显然他说的是没错。但是当时心中还是对他关于performance的回答有点疑虑,当时由于是在面试,也没有多想下去,后来仔细想来,其实最关键的还是这个performance,众所周知,如果一个class member function可以作成inline的属性的,当然编译器有权利决定在调用点是否内联展开,其实在大多数的情况下面,试想如下的代码情况:
 
Class Compare
{
public:
    bool operator (
int iFrst, int iSecond) const
   
{
    
// Do some thing
    return false// Or true
   
}

};


// SortList(List& list, int iSize, const Compare& compareObj)
SortList(list, 1000, com);

如上面的所示,这个class的重载的operator()显然就是带有inline的属性了,这个时候编译器能做的是在能够确定对象类型的时候如果这个代码不是太大(当然还要求你的编译器内联选项容许状态)那么就会在调用点内联展开。但是如果是callback呢?肯定不是,因为他用到了函数指针,即使是这个函数定义成了inline,这个时候也不会做内联展开的(这个时候会有生成一个类似全局的函数代码块,回掉的指针就指向这个块,编译器会维护这个代码块的唯一性)。所以,如果要是仿函数要求确保内联展开的会,要唯一确保的是,代码中的调用点应该是可以确定类型的,能够做内联展开。然后,这个仿函数大多数情况下是没有多态以及继承伴随左右的,所以这个performance是很重要的区别之一,尤其是在你需要处理大量的同类数据的时候,比如上面的这个例子,如果iSize很大,甚至是上万的,那么这个时候的performance估计差别就会太大了。也许你的CPU频率更高,但是更多的是可能是这个没有必要的损失。呵呵。

小提示:如何判断一个函数调用是否被内联展开?
方法:1.你当然可以生成汇编,自己去看。2.你可以在调用点设置断点,看看能不能跟进去?(内联的debug不能跟进去函数,至少目前我所知道的编译器是这样的)。3.当然更多的时候在调用点设置断点,然后查看汇编代码才是最权威的,也是比较简单的方法。
posted @ 2007-04-18 15:30 MicroYang 阅读(541) | 评论 (2)编辑 收藏
  2007年4月10日
     摘要: 学习笔记,整理于03/2007  阅读全文
posted @ 2007-04-10 12:23 MicroYang 阅读(334) | 评论 (0)编辑 收藏
  2007年4月6日
本来是想做成技术类型的博客的,后来发现写的大多都是些日常生活的感受,这段时间每天都在不断的面试,准备,琐碎的事情淹没了我整理的心绪,不过好像我是在为自己的懒惰找理由哦。今天早上接了一家公司的电话,他们觉得我还可以(其实这个不用他们证明,我本来就可以,哈哈),然后决定给我那个赴微软的offer,其实薪水给的还是可以的,我也比较倾向这个,但是还是考虑下,做个比较吧,对自己负责,也对公司负责。反正被人家肯定了以后,心情自然不错,BTW,今天下午还是去微软面试,不过是另一家的。很担心被那个前台认出来哦,换个马甲先,开玩笑了。不过觉得自己面试还是有不少收获的。毕竟以前的很多东西自己研究的也还是蛮深的。mark下,预祝自己顺利。
posted @ 2007-04-06 12:38 MicroYang 阅读(1035) | 评论 (0)编辑 收藏
  2007年4月5日

今天跑了一天,一直以来对算法很头疼,其实真的没有什么,只是自己很少用它去思考问题而已,人便懒乐,思维便也钝了。无论今后如何,在哪儿工作,设计,优化都一定要多多考虑,不为了什么,就为了那份巧夺天工的潇洒。回去的路上第一次发现(也许用注意更合适)一个很流氓的广告,是我在找地铁班次的时候看见的,挂在和地铁标示一样醒目的地方,广告上一样是一串类似于站台的节点,只是左面的几乎全是“胃痛”,最右面的是“胃舒服”,中间被一个药片的符号给隔着。汗颜!!!

posted @ 2007-04-05 21:23 MicroYang 阅读(192) | 评论 (0)编辑 收藏
  2007年4月2日
     摘要: 离职有日来,所阅面试题者无数,正所谓,阅题无数,面已成精;简称面筋  阅读全文
posted @ 2007-04-02 21:27 MicroYang 阅读(1205) | 评论 (0)编辑 收藏
  2007年3月29日

——只要能忘记曾经,你就能自由。你就能重生。

传说中,凤凰是人世间幸福的使者,每五百年,它就要背负着积累于人世间的所有不快和仇恨恩怨,投身于熊熊烈火中自焚,以生命和美丽的终结换取人世的祥和和幸福。同样在肉体经受了巨大的痛苦和轮回后它们才能得以更美好的躯体得以重生。这段故事以及它的比喻意义,在佛经中,被称为涅磐。 《涅磐无名论》中的记载如下:无名曰:夫至人空洞无象,而万物无非我造。会万物以成己者,其唯圣人乎!何则? 非理不圣,非圣不理,理而为圣者,圣人不异理也。故天帝曰:般若当于何求?善吉曰:般若不可于色中求,亦不离于色中求。又曰:见缘起为见法,见法为见佛,斯则物我不异之效也。所以至人戢玄机于未兆,藏冥运于即化,总六合以镜心,一去来以成体。古今通,始终通,穷本极末,莫之与二。浩然大均,乃曰涅磐。经曰:不离诸法而得涅磐。又曰:诸法无边,故菩提无边,以知涅磐之道,存乎妙契。妙契之致,本乎冥一,然则物不异我,我不异物,物我玄会,归乎无极,进之弗先,退之弗后,岂容终始于其间哉!天女曰:耆年解脱,亦如何久。” 

翻译成我们现在的语言:无名者说,达到一定境界的人必有空寂灵昧的体验,体验到空境,就不会在意世界万象的事物,万物由我心流出,执万物与我合一,只有圣人能做到!为什么这样说呢?因为不掌握这个真理就不能成为圣人,反之,不是圣人也不能知道这个真理,正因为掌握了这个真理才成为圣人,所以圣人与真理契合无间,凡是圣人都不能离开这个真理!这正如般若观照所说的色心不二,相即相离,空即是色,色即是空的不二之理。从缘起法的角度来看,万法为空,空为万法,见佛即见法,见法即见空,诸法性空,即成见佛,物我两忘,不一不异。所以通达空境的圣人总是勘玄机于先兆,隐未来于变化,将东南西北上下六合统摄一心,过去未来同成一体。古来今往都是一样,穷本极末,没有二致。将浩浩然物我一心,就是涅磐。这就是佛经里说的不离诸法而得涅磐。又因为诸法无边,故求得解脱也无尽,由是推知,涅磐之道在于保持契会妙理之妙契,有了妙契,乃知万法冥然一体的真理。万物与我没有本质的差别,我与万物实质一样,物与我玄妙会通,无极是它们最后归宿。涅磐就是进而不前,退而不后,无始无终,终始不在其间!天女说:耆年(舍利弗——引者注)的解脱也无终始。

posted @ 2007-03-29 12:25 MicroYang 阅读(305) | 评论 (0)编辑 收藏
  2007年3月28日

    今天终于离职了,下定决心好久了,出门的那一刻,没有回头,也许是来得太突然,总有种莫名的滋味。但是这样的结局不正是我想要的吗?一切都抛在了脑后。走在软件园的小道上,桃花在微风中摇曳着微笑,垂柳在镜面里怜惜着自己,湖边的美女石像微笑的向我招手,湖面微波荡漾,也许这正是暗送秋波的来历!呵呵 :) 值得驻足吗?摇摇头,继续前进,因为我的眼睛告诉我:春天才刚刚开始!

posted @ 2007-03-28 19:19 MicroYang 阅读(282) | 评论 (1)编辑 收藏
仅列出标题  
<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(1)

随笔档案

Friend

  • Catherine
  • 深海羚羊
  • 似雨打芭蕉,似风吹梧桐叶,带着一丝冰冷,也带着一丝清新------冰柔语丝

搜索

  •  

最新评论

阅读排行榜

评论排行榜