IT老混混
2016-02-07 07:17
采纳率: 60%
浏览 2.9k

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 2016-02-07 08:02

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

    评论
    解决 无用
    打赏 举报
  • zuishikonghuan 2016-02-07 09:49

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

    评论
    解决 无用
    打赏 举报
  • 91program 2016-02-07 14:18

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

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题