当前位置: 首页 > news >正文

【Dll调试】DLL调试方法

dll本身是没法运行的,必须在其它工程调用dll时候才会运行。

所以,调试dll首先要将调用dll的工程和dll工程联系起来。

解决方案中添加dll工程:

现在dll 和 应用程序两个工程就都在一个解决方案里了:

这时要对dll工程作些设置。

配置属性-常规-输出目录设置为 应用程序的生成目录 (调用dll的应用程序的目录?)

这样一来编译的dll、pbd文件就直接输出到对应应用程序的生成目录下面了

接下来依据一些文章说法,要在dll工程的属性配置:

调试中做些设置,

1、命令->写入应用程序的生成目录(exe目录)

2、命令->参数加入dll对外接口名。

但经我实验,不做这些设置也可以调试。

最后切记,一定要是debug模式才行!

我就是一直配置为release模式,一直没法进入dll工程断点浪费了很多时间。

转自:https://www.cnblogs.com/rixiang/p/8405351.html

DLL有三种调试方法:

       方法1:

                如果动态链接库是自己编写的,并且测试代码也是自己编写的,那么此时我们可以将动态链接库和测试代码的工程建立在一起,在调试测试代码的时候,可以直接调用动态链接库中的代码。

我们在测试链接库项目中的100行打个断点,当执行到此处的时候,按F11就会进入到动态链接库项目中的源码中,就可以进行调试了。

   方法2:

如果动态链接库是自己编写的,而调用动态链接库的程序不是自己编写的,那么我们需要设置动态链接库中的项目属性,启动调用动态链接库的程序,形成链接之后,在调试的时候才可以数你在动态链接库中调试。如下图:

                

在项目属性的调试中设置完成对应要启动的exe之后,设置dll为启动项目,即可以运行调试。

方法3:

如果动态链接库不是自己编写,程序也不是自己编写,那么这个时候只能通过Ollydbg或者其他调试工具调试了。使用OD调试dll,需要保证OD目录下有loaddll.exe文件。

需要三个步骤如下:

1)我们可以先借助LordPE获取到导出表中的方法的RVA地址

2)借助OD获取到项目的基址

3)通过基址和RVA计算出来VA,就找到函数了

VS2015动态库静态加载时指定动态库位置的方法

在VS2015中静态加载动态库时,需要将库文件(DLL)拷贝到调用程序所在的路径下,如果所需动态库较多时,就会非常麻烦。可以在项目中指定应用程序搜索动态库的路径,这样就无需再将动态库文件进行拷贝了。

可以通过两种方法为应用程序指定搜索动态库的路径,一种是设置应用程序的“工作目录”,另外一种是设置应用程序的“环境”。

1 设置工作目录

使用VS2015打开调用DLL的应用程序,点击菜单栏“项目->XXX属性”,在“XXX属性”对话框的左侧选择“配置属性->调试”,在对话框右侧的“工作目录”中设置为DLL所在路径,如图1所示。

图1 设置项目的工作目录

2 设置环境变量

使用VS2015打开调用DLL的应用程序,点击菜单栏“项目->XXX属性”,在“XXX属性”对话框的左侧选择“配置属性->调试”,在对话框右侧的“环境”中输入如下代码

path=C:\DLL;

 其中,DLL是DLL文件所在的文件夹绝对路径,如图2所示。

图2 设置项目的环境变量

需要注意的是,在设置了项目的“环境”变量后,需要重新启动VS2015。
————————————————
版权声明:本文为CSDN博主「棉猴」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hou09tian/article/details/72777922

相关文章:

  • 【机器学习】线性回归数学推导
  • 【VS消除警告】VS消除特定警告/安全函数警告C4996 strncpy unsafe……
  • CSDN 博客备份工具
  • 【FTP】linux FTP传文件到windows
  • 【VS】在VS中添加lib库的三种方法
  • 【合并lib】windows下多个lib合并的方法|查看lib是导入库还是静态库
  • 【python】anaconda 安装第三方包
  • 【IP/TCP】127.0.0.1和localhost和本机IP三者的区别
  • 【C/C++相互调用】C调用C++库和C++调用C库的方法
  • [STL]C++ STL中常见容器的时间复杂度
  • 【STL map】map用法、插入方法、pair和make_pair的区别
  • 【字符编码】 简洁理解ANSI,UTF8,Unicode,ASCII编码的差别
  • [MYSQL]mysql将两个表结果合并到一起
  • 【MYSQL】mysql把字段进行逗号分隔成多条数据
  • 【python备份】Python备份CSDN完整博客 研读
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 0基础学习移动端适配
  • CentOS7 安装JDK
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • input的行数自动增减
  • JAVA多线程机制解析-volatilesynchronized
  • JS基础之数据类型、对象、原型、原型链、继承
  • Laravel 实践之路: 数据库迁移与数据填充
  • Linux中的硬链接与软链接
  • log4j2输出到kafka
  • Redash本地开发环境搭建
  • SpiderData 2019年2月25日 DApp数据排行榜
  • 对象引论
  • 给第三方使用接口的 URL 签名实现
  • 给新手的新浪微博 SDK 集成教程【一】
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 深度学习入门:10门免费线上课程推荐
  • 优化 Vue 项目编译文件大小
  • ​马来语翻译中文去哪比较好?
  • #{} 和 ${}区别
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (11)MSP430F5529 定时器B
  • (3)(3.5) 遥测无线电区域条例
  • (C语言)二分查找 超详细
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (超详细)语音信号处理之特征提取
  • (独孤九剑)--文件系统
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (顺序)容器的好伴侣 --- 容器适配器
  • (四)模仿学习-完成后台管理页面查询
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .NET Core 2.1路线图
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .net 反编译_.net反编译的相关问题
  • /proc/vmstat 详解