zoukankan      html  css  js  c++  java
  • 调试带有源代码的DLL文件

    工作环境: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 ProjectsFileMelpDebugFileMelp.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 PropertiesDebuggingCommand选择第一步生成的测试.exe文件。这样完成了调试前的准备。接下来,在需要调试的代码地方,添加断点。即可。

    注意:

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

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

    (3)有时候,看样子所有的东西都弄好了,路径设置好了,都是Debug模式,自己写的一些小的Demo也可以运行,但是公司给的DLL就是跑步起来,一直提示找不到模块。这时你的错误基本上可以确定是那个DLL同样依赖一些其他的DLL,但是这些依赖的DLL在你的C:windowssystem32的目录下并不存在,这时就要使用一个软件:Dependency Walker来分析你的DLL所依赖的其他的DLL,然后找到这些依赖的missing的DLL,把它们放到C:windowssystem32下,就可以了。我之前遇到的问题是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

  • 相关阅读:
    Java可重入锁ReentrantLock
    Java异步编程
    机器学习 pipeline
    Python 机器学习 唐宇迪泰坦尼克号【最新代码】
    引用sklearn报错ImportError: cannot import name 'cross_validation'
    python机器学习-模型优化(六)
    python机器学习-模型评估(五)
    python机器学习-建模(四)
    python机器学习-特征工程(三)
    Python机器学习-数据预处理(二)
  • 原文地址:https://www.cnblogs.com/stemon/p/4510971.html
Copyright © 2011-2022 走看看