找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
楼主: mdyblog

[更新376#2825]PECMD2012.1.80.13_Win32_64.多窗口多线程.裸机系统2.3.3.1+18M酷M...

   火... [复制链接]
发表于 2013-4-12 22:43:41 | 显示全部楼层
mdyblog 发表于 2013-4-12 21:19
已改。
可以分成子项**0:数字N, 1清默认值 2删所有值 4删所有子项。可以多个**0:N,数字可合并(如5)。 ...

这样就比 reg delete 强了,也更灵活了。
回复

使用道具 举报

 楼主| 发表于 2013-4-12 23:08:16 | 显示全部楼层
本帖最后由 mdyblog 于 2013-4-12 23:32 编辑
2010qaqz111 发表于 2013-4-12 22:39
LOGS 输出是命令运行完之后才输出到日志的吧,没有文件名行号函数名辅助定位看起来实在太吃力了,尤其是嵌套 ...


要输出命令结果,只能等到执行完毕再打印LOG。
适可而止吧。毕竟 LOGS不是关键。别花太多的精力。
要做完善,得单独做一个debuger。

要行号文件名 函数名 ,可以
插入 SET &=DEBUG 行号 文件名 函数名   信息 。。。

SET &=DEBUG  10  信息 1
.。。。
SET &=DEBUG  20  信息 2
.。。。
SET &=DEBUG  26  信息 3


多线程LOGS。可以写个脚本,根据线程号坼成一个一个的小LOG

》》还维护有一个变量层级的状态量
不用。 C++些的,不用, C++代劳了。
回复

使用道具 举报

发表于 2013-4-12 23:18:48 | 显示全部楼层
mdyblog 发表于 2013-4-12 23:08
要输出命令结果,只能等到执行完毕再打印LOG。
适可而止吧。毕竟 LOGS不是关键。别花太多的精力。
要做 ...

好的,我另外想办法查错吧。扯到多线的东西就是恼火,调试查错太麻烦了。
回复

使用道具 举报

发表于 2013-4-12 23:38:51 | 显示全部楼层
本帖最后由 2010qaqz111 于 2013-4-12 23:40 编辑
mdyblog 发表于 2013-4-12 23:08
SET &=DEBUG  10  信息 1
.。。。
SET &=DEBUG  20  信息 2
.。。。
SET &=DEBUG  26  信息 3

哦,这是手动插入信息到LOG,这个可以有,试试。


拆线程脚本倒是不用那么麻烦,因为有线程号,用 excel 的筛选就可以析出某个特定线程的 LOG 了,配合手动插入信息应该会好点。
回复

使用道具 举报

 楼主| 发表于 2013-4-12 23:40:10 | 显示全部楼层
本帖最后由 mdyblog 于 2013-4-12 23:41 编辑
2010qaqz111 发表于 2013-4-12 23:18
好的,我另外想办法查错吧。扯到多线的东西就是恼火,调试查错太麻烦了。


多线程调试想来是件麻烦事。 多线程程序保证正确也是麻烦事。 C、C++也是如此。
多线程 少出错的一法是:多用SENDMSG。
子线程 只用(读或写)自己专属的变量。
凡是 涉及共享的变量, 都SENDMSG到主线程, 数据交互都集中在 主线程。 这样利用消息队列自己的固有的同步机制, 会少出很多错误。
这样不用单独考虑线程同步。


SET-swap  效率很高。 不管多大的变量, 瞬间完成交换。
回复

使用道具 举报

发表于 2013-4-12 23:45:16 | 显示全部楼层
本帖最后由 2010qaqz111 于 2013-4-12 23:47 编辑
mdyblog 发表于 2013-4-12 23:40
多线程调试想来是件麻烦事。 多线程程序保证正确也是麻烦事。 C、C++也是如此。
多线程 少出错的一法是: ...


目前遇到的多线引起的不确定发生错误都不是共享变量引起的,因为我只是用多线开独立的任务,有等待我都是用文件系统建立空文件同步这种方式来做的,间隔等待查询的尺度也很大(WAIT 500),这种方式在运行完之后会在磁盘上留下痕迹,可以做一些辅助的判断。

现在遇到的两个疑似的问题是,主线早已设置到的PE变量,在子线程有时候会解释成空串;另一个就是 THREAD* 开出的线程根本就不起来。
回复

使用道具 举报

 楼主| 发表于 2013-4-12 23:49:13 | 显示全部楼层
2010qaqz111 发表于 2013-4-12 23:38
哦,这是手动插入信息到LOG,这个可以有,试试。

可以写一个脚本, 在WCS脚本中自动加入
SET &=AUTO_DEBUG  行号  文件名
这样LOGS中就有行号信息了。
完毕, 再自动去掉这些行。
回复

使用道具 举报

发表于 2013-4-12 23:54:44 | 显示全部楼层
mdyblog 发表于 2013-4-12 23:49
可以写一个脚本, 在WCS脚本中自动加入
SET &=AUTO_DEBUG  行号  文件名
这样LOGS中就有行号信息了。  ...

隔行插一条?算了还是手动吧,在关键的地方放一些就是了,自动的遇到带{}拆行的 FIND IFEX 和 \ 并行的语句貌似会出问题。
回复

使用道具 举报

 楼主| 发表于 2013-4-12 23:57:35 | 显示全部楼层
本帖最后由 mdyblog 于 2013-4-13 00:02 编辑
2010qaqz111 发表于 2013-4-12 23:45
目前遇到的多线引起的不确定发生错误都不是共享变量引起的,因为我只是用多线开独立的任务,有等待我都 ...


》》主线早已设置到的PE变量,在子线程有时候会解释成空串;
是不是 主线程回头又 重写了改变量,所以为空了。
PECMD2012 是C++严格封装的,(自己)不用什么全局变量。 一般不会出这种问题的。


》》另一个就是 THREAD* 开出的线程根本就不起来
这个不知道。 只有找到一个实例, 我才能看看怎么回事。


可以考虑LOGS 加**2开关, 这样LOGS打2次。 一次是执行前,用<命令>表示。 一次是现在的 [命令]错误码。
回复

使用道具 举报

发表于 2013-4-13 00:07:41 | 显示全部楼层
mdyblog 发表于 2013-4-12 23:57
》》主线早已设置到的PE变量,在子线程有时候会解释成空串;
是不是 主线程回头又 重写了改变量,所以 ...

应该可以确定不是重复写了主线的变量,因为那个变量是用来保存 ud 区的硬盘号的,在一个进程中只会初始化一次,之后只是读,不会写,所以觉得很奇怪。

THREAD* 的线程不起来很大可能是新线程启动输出的LOG隔得太远,不在 THREAD* 的附近,所以不好判断。只有看再遇到这问题仔细查一下日志了。
回复

使用道具 举报

 楼主| 发表于 2013-4-13 00:12:33 | 显示全部楼层
2010qaqz111 发表于 2013-4-13 00:07
应该可以确定不是重复写了主线的变量,因为那个变量是用来保存 ud 区的硬盘号的,在一个进程中只会初始化 ...

>>应该可以确定不是重复写了主线的变量,因为那个变量是用来保存 ud 区的硬盘号的,在一个进程中只会初始化一次,之后只是读,不会写,所以觉得很奇怪。
那只有 缩短点, 30行以内,且可以重复出现;传上了 试试。
回复

使用道具 举报

发表于 2013-4-13 00:19:50 | 显示全部楼层
mdyblog 发表于 2013-4-13 00:12
>>应该可以确定不是重复写了主线的变量,因为那个变量是用来保存 ud 区的硬盘号的,在一个进程中只会初始 ...

就是无法确定重现条件,每次重启有时正常,有些时候又不行,就算出错也不一定是加载同一个文件的时候出错,所以很让人抓狂。而且这问题发生的频率也不高,重启又花时间,基本可以归为疑难杂症了,等时间充裕的时候来慢慢试。
回复

使用道具 举报

发表于 2013-4-13 00:43:13 | 显示全部楼层
clonecd 发表于 2013-4-13 00:28
以前我跑多线程也调试了很久,后来我干脆改成两条线程了,3、4条线程很让人抓狂的。

就是啊,要不是 pe 启动用多线能明显快很多(单核单线老机能接近10秒,总启动过程1分钟左右,赛扬440M 1G内存的机器),实在很有吸引力的话,还是稳定压倒一切的。
回复

使用道具 举报

 楼主| 发表于 2013-4-13 08:10:33 | 显示全部楼层
本帖最后由 mdyblog 于 2013-4-13 09:34 编辑
2010qaqz111 发表于 2013-4-13 00:43
就是啊,要不是 pe 启动用多线能明显快很多(单核单线老机能接近10秒,总启动过程1分钟左右,赛扬440M 1G ...


可以用排除法。
先不用多线程。
THREAD* 改为CALL 。
没事,就用其中一半 作为 一个线程。
直到 最终为正常的多线程。
这样2分法, 没几次就能定位到问题代码。

还有少用 CALL $ , 免得 干扰。
CALL $则另开一个PECMD:
EXEC  =%MyName%  CALL $....

2个线程应该没问题, 我还以为几百个啦。 我试个上百个的, 没问题。

THREAD* 。。。。
最好这样写:
THREAD*$  ...
这样 变量都会换成其值。 参见 PECMD补充说明.doc
回复

使用道具 举报

发表于 2013-4-13 08:21:19 | 显示全部楼层
本帖最后由 2010qaqz111 于 2013-4-13 09:35 编辑
mdyblog 发表于 2013-4-13 08:10
可以用排除法。
先不用多线程。
THREAD* 改为CALL 。


CALL $?是注册 dll 的?基本没用这个来着,调用 dll 函数的用法也没有,只有一个地方注册 Open++ 的 dll 用了下,还是在外置程序里面,跟启动的几个关键过程没关系。

改成 CALL 找问题,可问题是用 THREAD* 的时候出问题就只是 10 次大概碰到 1 次左右,改成 CALL 的话就更不容易遇到了,囧
回复

使用道具 举报

发表于 2013-4-13 09:28:35 | 显示全部楼层
本帖最后由 2010qaqz111 于 2013-4-13 09:34 编辑

刚刚遇到这样的情况:

1008        12788798187        [GETF# 0,0xb037S#547,&&FTAR]        <1>        :函数不正确。
1008        12788994655        [ENVI-ret &MBIN=0xFFFFFFFF]        <0>        :操作成功完成。
1008        12789116836        [ENVI-ret &BLEN=547]        <0>        :操作成功完成。

1008        12789988236        [ENTER:**mem]               
1008        12796277173        [0xFFFFFFFF]        <2>        :系统找不到指定的文件。
1008        12796446272        [LEAVE:**mem]               
1008        12802225466        [LOAD **mem &MBIN ]        <0>        :操作成功完成。

GETF# 出错了,然后 LOAD **mem 直接退出了。
GETF# 在什么情况下会出错然后在变量里返回 -1?


这些代码是在新线程中运行的,新线程一开始的部分读一个在主线程设置的PE变量失败返回了空,后面读文件遇到了这个错误。
回复

使用道具 举报

 楼主| 发表于 2013-4-13 09:41:06 | 显示全部楼层
本帖最后由 mdyblog 于 2013-4-13 09:45 编辑
2010qaqz111 发表于 2013-4-13 09:28
刚刚遇到这样的情况:

1008        12788798187        [GETF# 0,0xb037S#547,&&FTAR]                :函数不正确。


>>1008        12788798187        [GETF# 0,0xb037S#547,&&FTAR]        <1>        :函数不正确。
GETF# 第一个参数不对。
是不是应该为 \\.\PhysicalDrive0

你怎么还在用旧版 PECMD ??!!  改了半天, 你没用啊?
回复

使用道具 举报

发表于 2013-4-13 10:01:21 | 显示全部楼层
最新版的啊,410-02的
回复

使用道具 举报

发表于 2013-4-13 10:03:01 | 显示全部楼层
mdyblog 发表于 2013-4-13 09:41
>>1008        12788798187        [GETF# 0,0xb037S#547,&&FTAR]                :函数不正确。
GETF ...

第一个参数也应该是从主线程读来的,怎么只剩一个0了,我再查查。
回复

使用道具 举报

发表于 2013-4-13 10:24:58 | 显示全部楼层
本帖最后由 2010qaqz111 于 2013-4-13 10:26 编辑

1008        12721022534        [EXEC* &UDINFO=!FBINST --list]        <0>        :操作成功完成。
1008        12721208739        [RSTR &P=1,(hd0): 625142448 (298g) *]        <0>        :操作成功完成。
1008        12721391522        [LPOS &P=:,,(hd0): 625142448 (298g) *]        <0>        :操作成功完成。
1008        12723667034        [CALC #&P=6-1]        <0>        :操作成功完成。
1008        12724539900        [LSTR &UDHD=5,(hd0)]        <0>        :操作成功完成。
1008        12782479927        [EXEC* &&FBINFO=!FBINST (hd0) info]        <0>        :操作成功完成。
1008        12785635147        [LPOS*** &P="PE/SCRIPTS/DRV.WCS",,version: 1.6               
1008        12786081354        [SED &UDHDW=0,[^0-9],,(hd0)]        <0>        :操作成功完成。<-- 这一行是把 (hd0) 取出其中的 0
1008        12786177145        [SET UDHDW=\\.\PhysicalDrive0]        <0>        :操作成功完成。 <-- 这一行是设置读取目标的,在 0 前面加上 \\.\PhysicalDrive
1008        12786392673        [SET UDINFO=version: 1.6               
1008        12786500193        [IFEX $0!=182,]        <0>        :操作成功完成。
1008        12786541246        [FIND $*=*,]        <0>        :操作成功完成。
1008        12786578390        [FORX *NL &UDINFO,&UDHD,]        <0>        :操作成功完成。
1008        12786653165        [FIND $\\.\PhysicalDrive0=,]        <0>        :操作成功完成。
1008        12786722564        [ENVI-ret &P=182]        <0>        :操作成功完成。
1008        12786765083        [UDFIND "PE/SCRIPTS/DRV.WCS" &P]        <0>        :操作成功完成。
1008        12786858430        [IFEX $0=182,TEAM {ENVI-ret3 &BLEN=-1|EXIT _SUB}]        <0>        :操作成功完成。
1008        12786898994        [FIND $=,]        <0>        :操作成功完成。
1008        12787124297        [IFEX $182=-1,LPOS*** &&P="PE/SCRIPTS/DRV.WCS",,version: 1.6               
1008        12787259186        [IFEX $0=182,TEAM {ENVI-ret2 &BLEN=-1|EXIT _SUB}]        <0>        :操作成功完成。
1008        12787394075        [CALC #&&SECT=1+182]        <0>        :操作成功完成。
1008        12787472760        [CALC #&&FLEN=2+182]        <0>        :操作成功完成。
1008        12787854455        [MSTR &SECT=<183>version: 1.6               
1008        12788193143        [MSTR &FLEN=<184>version: 1.6               
1008        12788798187        [GETF# 0,0xb037S#547,&&FTAR]        <1>        :函数不正确。

最后一行的代码是 GETF# %&UDHDW%,%&SECT%S#%&FLEN%,&&FTAR,到这里 UDHDW 就只剩个 0 了,原因不明。

                SED &UDHDW=0,[^0-9],,%&UDHD%
                SET UDHDW=\\.\PhysicalDrive%&UDHDW%

前面的这2行是在同一个层级中,UDHDW 是文件级定义的 PE 变量。

这没头没尾的也不知道看得明白不。
回复

使用道具 举报

 楼主| 发表于 2013-4-13 10:26:37 | 显示全部楼层
2010qaqz111 发表于 2013-4-13 10:01
最新版的啊,410-02的

>>>>1008        12788798187
不是, 已经很老了。
新的版本时间都有3为小数。如:
》》》7956        8333347438515.263        [THREAD*$ TEST1 192.168.1.109   109]
回复

使用道具 举报

发表于 2013-4-13 10:28:52 | 显示全部楼层
本帖最后由 2010qaqz111 于 2013-4-13 10:37 编辑
mdyblog 发表于 2013-4-13 10:26
>>>>1008        12788798187
不是, 已经很老了。
新的版本时间都有3为小数。如:


哦,这个是从 excel 里copy出来的,excel 导入的时候把小数点干掉了。


984        12788307504.937        [SED &UDHDW=0,[^0-9],,(hd0)]        <0>        :操作成功完成。
984        12788395475.758        [SET UDHDW=\\.\PhysicalDrive0]        <0>        :操作成功完成。
1008        12788798186.628        [GETF# 0,0xb037S#547,&&FTAR]        <1>        :函数不正确。
984        12788845593.126        [SET UDINFO=version: 1.6

文本文件里那一行是这样的,excel 把小数部分收上去了。



┃    │格式│LOGS [**RAW=0/1] [**ON=0/1] [[*文件路径][,数值]]                                            ┃

**RAW 是执行前输出还是执行后?
回复

使用道具 举报

 楼主| 发表于 2013-4-13 10:34:56 | 显示全部楼层
本帖最后由 mdyblog 于 2013-4-13 10:36 编辑
2010qaqz111 发表于 2013-4-13 10:28
哦,这个是从 excel 里copy出来的,excel 导入的时候把小数点干掉了。


(同一个进程)多线程个数限制

32位不要超过100 个
64位最好不超过3500 个


下面是测试结果
多线程个数:
Win7X64---Win32程序: 108
   7956        8333347438515.263        [THREAD*$ TEST1 192.168.1.109   109]        <8>        :存储空间不足,无法处理此命令。

XP32: 117
   2880        2153003061025.792        [THREAD*$ TEST1 192.168.1.118   118]        <8>        :存储空间不足,无法处理此命令

Win7X64-Win64程序: >3500
回复

使用道具 举报

发表于 2013-4-13 10:39:06 | 显示全部楼层
本帖最后由 2010qaqz111 于 2013-4-13 10:40 编辑

没有那么多线程的,只有3个,LOG里也只有3个线程号,搜索LOG没有找到<8>。
回复

使用道具 举报

 楼主| 发表于 2013-4-13 10:40:44 | 显示全部楼层
本帖最后由 mdyblog 于 2013-4-13 10:43 编辑
2010qaqz111 发表于 2013-4-13 10:28
哦,这个是从 excel 里copy出来的,excel 导入的时候把小数点干掉了。


**RAW   还是执行后输出。
**RAW 就是不解释, 原样输出

ABC为123
MESS %ABC%
**RAW 则LOGS   [MESS %ABC%]
    否则LOGS   [MESS 123]
回复

使用道具 举报

 楼主| 发表于 2013-4-13 10:42:23 | 显示全部楼层
2010qaqz111 发表于 2013-4-13 10:39
没有那么多线程的,只有3个,LOG里也只有3个线程号,搜索LOG没有找到。


这是通告,以免有人开多了。 不是说你这个。 我知道你就开2个线程。
回复

使用道具 举报

 楼主| 发表于 2013-4-13 11:02:17 | 显示全部楼层
2010qaqz111 发表于 2013-4-13 10:24
1008        12721022534        [EXEC* &UDINFO=!FBINST --list]                :操作成功完成。
1008        12721208739        [RSTR &P=1,(hd0): ...

UDHDW 可以建一个 线程的私有拷贝
{
         SET-def     UDHDW=%&UDHDW%   //建立一个同名本级临时变量, 自动转为 线程私有变量, 屏蔽上级的变量。
         THREAD*$    .....  
}
这样  线程中的 UDHDW 就是私有的, 主线程和其他线程 不能修改。


如果不需要直接回传数据, 可以 直接 THREAD$  ...
不带*, 这样 所有P非全局PE变量(不带::的变量) 都自动转为 线程私有变量。
     此时还可以同个 ENVI    @@SENDMSG 来回传数据/线程同步。
回复

使用道具 举报

 楼主| 发表于 2013-4-13 11:37:00 | 显示全部楼层
2010qaqz111 发表于 2013-4-13 10:28
哦,这个是从 excel 里copy出来的,excel 导入的时候把小数点干掉了。

给你加了2个LOGS开关

**p[-]
**2[-]
**p为执行前打印;**2为前后都打印,后缀-为取消
回复

使用道具 举报

发表于 2013-4-13 11:39:06 | 显示全部楼层
SET &UDHDW
这样的写法如果是在新线程中执行是产生一个线程私有的变量覆盖主线同名吗?线程用 THREAD* 启动的。
回复

使用道具 举报

发表于 2013-4-13 11:40:16 | 显示全部楼层
本帖最后由 2010qaqz111 于 2013-4-13 12:12 编辑
mdyblog 发表于 2013-4-13 11:37
给你加了2个LOGS开关

**p[-]


谢谢,我试试看。出问题的地方好像有点眉目了。


**p 和 **2 对 EXEC --logs 开关有效吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1|闽公网安备35020302032614号 )

GMT+8, 2026-9-11 02:31

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表