首页
社区
课程
招聘
未解决 多线程不稳定解决办法
发表于: 2019-4-2 18:07 5138

未解决 多线程不稳定解决办法

2019-4-2 18:07
5138

最近接了个游戏的辅助制作,作者要求用易语言写。

外挂制作好了,但是非常不稳定,不定时闪退,错误报告。搞得我钱拿不到。

后来我怀疑是易语言对多线程支持不好,我又换VC写了个测试,结果出现同样问题。

这时我开始怀疑人生了,是不是该退出这个坑了。

DLL EXE都试了,经过我认真排查,100%确保已过游戏检测保护。

游戏采用NP盾保护和TMD壳进行保护,一款很老的韩国保护盾NP,直接JMP跳过保护盾,

TMD壳只是检测程序是否被调试和防止被OpenProcess。这些我都处理好了。

绑定主线程CALL,绑定主线程发包CALL,线程通行证什么都做到了极致,还是会出问题。

而且这个游戏绑定主线程CALL 不行,执行就出错闪退。

于是我想到了游戏主线程既然不能执行CALL,那他应该是消息队列执行CALL。于是又换成消息队列里执行CALL。。。。。结果一样


实属无奈!!  后来我回忆以前在公司  开发的一个多线程操作数据库的案例。程序开发好了,已投入使用,是在WIN8上使用。问题和这个一样。

后来公司里的某个大神,悄悄告诉我叫我把CPU调成单核试试。结果错误率得到很大改善。大神也没说什么原理。好酒好菜他只告诉我他做多线程都要关闭多核心。原理他也不懂,别人教他的。。。。。纳闷


后来我在辅助里调用API SetThreadAffinityMask(hThread0, 0x00000001); 

把CPU调成单核心,只用CPU0      无论的VC或易语言 都确实解决了问题。


小弟不才,实在搞不懂这是什么原因,什么原理,什么问题。


