【问题标题】:Debugging Visual Studio 2010 DLL Project调试 Visual Studio 2010 DLL 项目
【发布时间】:2011-04-09 09:19:46
【问题描述】:

我正在尝试从 Visual Studio 2010 调试 C/C++ 本机 DLL 项目。我正在尝试按照以下说明进行操作: http://msdn.microsoft.com/en-us/library/c91k1xcf(v=VS.100).aspx

我想使用内置调试器,并能够像处理常规 .exe 项目一样对代码进行单步执行、检查结构等。上面页面上的说明描述了 Configuration Properties 下的 Debugging 类别,我没有看到。

http://img707.imageshack.us/img707/4402/lalasz.png

直接按 F5 调试会出现以下错误:

无法启动程序'C:\Users.......Test.dll'

我已经多次将调试器用于常规 .exe 项目,它在这台计算机上运行良好。不过,我不确定我是否只是遗漏了一些非常明显的东西。

编辑:由于我从一开始就没有明确说明,我希望 Visual Studio 将我的 DLL 加载到存根进程中,并让我从那里在源代码级别进行调试,就像 OllyDbg 的做法一样。

我的 DLL 不是包含大量要导出和调用的函数的类型。相反,它在 DllMain 和 DLL_PROCESS_ATTACH 上执行开关/案例将产生一个新线程。因此,我需要 Visual Studio 做的就是将我的 DLL 加载到存根可执行文件中并允许我设置断点等。

【问题讨论】:

    标签: c debugging dll native visual-c++-2010


    【解决方案1】:

    您可能将生成 dll 的项目作为启动项目。

    您有两个选择:要么将启动项目更改为生成使用该 DLL 的可执行文件的另一个项目,要么从项目属性配置 dll 项目的调试设置以启动使用该 dll 的外部应用程序(项目属性/调试/命令)。

    【讨论】:

      【解决方案2】:

      本机 DLL 不能独立运行 - 它们必须在某些程序的上下文中运行。请参阅您引用的说明页面的这一部分。

      “如果从创建 DLL 的项目开始调试,则必须指定要用于调试 DLL 的可执行文件。”

      【讨论】:

        【解决方案3】:

        您在解决方案资源管理器窗口中右键单击解决方案名称并获得解决方案属性。请注意,窗口显示“解决方案测试属性页”。

        右键单击项目名称(测试以粗体显示)来设置项目选项。

        【讨论】:

        • 谢谢汉斯。当我右键单击正确的位置时,调试选项卡就在那里,但我意识到我还是误读了该页面。我实际上不想指定可执行文件。理想情况下,VC++ 会将我的 DLL 加载到存根可执行文件上,然后让我以这种方式进行操作。就像 OllyDbg 如何让你这样做一样。你知道这是否可能吗?
        • 不,VS 需要一个 .exe,任何 .exe,加载 DLL 并调用您要测试的入口点。除了 ActiveX 测试容器之类的东西之外,没有通用的 .exe 可以确定您导出的函数需要哪些参数。单元测试总是一个不错的选择。
        • 我的 DLL 不是包含要导出和调用的函数的类型。入口点将在 dwReason 上切换/大小写,在 DLL_PROCESS_ATTACH 上将使用 CreateThread() 生成一个线程,该线程将完成一些工作。同一个 DLL 可以使用 OllyDbg 中的“通用 .exe”进行调试,它仅使用调用 DLL 上的 LoadLibrary 的存根 exe。我可以轻松创建自己的骨架可执行文件,它也可以执行相同的操作,但我无法通过 IDE 对其进行调试。
        • 是的,使用完全相同的 EXE。是的,你可以调试它,在线程函数上设置一个断点。加载 DLL 后,调试器将自动激活断点。
        • 汉斯,这个方法很好用。作为参考,这些是我最终使用的设置:img839.imageshack.us/img839/770/lalan.png我在调试时收到错误“无调试信息”错误状态:找不到或不匹配“loaddll.exe”的调试信息。二进制文件不是使用调试信息构建的。我想我对此无能为力,它不会伤害我。
        【解决方案4】:

        您也会在托管项目中遇到此问题。 Visual Studio 告诉您的是它无法运行 DLL,就像您无法从资源管理器中双击 DLL 并运行程序一样。

        为了调试 DLL,请编写一个小型控制台应用程序,该应用程序从您的 DLL 中调用函数并练习您的代码。如果您的 DLL 具有函数 foo(),请在控制台应用程序中从 main 调用 foo()。通过右键单击解决方案资源管理器中的项目名称并选择其选项,将控制台应用程序设置为“启动”项目。

        然后,当您按 F5 时,您将运行控制台应用程序,该应用程序将调用 DLL。

        【讨论】:

        • 我的 DLL 的工作方式与传统的略有不同。它将在 DllMain 中生成一个线程并从那里执行其他工作。我知道这是不好的做法。我希望能够像从 OllyDbg 这样的反汇编程序中那样调试它。不同的是,我可以在源代码级别这样做。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-05
        • 1970-01-01
        • 1970-01-01
        • 2012-01-28
        相关资源
        最近更新 更多