存档

文章标签 ‘异常’

C++中的异常与栈展开

2014年2月16日 3 条评论

在《More Effective C++》一书中提到:
两种情况下destructor会被调用。第一种情况是当对象在正常状态下被销毁,也就是当它离开了它的生存空间(scope)或是被明确的删除;第二种情况是当对象被exception处理机制——也就是exception传播过程中的stack-unwinding(栈展开)机制——销毁。
那什么是栈展开(stack-unwinding)机制呢?在C++异常机制中,代码控制流会从throw语句跳转到第一个可以处理这种异常的catch语句的地方,在达到这[......]

继续阅读

调试器也有MagicNumer——从一个奇葩的错误说起

2013年3月16日 17 条评论

最近太忙,博客也好久没有打理了,主要是没有东西可写,呵呵~
写代码的时候,在delete的时候遇到一个错误,提示“T.exe 中的 0x002a1614 处未处理的异常: 0xC0000005: 读取位置 0xfeeefeee 时发生访问冲突”,立刻就被其中的0xFEEEFEEE吸引住了,显然,这样的地址在用户空间(User Space)是不可能用到的,刚好前不久看到一条微博说调试器也有Magic Number,利用16进制构造出一些很有意思的数据,于是马上Google了一下0xFEEEFEEE[......]

继续阅读

What is a First Chance Exception(什么是第一轮异常)

2011年10月20日 没有评论

当你正在调试程序的时候,你是否曾经看到过消息窗口输出关于“First Chance Exception”(第一轮异常)的信息?也许有人会问,“什么是第一轮异常?”、“出现第一轮异常的提示意味着代码有问题吗?”
什么是第一轮异常?
(1)当一个程序被调试的时候,如果有异常发生调试器会得到通知,这个时候,被调试的应用程序将会被挂起并且调试器决定如何来处理这个异常。当一个异常第一次经过这种机制就是所谓的“第一轮异常”。根据调试器的设置,调试器可能会忽略这个异常并让程序继续执行,或者保持被调试程序的挂起[......]

继续阅读

分类: 逆向调试 标签: , ,

在构造函数抛出异常后析构函数将不再被调用

2011年5月29日 7 条评论

我发现要从构造函数中将错误信息传递给类的使用者有一个很简便的方法,那就是抛出异常,这样就可以直接传递字符串之类的信息了。如果是从一个普通的函数传回错误信息的话,以前往往选择返回一个错误代码,然后定义一个字符串二维数组,用相应的错误代号来取得错误信息。
但是如果构造函数要是抛出了异常,这个类的析构函数将不会被调用。如果不知道这一点,那么在构造函数中抛出异常就很危险了。析构函数不被调用,意味着清理工作不会被执行,会导致内存泄露、资源泄露等,这会给我们的产品带来很差的用户体验。
还是先来测试一下吧,证[......]

继续阅读

Windows SEH汇编版

2011年5月17日 没有评论

SEH,即Structured Exception Handling,中文为结构化异常处理。是Windows操作系统提供给程序设计者的强有力的处理程序错误或异常的武器。Ring3下fs:[0]指向TEB(Thread Environment Block)结构,打开WinDbg,查看_TEB结构:

nt!_TEB
+0×000 NtTib : _NT_TIB
+0x01c EnvironmentPointer : Ptr32 Void
+0×020 Cli[......]

继续阅读

分类: Win32 ASM 标签: , , ,