工作环境:dll源代码是c,在Visual studio 2010中调试。

第一步,调试的准备。

用C#语言编写一个测试dll文件的程序,由于dll源程序是c的,且运行结果是黑屏的,所以C#代码也是运行在黑屏的console环境下。完整代码如下。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices; namespace TestMelp
{
class Program
{
[DllImport(@"D:\Visual Studio Projects\FileMelp\Debug\FileMelp.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
extern static void cmd_melp(int argc, string[] argv);
static void Main(string[] args)
{
//string cmd = "melp -s -i D:/bin/bit -o D:/bin/output";
string cmd = "melp -a -i D:/bin/inputD -o D:/bin/bitRight";
string[] argv = cmd.Split(new char[] { ' ' });
int argc = argv.Length;
cmd_melp(argc, argv);
}
}
}

  由于调试的FileMelp.dll文件和本程序不在同一个文件夹下,容易出现文件地址问题,所以本测试程序的文件均采用绝对地址。另外cmd的格式要求不能有两个连续的空格,也可以通过使用Trim函数,解决这个问题。

第二步,定位到自己改写的带有源代码的dll工程。

本文的FileMelp.dll工程,是通过本空间的生成VS dll那篇博客生成的,具体实现方法不在赘述。下面的两段代码分别添加到FileMelp工程melp.h和melp.c文件最下面。

#ifndef LIB_H
#define LIB_H
extern _declspec(dllexport) void cmd_melp(int argc, char **argv);
/* 加入任意你想加入的函数定义*/
#endif void cmd_melp(int argc, char **argv)
{
main(argc,argv);
}

  按F6,上述步骤实现FileMelp.dll动态库的生成。

第三步,添加测试程序到dll源代码处。

在FileMelp工程里面,右击FileMelp工程,选择属性。

或者按Alt+Enter,弹出如下界面。

在Configuration Properties\Debugging\Command选择第一步生成的测试.exe文件。这样完成了调试前的准备。接下来,在需要调试的代码地方,添加断点。即可。

注意:

(1)要在Debug的模式下编译生成测试程序的exe文件,也就是说Configuration Properties\Debugging\Command这个路径要填测试程序的Debug目录。同时,DLL程序在加断点运行的时候也要在Debug的模式下,否则断点就会失效。

(2)同时要把生成的DLL放到测试模块Debug的目录下才可以,不然同样报错,找不到对应的DLL。

(3)有时候,看样子所有的东西都弄好了,路径设置好了,都是Debug模式,自己写的一些小的Demo也可以运行,但是公司给的DLL就是跑步起来,一直提示找不到模块。这时你的错误基本上可以确定是那个DLL同样依赖一些其他的DLL,但是这些依赖的DLL在你的C:\windows\system32的目录下并不存在,这时就要使用一个软件:Dependency Walker来分析你的DLL所依赖的其他的DLL,然后找到这些依赖的missing的DLL,把它们放到C:\windows\system32下,就可以了。我之前遇到的问题是Release下的DLL可以运行,但是Debug下的DLL就是跑不起来,但是我想调试我的DLL,所以必须得要Debug模式的DLL。用Dependency Walker分析后,告诉我缺少MSVCP120d.dll和MSVCR120d.dll。于是送网上下载,放到system32下就搞定了。

(4)在Debug模式下调试DLL,DLL中的任何改动之后,都必须重新编译DLL并把生成的新的DLL放到测试工程的/bin/Debug目录下,才可以继续调试。

原文转载地址:

http://my.oschina.net/bubifengyun/blog/111924

http://my.oschina.net/bubifengyun/blog/96252

调试带有源代码的DLL文件的更多相关文章

  1. 如何使一个你没有源代码的DLL文件变为强命名的DLL

    转载: 有时候你会需要一个DLL是强命名的,比如你想把这个文件放到GAC里面.如果这是一个第三方的DLL,你没有源代码,这会是一件比较麻烦的事情.有一个方法可以解决这个问题. 在VS.NET的命名行窗 ...

  2. VS如何在调试时进入到dll文件

    背景:    项目A:用C#写的一个类库文件 项目B:引用项目A的dll文件,完成编码,也是C#编写的. 需求:怎么能在调试的时候,调试断点能够从项目B中进入项目A中的代码. 解决办法就是: 假设,项 ...

  3. 如何生成带注释的DLL文件

    背景: 实际上并不是生成带有注释的DLL文件,而是同时生成一个XML文件,用来显示注释. 为什么要使用DLL文件,在C#编程的过程中,一直在使用DLL文件,如System.dll 方法: 1,创建类库 ...

  4. 关于delphi PAServer 远程调试DLL文件

    用PAServer调试的话会产生一个默认user-connectionname的文件夹,且这个文件夹不能自定义.因此无法使调试的dll文件生成到host主程序所在的文件夹下而导致无法调试. 变通方法: ...

  5. VC6.0 调试.dll文件

    对于自己制作的.DLL文件,一直没有比较好的调试方法,其实是知道的太少. 下面就说说VC6.0下面 怎么调试DLL文件: 首先得有一个调用DLL文件的可执行程序,然后调用这个可执行程序. 在工程上 右 ...

  6. 常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服务 C#服务端判断客户端socket是否已断开的方法 线程 线程池 Task .NET 单元测试的利剑——模拟框架Moq

    常量,字段,构造方法   常量 1.什么是常量 ​ 常量是值从不变化的符号,在编译之前值就必须确定.编译后,常量值会保存到程序集元数据中.所以,常量必须是编译器识别的基元类型的常量,如:Boolean ...

  7. C语言dll文件的说明以及生成、使用方法

    最近在搞一些小项目,由于要涉及到跟其它语言进行交互,动态链接库变成了不二的选择.为此也查阅了很多资料,将动态链接库的相关知识在此做一个整理. 一.动态链接库概述 动态链接库(Dynamic Link ...

  8. lib和dll文件的区别和联系

    什么是lib文件,lib和dll的关系如何 (2008-04-18 19:44:37)    (1)lib是编译时需要的,dll是运行时需要的. 如果要完成源代码的编译,有lib就够了. 如果也使动态 ...

  9. LIB文件和DLL文件的作用

    (1)lib是编译时需要的,dll是运行时需要的.如果要完成源代码的编译,有lib就够了.如果也使动态连接的程序运行起来,有dll就够了.在开发和调试阶段,当然最好都有.(2)一般的动态库程序有lib ...

随机推荐

  1. WM_SYSCOMMAND包括很多功能,比如:拖动左边框、拖动标题栏、滚动条滚动、点击最小化、双击标题栏——Delphi 通过事件代替了大部分常用的消息,所以Delphi 简单、易用、高效

    procedure TForm1.WMSysCommand(var Message: TWMSysCommand); var str: string; begin case Message.CmdTy ...

  2. TCP的核心系列 — SACK和DSACK的实现(一)

    TCP的实现中,SACK和DSACK是比较重要的一部分. SACK和DSACK的处理部分由Ilpo Järvinen (ilpo.jarvinen@helsinki.fi) 维护. tcp_ack() ...

  3. SqlDataAdapter的方法之一Fill (DataSet dataset, String datatable)解释

    一.SqlDataAdapter的方法之一Fill (DataSet dataset, String datatable)解释:根据datatable名填充Dataset.myda.Fill(ds, ...

  4. 跳出for循环

    如下面,有两个循环,break只能退出一个for循环,不能直接跳过第二个for循环 for (Type type : types) { for (Type t : types2) { if (some ...

  5. UVa1584 Circular Sequence

    #include <stdio.h>#include <string.h> int less(char* str, size_t len, size_t p, size_t q ...

  6. BZOJ 2208: [Jsoi2010]连通数( DFS )

    n只有2000,直接DFS就可以过了... -------------------------------------------------------------------------- #in ...

  7. Struts学习之值栈的理解

    转自:http://blog.csdn.net/hanxuemin12345/article/details/38559979 页面一个请求发送过来,依次经过一系列拦截器(处理公共部分,如:往数据中心 ...

  8. centos6.5安装vsftpd

    开通FTP有gssftp和vsftpd二种,查了查,据说vsftpd更稳定和更安全.就用vsftpd吧. 什么是vsftpd vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序.特点是小 ...

  9. Creating a Broker (创建代理)

    1,CMD中运行 2,apollo的目录结构. bin  执行相关的脚步. etc  保存实例的配置文件 data  存储消息的文件 log 日志 tmp 临时的文件 3,Broker Configu ...

  10. jbpmAPI-3

    第三章.jBPM安装程序 3.1 .先决条件这个脚本假设您具备Java JDK 1.6 +(设置JAVA_HOME),和Ant 1.7 +安装.如果你没有,请使用以下链接下载并安装:Java:http ...