页游试玩只赚第一档:Delphi加断点调试DLL文件

来源:百度文库 编辑:九乡新闻网 时间:2024/07/08 20:03:41
文字较多,请耐心看完。解释得详细点总是比一笔带过的好。有说的不清楚或错误之处,欢迎拍砖。

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

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

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

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

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

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

    3、点运行将跳出宿主程序,比如一个主框架程序,可能跳出来的是一个登陆框什么的,这不重要,重要之处在于,请切换到Delphi的DLL工程文件上,点击ctrl+alt+M,跳出一个名叫Module的窗体来。左上角显示了宿主程序本身及其它所调用的资源(一般在windows下应用程序都做成dll形式以减小主程序体积,还有别的使用dll带来的好处),如图:

    可以看到一些经常需要调用的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",将弹出相应的对话框,在ModulePath里,设置dll文件的真实路径(精确到文件),比如第2步中提到将dll文件生成在宿主程序所在的文件夹下,那么,在ModulePath中所设置的路径将是"宿主程序所在文件夹\dll文件名.dll",设置好后,回到delphi单元文件里设置好的断点处,如果设置正确,断点将会出现红圆加勾(断点有效)或红圆加叉(断点无效);

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

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