虽然问题解决了,但是还是希望得到大神指导一下


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (18)
雪    币: 6673
活跃值: (4152)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
666666
最后于 2019-4-2 18:32 被zhatian编辑 ,原因:
2019-4-2 18:28
0
雪    币: 5
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
只用一个CPU执行还算多线程?
2019-4-2 19:16
0
雪    币: 182
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
晚风a 只用一个CPU执行还算多线程?
还是多线程啊,只是指定在一个CPU上执行。 如果游戏单开没什么影响的,如果是多开的话就有点鸡肋了。目前没办法解决错误的问题,只能这样
2019-4-2 19:33
0
雪    币: 182
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
晚风a 只用一个CPU执行还算多线程?
还是多线程啊,只是指定在一个CPU上执行。 如果游戏单开没什么影响的,如果是多开的话就有点鸡肋了。目前没办法解决错误的问题,只能这样
最后于 2019-4-2 19:34 被longyaohua编辑 ,原因:
2019-4-2 19:34
0
雪    币: 2324
活跃值: (5063)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
同一个线程一前一后 都是游戏自己执行的 我改我自己的算是全局变量吧··改完后面看到的还是没改的值······这2段代码间执行间隔很短
2019-4-2 21:54
0
雪    币: 14641
活跃值: (17734)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
7
只是一个猜想,用同一个游戏辅助在多核多开时用的是同一个线程锁,就导致了图中情况的发生
虽然图里只是说会浪费线程2的时间,不知道这是不是导致整个程序崩溃的原因,对于此种情况的解决办法也是我的一个猜想,就是在多开的时候使用不同的线程锁,看看是否能解决多核多线程崩溃的问题(图片来源
2019-4-3 09:11
0
雪    币: 223
活跃值: (222)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
楼主建议你去看看线程安全,看完了你就会明白为什么你写的程序多线程会发生这种问题.那种改单核心的是治标不治本的方法,主要还是你的程序运行逻辑问题,没做到线程安全导致的.
2019-4-3 11:49
0
雪    币: 25
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
楼上说的有理
2019-4-3 12:12
0
雪    币: 182
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
chenteng 楼主建议你去看看线程安全,看完了你就会明白为什么你写的程序多线程会发生这种问题.那种改单核心的是治标不治本的方法,主要还是你的程序运行逻辑问题,没做到线程安全导致的.
谢谢你的帮助!最近在忙于其他事情,忘记看帖了
线程安全我看过,之前为了搞清楚这个问题,我特意用其他编译器写了同样多线程的简单寻怪打怪功能,同样崩溃,后来干脆不要多线程改成一个单线程死循环,还是一样崩溃。
我无法解释这现象,这是一款老游戏,05年开服的,当时的电脑应该大多也是单核CPU吧
到目前为止也没解决这问题
2019-5-13 08:06
0
雪    币: 15010
活跃值: (6218)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
你每个线程都干了些什么?进入关键区应该加锁?
2019-5-13 08:28
0
雪    币: 328
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
根据崩溃的地方进行排查,瞎猫碰耗子的找方法解决问题得看运气了。
哪里崩溃的就分析什么地方才是王道。
2019-5-13 08:49
0
雪    币: 15010
活跃值: (6218)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
多核CPU多线程有可能是并行执行(只有线程数大于核数才分时执行),因此进入核心代码应该加锁,例如同时写内存、写文件、写数据库等。
单核cpu多线程是分时执行。例如某线程写内存那么另外的线程一定在挂起状态。
最后于 2019-5-13 11:16 被tDasm编辑 ,原因:
2019-5-13 11:15
0
雪    币: 182
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
chenteng 楼主建议你去看看线程安全,看完了你就会明白为什么你写的程序多线程会发生这种问题.那种改单核心的是治标不治本的方法,主要还是你的程序运行逻辑问题,没做到线程安全导致的.
非常感谢大家指点,受益匪浅!
目前无法排查出问题所在,OD跟踪退出是在调用CALL上崩溃的,我无数次检查了函数调用,参数120%没有错误。
无论是多核多线程,还是多核单线程都崩,而且不止在同一个CALL崩,理论上所有调用的CALL都有可能崩。
游戏崩了辅助程序正常

我最后想问问,这是不是因为游戏是05年上架的,当时基本都是单核CPU,所以游戏对多核处理的不太完善?

必须改成单核CPU来调试或者说是 改成单核CPU才能够正常运行
有没有这样的一个说法?
2019-5-14 17:33
0
雪    币: 75
活跃值: (798)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
15
崩溃问题,从崩溃处一步一步回溯分析!!!!!!!!!!!!!!!!
一步一步回溯分析!!!!!
一步一步回溯分析!!!!!
一步一步回溯分析!!!!!
一步一步回溯分析!!!!!
其他都没用
2019-5-14 18:03
0
雪    币: 182
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
tDasm 多核CPU多线程有可能是并行执行(只有线程数大于核数才分时执行),因此进入核心代码应该加锁,例如同时写内存、写文件、写数据库等。单核cpu多线程是分时执行。例如某线程写内存那么另外的线程一定在挂起状态 ...
我似乎理解了你的教导,非常感谢!回去我再排查   

非常感谢大家的帮助  真的非常感谢!
2019-5-15 12:48
0
雪    币: 15010
活跃值: (6218)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
longyaohua 非常感谢大家指点,受益匪浅! 目前无法排查出问题所在,OD跟踪退出是在调用CALL上崩溃的,我无数次检查了函数调用,参数120%没有错误。 无论是多核多线程,还是多核单线程都崩,而且不止在同一个C ...
没有这种说法。
问题是你不注入,程序一点问题都没有。你一注入就出问题,那还不是你辅助程序的问题?
既然是调用call出问题,你先把你写的每个call什么都不做直接返回,看是否出问题?
最后于 2019-5-15 14:54 被tDasm编辑 ,原因:
2019-5-15 14:48
0
雪    币: 3725
活跃值: (629)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
18
遇到过同样的问题, 线程里面有堆栈校验, 会拿ESP去和0xFFFFFFFF进行运算. 弃用线程, 用时钟解决了这个问题.
主线程和其他线程, 毕竟一个亲生的一个是抱养的.
2019-5-15 15:02
0
雪    币: 182
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
逻辑错误 遇到过同样的问题, 线程里面有堆栈校验, 会拿ESP去和0xFFFFFFFF进行运算. 弃用线程, 用时钟解决了这个问题. 主线程和其他线程, 毕竟一个亲生的一个是抱养的.
我用时钟也崩
2019-6-5 18:16
0
游客
登录 | 注册 方可回帖
返回
//