2 a1051123 a1051123 于 2016.02.07 15:17 提问

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; 

}

3个回答

hopease
hopease   2016.02.07 16:02

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

a1051123
a1051123 什么叫调试信息,我用OD打开生成的exe,代码都一样,就是执行结果不一样
接近 2 年之前 回复
zuishikonghuan
zuishikonghuan   2016.02.07 17:49

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

91program
91program   Ds   Rxr 2016.02.07 22:18

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!