帮我处理下栈平衡问题

RLib 2012-03-11 04:02:26
我得回校了, 大家帮忙, 分数不是问题.



#define RLIB_EnableException
//#undef RLIB_EnableException
//是否启用自定义异常处理模型

#ifdef RLIB_EnableException
#pragma runtime_checks("s", off) //禁止检查Esp
#define RLIB_Try(handler0,label0) void *handler0;__asm mov handler0, offset label0;
#define RLIB_Catch(label1) label1:
#define RLIB_Next(label2) goto label2;
#define RLIB_Finally(label3) label3:
#define RLIB_Throw(handler1) RLIB_Throw_Inline(handler1);return;
inline void RLIB_Throw_Inline(void *phandler)
{
__asm
{
mov eax, phandler
mov [ebp + 4], eax
//leave
//ret
}
}
#endif // RLIB_EnableException



void *ExceptionHandler;
void ThrowException(void *)
{
RLIB_Throw(ExceptionHandler);
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
{
RLIB_Try(Handler, OnException)
ExceptionHandler = Handler;//保存OnException地址到全局
{
ThrowException(NULL);
RLIB_Next(EndException)
}
RLIB_Catch(OnException)
{
//__asm { add esp, 4h } //How to do?
ShowMsg(T("异常被捕捉"));
goto exit__;
}
RLIB_Finally(EndException)
{
ShowMsg(T("异常未被捕捉或未触发异常"));
}
exit__:
return 0;//这里不正常, 无法正常返回
}
...全文
170 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
RLib 2012-03-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lactoferrin 的回复:]

http://www.programmingunlimited.net/siteexec/content.cgi?page=mingw-seh

如果不想用fs:[0],可以用vectored exception handler,用tls保存最近的异常记录
[/Quote]

本来想用ebp来恢复esp,但发现有许多问题,比如必须考虑多线程等,所以暂时得放放了
oldm4n 2012-03-11
  • 打赏
  • 举报
回复
楼上说的 SEH 值得一看
另外你说的栈平衡,下面的代码只是特例

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
{
int _stack_diff;
__asm mov _stack_diff, ebp;
__asm sub _stack_diff, esp;

RLIB_Try(Handler, OnException)
ExceptionHandler = Handler;//±£´æOnExceptionµØÖ·µ½È«¾Ö
{
ThrowException(NULL);
RLIB_Next(EndException)
}
RLIB_Catch(OnException)
{
//__asm { add esp, 4h } //How to do?
ShowMsg(_T("Òì³£±»²¶×½"));

__asm sub esp, 4h; // for int _stack_diff;

goto exit__;
}
RLIB_Finally(EndException)
{
ShowMsg(_T("Ò쳣δ±»²¶×½»òδ´¥·¢Òì³£"));

__asm mov esp, ebp;
__asm sub esp, _stack_diff;
}
exit__:
return 0;//ÕâÀï²»Õý³£, ÎÞ·¨Õý³£·µ»Ø
}
Lactoferrin 2012-03-11
  • 打赏
  • 举报
回复
http://www.programmingunlimited.net/siteexec/content.cgi?page=mingw-seh

如果不想用fs:[0],可以用vectored exception handler,用tls保存最近的异常记录
RLib 2012-03-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xiaohuh421 的回复:]

CSDN中估计比你懂得多的人都没几个,或者懂的人基本不来看什么帖子.
[/Quote]

这个不是什么难题,但没接触过的就有些麻烦了
xiaohuh421 2012-03-11
  • 打赏
  • 举报
回复
CSDN中估计比你懂得多的人都没几个,或者懂的人基本不来看什么帖子.
RLib 2012-03-11
  • 打赏
  • 举报
回复
还有就是多层函数调用时RLIB_Throw的堆栈不平衡问题, 深n层的函数调用可能一下返回到了第n-x层, 不知道如何处理才好.

我只是想实现简易的try、catch模型, 先帮忙解决主贴的问题就行了, 上面的函数嵌套问题可以暂时不考虑。
RLib 2012-03-11
  • 打赏
  • 举报
回复

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