`

Delphi加断点调试DLL文件

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

--2010.10.15更新
  补充一点,Delphi5加载了模块后要调试dll,别忘了将project->project option->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",将弹出相应的对话框,在Module Path里,设置dll文件的真实路径(精确到文件),比如第2步中提到将dll文件生成在宿主程序所在的文件夹下,那么,在Module Path中所设置的路径将是"宿主程序所在文件夹\dll文件名.dll",设置好后,回到delphi单元文件里设置好的断点处,如果设置正确,断点将会出现红圆加勾(断点有效)或红圆加叉(断点无效);

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

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

相关推荐

    Delphi5开发人员指南

    4.2 构成Delphi 5项目的文件 79 4.2.1 项目文件 80 4.2.2 单元文件 80 4.2.3 窗体文件 80 4.2.4 资源文件 81 4.2.5 项目选项及桌面设置文件 81 4.2.6 备份文件 81 4.2.7 包文件 82 4.3 项目管理提示 82 4.3.1 一个...

    完全掌握加密解密实战超级手册.z01

    41214.5.2 解除ZIP文件口令 41314.5.3 实现WinRAR自加密 41314.5.4 解除RAR文件密码 41414.6 加密解密EXE文件 41514.6.1 用ASPack加密EXE文件 41514.6.2 用tElock加密EXE文件 41714.6.3 为EXE文件加口令 41914.7 ...

    完全掌握加密解密实战超级手册.zip02

    61.2.2 在Delphi中建立和使用DLL文件 101.2.3 DLL文件的调用方法 121.3 设计与发布包组件 141.3.1 包组件概述 141.3.2 设计与发布包组件 151.3.3 安装与卸载包组件 171.4 解密与注册保护 191.4.1 解密方式 191.4.2 ...

    vc++ 应用源码包_1

    详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加解密以及其它的文件加解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...

    vc++ 应用源码包_6

    详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加解密以及其它的文件加解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...

    vc++ 应用源码包_2

    详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加解密以及其它的文件加解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...

    vc++ 应用源码包_5

    详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加解密以及其它的文件加解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...

    vc++ 应用源码包_3

    详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加解密以及其它的文件加解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...

    Ollydbg2.01简繁中文版.

    直接运行和调试的DLL 对象文件扫描 - 从对象文件和库位于例程 允许用户定义的标签,备注和功能描述 识别在Borland ®格式的调试信息 会话之间保存的补丁程序,并将其写入可执行文件,并更新链接地址 开放式...

    Ollydbg2.01(alpha4)汉化版

    直接运行和调试的DLL 对象文件扫描 - 从对象文件和库位于例程 允许用户定义的标签,备注和功能描述 识别在Borland ®格式的调试信息 会话之间保存的补丁程序,并将其写入可执行文件,并更新链接地址 开放式...

    vc++ 开发实例源码包

    详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加解密以及其它的文件加解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...

    易语言程序免安装版下载

     静态编译后的易语言可执行程序(exe)和动态链接库(dll),运行时不再依赖任何支持库文件,文件尺寸更小(相对以前的独立编译),PE结构更合理(取消了“易格式体”),加载速度更快,而且有效解决了“病毒误报”和...

Global site tag (gtag.js) - Google Analytics