VS编译选项Debug与Release的区别

这段代码为什么使用Release模式编译时和Debug不一样,Debug编译运行不会奔溃,Release会奔溃:
#include
#include
int main(){
CONTEXT* contex;
EXCEPTION_RECORD* exception;
__asm{
call seh
mov ecx,dword ptr ss:[esp+0xC]
mov contex,ecx
mov ecx,dword ptr ss:[esp+0x4]
mov exception,ecx
}

if (exception->ExceptionCode==EXCEPTION_BREAKPOINT)
{
contex->Eip+=1;
printf("发现一个int3断点\n");
__asm{
xor eax,eax
retn
}

}
printf("异常不是我触发的\n");
__asm{
    mov eax,1
    retn

seh:
push dword ptr fs:[0]
mov dword ptr fs:[0],esp
}

__asm{
    int 3
}
system("pause");
return 0; 

}

两种模式还是有区别的,debug模式下有调试信息,内存的小范围越界有时不会表现出来;但是 release 就会容易表现出来。

debug模式和release区别在于,连接的C库不一样(如果动态编译,debug是msvcr…d,release是msvcr…),某些配置不一样,比如一些库的头文件中通过#ifdef判断是什么模式对代码进行修改,生成的代码不一样,比如release是实参和局部变量该多少长度就多少长度,而debug会增长从而允许小范围溢出

调试信息你是看不到的,但是调试过程中你一直在用。此情况下,有一部分内存存储着此类信息,所以有时小范围的越界可能是覆盖了调试信息。但是发布版本就可能引起错误了!