标题:求助:服务器异常报错,如何终止报错进程
只看楼主
foxfans
Rank: 4
等 级:贵宾
威 望:11
帖 子:90
专家分:278
注 册:2021-10-23
得分:0 
对的,SEH, VEH类似,上面Dll采用 VEH+回调算出错误点的当前Eip地址(指针),通过当前EIP(32位),Hook计算该Eip指令所占用的长度(汇编指令长度)作为下一个忽略执行Eip起始点.

错误处理.rar (60.16 KB)

declare HookError in myErr.dll integer
HookError(1) &&开启后,要求主程序要写的很标准,一些小问题可能也会报出来(用来编译发布前的测试)写在load里面,一次加载即可

*!*模拟C5错误,正常情况主程序崩溃
FOR i=1 TO 15
SYS(1079,1)  &&通过HookError后,现在机会忽略处理,乘机"忽略"错误保存,再退出来查原因.
ENDFOR

*!* release
HookError(0)



[此贴子已经被作者于2022-1-27 17:57编辑过]

2022-01-27 16:12
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 31楼 foxfans
SYS(2600,0,1," ")
这句抛出的异常有点鬼异,VFP也会抛出。

也简单写个异常处理(未详细测试)

except.rar (13.64 KB)

程序代码:
#define MY_ERROR  0x401    && 自定义消息
DECLARE long AddException IN except long,long,long
DECLARE long RemoveException IN except
DECLARE long GetException IN except long
DECLARE long strlen IN msvcrt long
AddException(_screen.hWnd, MY_ERROR, 1)  && 0->直接忽略,1->提示选择
oErr = CREATEOBJECT("CError")
BINDEVENT(_screen.hWnd, MY_ERROR, oErr, "onError")
SYS(1079,1)
RemoveException()
CLEAR ALL
RETURN

DEFINE CLASS CError as Session
    PROCEDURE onError(hWnd,Msg,wParam,lParam)
        nCode = CTOBIN(SYS(2600,wParam,4),"4RS")
        pMsg = GetException(nCode)
        ? TRANSFORM(nCode,"@0"), SYS(2600,pMsg,strlen(pMsg))
        **QUIT
    ENDPROC
ENDDEFINE


[此贴子已经被作者于2022-1-28 21:59编辑过]

2022-01-28 21:57
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:54
帖 子:802
专家分:1914
注 册:2015-12-30
得分:0 
2022-01-29 07:48
schtg
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1355
专家分:2534
注 册:2012-2-29
得分:0 
高,学习啦,谢谢!
2022-01-29 08:29
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
修改一下
except.rar (13.68 KB)

程序代码:
#define MY_ERROR  0x401    && 自定义消息
DECLARE long AddException IN except long,long,long
DECLARE long RemoveException IN except
DECLARE long GetException IN except long
DECLARE long strlen IN msvcrt long
** AddException(hWnd, msg, Flags) 注册异常处理
** 其中:Flags,0->直接忽略,1->提示选择
**   Flags=0 时会注销异常处理,直接忽略返回。
**   再要处理异常,要重新调用AddException()注册异常处理
AddException(_screen.hWnd, MY_ERROR, 0)  && 0->直接忽略,1->提示选择
oErr = CREATEOBJECT("CError")
BINDEVENT(_screen.hWnd, MY_ERROR, oErr, "onError")
SYS(1079,1)
AddException(_screen.hWnd, MY_ERROR, 1)
SYS(2600,0,1," ")
RemoveException()
CLEAR ALL
RETURN

DEFINE CLASS CError as Session
    PROCEDURE onError(hWnd,Msg,wParam,lParam)
        nCode = CTOBIN(SYS(2600,wParam,4),"4RS")
        pMsg = GetException(nCode)
        ? TRANSFORM(nCode,"@0"), SYS(2600,pMsg,strlen(pMsg))
        **QUIT
    ENDPROC
ENDDEFINE



[此贴子已经被作者于2022-1-29 10:11编辑过]

2022-01-29 10:05
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:54
帖 子:802
专家分:1914
注 册:2015-12-30
得分:0 
回复 35楼 吹水佬
这是针对程序自身的异常处理吧?
2022-01-29 10:11
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用laowan001在2022-1-29 10:11:28的发言:

这是针对程序自身的异常处理吧?

捕捉异常,有些异常VFP捕捉不了,也许他可以。

[此贴子已经被作者于2022-1-29 10:15编辑过]

2022-01-29 10:14
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:54
帖 子:802
专家分:1914
注 册:2015-12-30
得分:0 
回复 37楼 吹水佬
对其他EXE的异常也能捕捉?
2022-01-29 11:04
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用laowan001在2022-1-29 11:04:03的发言:

对其他EXE的异常也能捕捉?

本示例DLL只在本进程应用。
如果要跨进程使用,要将DLL注入外部进程,这是另一个问题,也不清楚这样做有什么意义。
2022-01-29 11:15
foxfans
Rank: 4
等 级:贵宾
威 望:11
帖 子:90
专家分:278
注 册:2021-10-23
得分:0 
主要目的就是跳过忽略错误,方便查看错误和异常位置,且有机会介入保存。sys(2600,0...)空指针,可以手动让eip+1即可跳过,一直忽略也不是办法,所以可以直接计算当前eip的内码长度,eip+这个长度,就直接跳过整块代码段,不用一直忽略.

[此贴子已经被作者于2022-1-29 11:43编辑过]

2022-01-29 11:40



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-508227-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.124067 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved