Delphi加断点调试DLL文件

文字较多,请耐心看完。解释得详细点总是比一笔带过的好。有说的不清楚或错误之处,欢迎拍砖。

[color=blue]--2010.10.15更新[/color]
补充一点,Delphi5加载了模块后要调试dll,别忘了将project->project option->Linker底下的Exe and Dll options中,Include TD32 debug info 与 Include Remote debug symbol勾选上。
[color=blue]--2010.10.15更新 end [/color]

之前调试DLL文件,一般都是写一个日志文件函数,输出到硬盘上某个文件或者界面上某个控件上,这在调试普通程序还好,DLL程序就难办了,尤其是别人的代码,使用了第三方控件,所以一定要使用断点调试这一最基本最好用的调试方法。

Delphi的DLL调试网上说法很多,也有挺全面的,都提到了宿主程序的设置和路径设置,却没有多少人提到怎么把DLL加载到调试器里,然后加断点调试。

首先简单介绍一下DLL文件的调试原理:DLL程序需要一个独立的宿主程序(host)来调用它,这个宿主程序是不能和DLL文件在同一工程下的,但是,网上有说法是DLL文件不能在宿主程序的同一目录下,其实这点是可以的,[color=blue]只要正确的设置并将DLL加载进调试器就行[/color],设置步骤如下:

1、打开dll工程文件,run->run parameters,host application设置为宿主程序([color=blue]精确到程序文件[/color]),parameter是debug;

2、设置好宿主程序和运行参数后,最好将DLL文件的生成输出目录指定到宿主程序所在的文件夹下,这样子方便调试,不需要每次生成DLL文件后,还要手动从一个文件夹复制到宿主程序所在的文件目录下;然后在编辑好DLL工程后,在想要停止的地方加断点,然后直接点运行;接下来的一步很重要了;

3、点运行将跳出宿主程序,比如一个主框架程序,可能跳出来的是一个登陆框什么的,这不重要,重要之处在于,请切换到Delphi的DLL工程文件上,点击[color=blue]ctrl+alt+M[/color],跳出一个名叫Module的窗体来。左上角显示了宿主程序本身及其它所调用的资源(一般在windows下应用程序都做成dll形式以减小主程序体积,还有别的使用dll带来的好处),如图:
[img]http://dl.iteye.com/upload/picture/pic/46869/d6b304ad-dc83-3d5b-8c43-514a3743dd90.jpg[/img]
可以看到一些经常需要调用的dll,如windows的user32.dll等;
右上角显示了dll函数的entrypoint,是每个dll文件export的过程或函数名,供调用;
这里需要注意的是左上角的path,显示了调用的dll文件的地址,系统级的dll文件,或者是在系统环境变量中有值的软件中的dll文件的path都是有值的;你要调试的dll文件一般没有path,所以要reload一下,以便调试器知道你要调试的dll文件是哪个。在reload之前,要在Module窗体中找到你所要调试的dll文件名,如果没有,说明要调试的dll还没有被加载,所以要继续运行宿主程序知道左上角列表的name列里出现了要调用的dll文件名。(所以你最好要清楚所使用的宿主程序何时加载了dll文件);

4、找到dll文件后,选中它,右键,在弹出菜单中选"Reload Symbol Table",将弹出相应的对话框,在Module Path里,设置dll文件的真实路径(精确到文件),比如第2步中提到将dll文件生成在宿主程序所在的文件夹下,那么,在Module Path中所设置的路径将是"宿主程序所在文件夹\dll文件名.dll",设置好后,回到delphi单元文件里设置好的断点处,如果设置正确,断点将会出现红圆加勾(断点有效)或红圆加叉(断点无效);

5、如果此时要调试的dll文件已经运行到了断点后,则在宿主程序中回到断点之前的操作,重新进行就可以在断点处停下了;
注意,Reload好后,继续运行宿主程序,有时会出现假死现象,这可能是由于断点位置设置得不够好导致的,可以调用一下系统任务管理器,切换一下焦点,再切换回delphi,应该能发现程序停在了你所设置的断点处。

接下来,该怎么调就怎么调,随时加断点。摆脱看别人DLL工程文件代码,使用别人控件时的出错不知从何下手的囧境,enjoy programming!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值