1.调试delphi 写的服务程序,有这么一个办法。原来每次都是用attach to process方法,很麻烦。并且按照服务线程的执行线路,可能会停不到想要的断点。笨办法是,在procedure TsvcFrm.ServiceExecute(Sender: TService);中想要下断的语句前加个人定胜天的sleep(20000),但实际上这种办法是主观臆测的。可行,没问题。记得大学时,俺一同学,也会修电视,他的办法是弄个小锤子,四处敲击,没两下就好了,和我用万用表的方法不一样,万用表他根本不会用。而且产生的效益比我的要乐观。毕业了,他回家开个网吧,也算是做IT,而我成了一位对编程颇有研究的IT业余人士,结果他收入还是比我高。日,下辈子,老子扛大炮去修劳力士去。回忆回忆过去,展望展望未来,无限感慨。上面的方法是可以的,如同锤子,仔细了解下服务程序的执行过程,你会发现,用下面的方法,就可以把服务程序当普通程序调试了。
program svcProxy;
uses
SvcMgr,
scvmain in ’scvmain.pas’ {svcFrm: TService};
{$R *.RES}
begin
Application.Initialize;
Application.CreateForm(TsvcFrm, svcFrm);
svcFrm.ServiceExecute(nil);
//Application.Run;
end.
如上修改dpr文件,就可以直接在serviceexecute过程中下断了,what a good idea. OK ,debug delphi services directly.
调试好了,修改回去,就行了,调试delphi服务程序就简单和多了。再也不用去附加到进程这种方法了。
2.调试com对象。
这种方法网上有介绍,带上。
打开 run->com/comexp.msc ,新建一应用程序(abcd)
并将你的com对象加入进来,找到abcd属性->高级,将调试勾上,拷下”D:\Delphi7\Bin\bordbg70.exe” C:\WINDOWS\system32\dllhost.exe /ProcessID:{53342392-DAAE-4542-AC55-2EDA5080671E}
在delphi调试中,宿主填上那个dllhost.exe ,参数填上/ProcessID:{53342392-DAAE-4542-AC55-2EDA5080671E},好了,现在就可以当作是普通程序来调试了。有的人说要把这个加上project|option|linker|Include TD32 debug info 和Include remote debug symbols打勾,无所谓,不勾也行,不行就勾。
加上一个小经验,com程序的类,不能在create中下断,看看源代码就知道了,要在init过程中下断哦。
3.上面其实就是怎样找宿主的问题,所以要灵活运用啊。举一例:上次做了一个hook程序,插入到别的进程中,怎么调试那个插入的dll文件呢?可以,没问题。比如说,用a.exe 插b.dll 到 c.exe中,我们让a.exe 中创建 c.exe,并将a.exe做为宿主,在b.dll.pas中下断,想断哪就断哪。