1、IncrediBuild工具使用及设置 分类: 工具说明2011-06-20 11:56 663人阅读 评论(0) 收藏 举报 虽然现在计算机的运算速度不断提高, 但大型软件的编译速度仍然是个漫长的过程,我所在的项目, 软件大小约为200K行, 在VC6下的编译时间为3分钟(P4 1.8G, 512M), 在交叉编译时更慢, 提高编译速度将能够直接提高前期调测的效率. 本文将介绍提高编译速度的有效方法之一 - 分布式编译. 分布式编译的原理很简单, 就是将编译的整个工作量通过分布计算的方法分配到多个计算机上执行, 这样可以获得极大的效率提升. 由于分布式计算的技术相对成
2、熟, 现在可以见到的分布式编译软件也较多. 一般来说, 一个分布式编译软件不是一个编译器, 而是附着在某个编译器上的分布计算管理软件, 使得对于特定的编译器可以实现分布式编译. 常见的分布式编译器通常是对应于特定的C/C++编译器, 如Gcc, Visual C++, 因为这些编译器使用相当广泛且开放度高. 因而实现分布式编译的意义更大. 下面分别以Visual C++和Gcc为例说明两个典型的分布式编译软件: 1)IncrediBuild 这是一个对应Visual C++ 的分布式编译软件, 通过Visual C++强大的IDE扩展功能, 它有着非常
3、友好的界面, 可以将整个分布式编译过程直观的展现给用户, 并且它通过一个"虚拟机"的技术, 使能编译的参与者可以与编译发起者有着不同的系统配置(Windows操作系统版本, 库文件等), 甚至无需在参与者机器上安装Visual C++. IncrediBuild需要一个特定的计算机做仲裁者, 其他的所有计算机作为客户, 有了仲裁者的好处是, 可以有它来统一安排所有客户端所发起的编译请求, 一旦某个客户发起编译请求, 则仲裁者会根据其他客户的CPU空闲情况而安排分布式编译, 当多个客户同时发起编译请求时, 仲裁者会自动平衡分布计算负担,使得编译参与者不会占用过多的CPU.
4、在我们的项目中, 使用IncrediBuild的结果如下: 未使用: 3分钟 5客户: 40秒 10客户: 25秒 可见IncrediBuild对编译性能的巨大提升, 并且在取得如此性能提升的同时, 仲裁者和编译参与者的CPU占用率很低. 保持相当高的可用性, 这是很难得的. IncridiBuild的缺点是目前仅支持Visual C++ 6编译器和.Net编译器, 也仅适用于Windows平台. 适用范围相对较窄. 2)DistCC 这是一个GNU的分布式C++编译器, 适用于一切Gcc兼容的C++编译
5、器, DistCC也具有很好的跨平台特性, 支持Linux, XFree86, CygWin等平台. 使用范围相当广泛. DistCC和IncrediBuild的差别在与DistCC不使用仲裁者, 直接由客户端对其他客户端发起编译请求. 所以每个客户端都需要知道其他客户端的位置, 并且当多个客户发起编译请求时不易做平衡处理. 下面说一下怎样利用increbuild实现分布式编译 1.make文件夹里面的Gsm2.mak修改make工具的编译项为IncredBuild增加运行参数 #@echo tools/make.exe -fmake/comp.mak -r -R COMPONE
6、NT=$* ... $(strip $(COMPLOGDIR))/$*.log @if /I %OS% EQU WINDOWS_NT / (if /I $(BM_NEW) EQU TRUE / (XGConsole /command="tools/make.exe -fmake/comp.mak -k -r -R $(strip $(CMD_ARGU)) COMPONENT=$* > $(strip $(COMPLOGDIR))/$*.log 2>&1" /NOLOGO /profile="tools/XGConsole.xml") / else / (XGC
7、onsole /command="tools/make.exe -fmake/comp.mak -r -R $(strip $(CMD_ARGU)) COMPONENT=$* > $(strip $(COMPLOGDIR))/$*.log 2>&1" /NOLOGO /profile="tools/XGConsole.xml") / ) / else / (if /I $(BM_NEW) EQU TRUE / (tools/make.exe -fmake/comp.mak -k -r -R $(strip $(CMD_ARGU)) COMPONENT=$* > $(s
8、trip $(COMPLOGDIR))/$*.log) / else / (tools/make.exe -fmake/comp.mak -r -R $(strip $(CMD_ARGU)) COMPONENT=$* > $(strip $(COMPLOGDIR))/$*.log) / ) @type $(strip $(COMPLOGDIR))/$*.log >> $(LOG) @perl ./tools/chk_lib_err_warn.pl $(strip $(COMPLOGDIR))/$*.log 2.tools工具夹里面加入 XGConsole.xml
9、
内容为
10、ote="true" />
11、ol Filename="formelf" AllowRemote="false" />
12、 { if ($fullOpts eq "") { $fullOpts = "CMD_ARGU=-j$ENV{/"NUMBER_OF_PROCESSORS/"}"; } else { $fullOpts .= ",-j$ENV{/"NUMBER_OF_PROCESSORS/"}"; }
13、 } } 改为 if (($action eq "update") || ($action eq "remake") || ($action eq "new") || ($action eq "bm_new") || ($action eq "c,r") || ($action eq "c,u")) { if ($ENV{"NUMBER_OF_PROCESSORS"} >= 1) { if ($fullOpts eq "") { $ful
14、lOpts = "CMD_ARGU=-j$ENV{/"NUMBER_OF_PROCESSORS/"}"."0"; } else { $fullOpts .= ",-j$ENV{/"NUMBER_OF_PROCESSORS/"}"."0"; } } } $ENV{"NUMBER_OF_PROCESSORS"} = 10; //修改为你想要的进程数 4.把tools里面的make.exe换成多任务的文件
15、联合编译的功能引入分为下面几个要素: 1. 使能或禁止联合编译功能; 2. 检查XGC是否存在; 3. 定义可用的进程数; 4. 中间编译文件; 5. 编译命令; 1.1. 使能或禁止联合编译的参数设定 对于MTK平台,可以通过命令行方式参数“-disable_ib”,“-no_ib”或“-bm”。我们可以通过查看脚本make2.pl确认。 }elsif ($ARGV[0] =~ /-disable_ib/i) { $disable_ib = 1; }elsif ($ARGV[0] =~ /-no_ib/i) {
16、 $disable_ib = 1; } elsif ($ARGV[0] =~ /-bm/i) { $disable_ib = 1; } 确认联合编译环境 接着系统开始检查联合编译器以及系统是否支持联合编译,请看下面脚本的检查。首先,脚本执行命令“$exec_xgc_result = `XGConsole /NOLOGO /SILENT /NOWAIT tools//XGC_Test.xml 2>&1`;”,确认是否存在联合编译器。 my $no_of_proc=1; my $exec_xgc_result=99
17、9; # $exec_xgc_result = system("XGConsole /NOLOGO /SILENT tools//XGC_Test.xml /n"); $exec_xgc_result = `XGConsole /NOLOGO /SILENT /NOWAIT tools//XGC_Test.xml 2>&1`; if ("$exec_xgc_result" ne "") { $exec_xgc_result=99; # print "XGConsole not found"; } else { if (("$ENV{/"TERM/"}" eq
18、 "") && ("$ENV{/"USERDOMAIN/"}" eq "DOMAIN_MTK")) { $disable_ib = 1; print " WARNING: XGConsole is supported but it's NOT in telnet mode. TERM is not defined! /n"; } if ($disable_ib==0) { $exec_xgc_result=0; # print "XGConsole fou
19、nd";
} else
{
$exec_xgc_result=99;
}
}
其中,XGC_Test.xml是比较简单的。然后,通过环境变量确认OS是否支持联合编译。
20、e=999; #$exec_buildconsole = system("BuildConsole /n"); $exec_buildconsole = `BuildConsole 2>&1`; if ($exec_buildconsole =~ /IncrediBuild/) { if ( "$ENV{/"TERM/"}" eq "" ) { $disable_ib = 1; print " WARNING: BuildConsole
21、 is supported but it's NOT in telnet mode. TERM is not defined! /n"; } if ($disable_ib==0) { $exec_buildconsole=0; #print "/nBuildConsole found"; } else { $exec_buildconsole=99;
22、 } } else { $exec_buildconsole=99; #print "/nBuildConsole not found"; } if ( $exec_buildconsole==0 ) # support BuildConsole { system "perl tools//RunMsdev.pl"; $msdev = 'BuildConsole msdev'; } else # not support BuildConsole { $msdev = 'msdev'; } 1.3. 定义进程数 根据CP
23、U个数设定编译可创建的进程数,一般双核CPU的进程数设为4各基本均衡了。 if (($action eq "update") || ($action eq "remake") || ($action eq "new") || ($action eq "bm_new") || ($action eq "c,r") || ($action eq "c,u") || ($action eq "scan")) { if ($ENV{"NUMBER_OF_PROCESSORS"} > 1) { if ( $exec_xgc_result=
24、0 ) { $no_of_proc = $ENV{"NUMBER_OF_PROCESSORS"}*2; if ($fullOpts eq "") { $fullOpts = "CMD_ARGU=-j$no_of_proc"; } else { $fullOpts
25、 .= ",-j$no_of_proc"; } } else { if ($fullOpts eq "") { $fullOpts = "CMD_ARGU=-j$ENV{/"NUMBER_OF_PROCESSORS/"}"; } else { $fullOpts .= ",-j$ENV{/"NUMBER_OF_PROCESSORS/"}"; } } MTK还提供了通过“-o|-op|opt”来设定进程数。
26、 if ($fullOpts ne "") { # Fix build errors when "parallel jobs processing" fuction enabled by argument "-o|-op|-opt" in command line my @temp = @mOpts; @mOpts = (); foreach (@temp) { if ($_ =~ /^/s*(-j|--jobs)/) { $fullOpts .= ",$_"; }
27、else { push(@mOpts,$_); } } # End $fullOpts =~ s/"///"/g; $fullOpts = "/"$fullOpts/""; $fullOpts =~ s/,/ /g; $makeCmd .= " " . join(" ", @mOpts) . " $fullOpts "; } 1.4. 中间编译文件 中间编译文件intermed.mak包括了需要编译各个模块的依赖关系和编译方法。 1.5. 编译命令 (if /I $(BM_
28、NEW) EQU TRUE / (XGConsole /command="tools/make.exe -fmake/intermed.mak -k -r -R $(strip $(CMD_ARGU)) " /NOLOGO /profile="tools/XGConsole.xml" ) / else / (XGConsole /command="tools/make.exe -fmake/intermed.mak -r -R $(strip $(CMD_ARGU)) " /NOLOGO /profile="tools/XGConsole.xml" ) / ) /
29、
其中,XGConsole.xml规定了各种编译工具的是否支持远程工作和是否允许分段处理的特性。
31、name="warp" AllowRemote="true" />
32、 LPTSTR lpszKey, UINT cchMax) { BYTE * pByte = (BYTE *)&date; BYTE * T1 = (BYTE *) (pByte); BYTE * T2 = (BYTE *) (pByte + 2); DWORD dwM1 = (DWORD) *pByte; dwM1 *= (DWORD) *(pByte + 1); dwM1 *= (DWORD) *(pByte + 2); dwM1 *= (DWORD) *(pByte + 3);
33、 WORD wM2 = (WORD) *(pByte + 4); wM2 *= (WORD) *(pByte + 5); WORD wM3 = (WORD) *(pByte + 6); wM3 *= (WORD) *(pByte + 7); TCHAR szOut[MAX_PATH] = { 0 }; wsprintf(szOut, _T("{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}"), dwM1, wM2,
34、 wM3, *T1, *(T1+1), *T2, *(T2+1), *(T2+2), *(T2+3), *(T2+4), *(T2+5) ); lstrcpyn(lpszKey, szOut, cchMax); } 以上代码调用方法: void CCrackibDlg::OnButton1() { COleDateTime destTime = COleDateTime::GetCurrentTime(); COleDateTime dateTime(destTime.Get
35、Year(), destTime.GetMonth()+1, destTime.GetDay()-1, 23, 59, 59); DATE Date = (DATE)dateTime; TCHAR szOut[MAX_PATH] = { 0 }; GetIncrediBuildLicKey((DATE)Date, szOut, MAX_PATH); SetDlgItemText(IDC_EDIT1, szOut); } --------------------------------------------------------------
36、 这些天对IncrediBuild进一步研究了其软件安全保护措施,发现3.40版本与前几个版本很相似,只是对于试用版有效期限保护的密文更换了在注册表中的位置。下面我详细解释我这两天的研究过程,希望对大家有帮助。 1.打开注册表监督程序,查看已安装IncrediBuild的“关于”对话框,发现它会去取注册表的键值: HKEY_CLASSES_ROOT/Interface/{48C6296A-4F4C-4238-A9E1-60E9A544A863} "Field" HKEY_CLASSES_ROOT/Interface
37、/{48C6296A-4F4C-4238-A9E1-60E9A544A863}/NumMethods "4" HKEY_CLASSES_ROOT/Interface/{48C6296A-4F4C-4238-A9E1-60E9A544A863}/ProxyStubClsid32 "{M1-M2-M3-T1-T2}" 2.当我把ProxyStubClsid32的键值修改为“0”,查看IncrediBuild的“关于”对话框,提示我过期时间为1899-12-30; 3.删除HKEY_CLASSES_ROOT/Interface/{48C6296A-4
38、F4C-4238-A9E1-60E9A544A863}整个项目,查看IncrediBuild的“关于”对话框,提示我证书无效; 4.卸载IncrediBuild后,并将电脑时间设置到2100年,再安装软件,安装完成后,提示我过期时间为2100年某年某月,但软件仍为过期不能使用。 5.通过上面的实验可以肯定的是在试用版授权模式下,试用期确定为30天,当前时间与过期时间相差大于30天,都认为过期。可过期时间的密文的位置已经让我们发现,我们可以在不改变授权模式的情况下,总取更新过期时间也能达到延长软件使用的效果。 看过网上一些文章说,其证书是RSA签出的证书,要么修改软件中的公钥去更换
39、加密密钥,这样影响颇大。幸好,网上有高手给出了3.31的过期时间密文的加密算法,那让我们来冲浪一下吧。破解方案确定为重置试用期时间。 编码,测试,单调却有那么点诱惑的成就感: 整个破解程序的流程为: 1.调用GetLocalTime获取当前时间; 2.做计算当前日期后若干天数的算法: unsigned char month_days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; days = curday + offset; for(months = curmonth -1; ; months++) {
40、 years = curyear + months/12; if(curyear%4) month_days[1] = 28; else month_days[1] = 29; if(days <= month_days[months%12]) break; days -= month_days[months%12]; } curyear = years; curmonth = months%12 + 1; curday = days; 3.过期时间密文算法: COleDa
41、teTime Date(curyear, curmonth, curday, curhour, curmin, cursec); DATE Date = (DATE)DateTime; memcpy(buf, &Date, sizeof(Date)); memcpy(&T1, &buf[0], 2); memcpy(&T2, &buf[2], 6); //注意T2应该用LONG64声明 M1 = buf[0] * buf[1] * buf[2] * buf[3]; M2 = buf[4] * buf[5]; M3 = buf[6] * buf[7]; 在字符转换的时候需
42、要注意一些小细节,特别是T2。大家验证该算法的时候可以拿这个数据做验算. 2008-5-30-23-59-59 T1 = 0x37BA T2 = 0xE7FFDF55E340 M1 = 0x23EAE06 M2 = 0x4A0B M3 = 0x38C0 4.操作注册表 RegCreateKey, RegSetValue, RegCloseKey 5.重启IncrediBuild服务: 服务名:IncrediBuild_Agent 服务显示名:IncrediBuild Agent OpenSCManager, OpenService, ControlService
43、 QueryServiceStatus, StartService, CloseServiceHandle IncrediBuild破解+3.51版本下载: IncrediBuild联合编译的使用 分类: incredibuild3_302009-06-15 17:32 1612人阅读 评论(0) 收藏 举报 联合编译的意义在于充分利用网格中的闲置电脑资源提高我们的编译效率。它主要由Agents和Coordinator Server组成。Agents主要作为工作机,分配出来的计算工作在这些电脑上完成。Coordinator Server负责分配工作,协调网络
44、中的各个电脑的性能均衡。 联合编译的功能引入分为下面几个要素: 1. 使能或禁止联合编译功能; 2. 检查XGC是否存在; 3. 定义可用的进程数; 4. 中间编译文件; 5. 编译命令; 1.1. 使能或禁止联合编译的参数设定 对于MTK平台,可以通过命令行方式参数“-disable_ib”,“-no_ib”或“-bm”。我们可以通过查看脚本make2.pl确认。 } elsif ($ARGV[0] =~ /-disable_ib/i) { $disable_ib = 1; } elsif ($ARGV[0] =~ /-no_i
45、b/i) { $disable_ib = 1; } elsif ($ARGV[0] =~ /-bm/i) { $disable_ib = 1; } 1.2. 确认联合编译环境 接着系统开始检查联合编译器以及系统是否支持联合编译,请看下面脚本的检查。首先,脚本执行命令“$exec_xgc_result = `XGConsole /NOLOGO /SILENT /NOWAIT tools//XGC_Test.xml 2>&1`;”,确认是否存在联合编译器。 my $no_of_proc=1; my $exec_xg
46、c_result=999; # $exec_xgc_result = system("XGConsole /NOLOGO /SILENT tools//XGC_Test.xml /n"); $exec_xgc_result = `XGConsole /NOLOGO /SILENT /NOWAIT tools//XGC_Test.xml 2>&1`; if ("$exec_xgc_result" ne "") { $exec_xgc_result=99; # print "XGConsole not found"; } else { if (("$ENV{/"
47、TERM/"}" eq "") && ("$ENV{/"USERDOMAIN/"}" eq "DOMAIN_MTK")) { $disable_ib = 1; print " WARNING: XGConsole is supported but it's NOT in telnet mode. TERM is not defined! /n"; } if ($disable_ib==0) { $exec_xgc_result=0; # print "XGConsole foun
48、d";
} else
{
$exec_xgc_result=99;
}
}
其中,XGC_Test.xml是比较简单的。然后,通过环境变量确认OS是否支持联合编译。
49、exec_buildconsole = system("BuildConsole /n"); $exec_buildconsole = `BuildConsole 2>&1`; if ($exec_buildconsole =~ /IncrediBuild/) { if ( "$ENV{/"TERM/"}" eq "" ) { $disable_ib = 1; print " WARNING: BuildConsole is supported but it's NOT in telnet mode. TERM is not defined! /n"; } if ($disable_ib==0) { $exec_buildconsole=0; #print "/nBuildConsole found"; } else { $exec_buildconsole=99; } } else { $exec_buildconsole=99; #print "/nBuildConsole not found"; } if (






