2010-09-07 163 views
0

我试图调试从Visual Studio 2010中我试图按照这些指令的C/C++本地DLL项目: http://msdn.microsoft.com/en-us/library/c91k1xcf(v=VS.100).aspx调试Visual Studio 2010的DLL项目

我想使用内置的调试器,并能像步骤执行常规.exe项目一样执行代码,检查结构等。上面的页面上的说明描述了一个调试类别配置属性,我没有看到。

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

只需按F5键下面的错误调试结果:

Unable to start program 'C:\Users.......Test.dll'

我用调试器进行定期的.exe项目很多次,它工作正常,这台计算机上。但我不确定是否现在只是错过了一些非常明显的东西。

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

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

回答

1

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

右键单击项目名称(粗体测试),而不是设置项目选项。

+0

感谢汉斯。调试选项卡在那里,当我右键单击正确的地方,但我意识到我误解了页面。我其实不想指定一个可执行文件。理想情况下,VC++会将我的DLL加载到存根可执行文件上,并让我以这种方式进行分步操作。就像OllyDbg让你这样做。你知道这是可能的吗? – Mike 2010-09-07 19:42:20

+2

不,VS需要一个.exe,任何.exe,加载DLL并调用您要测试的入口点。除了ActiveX测试容器之外,没有通用的.exe可以找出你导出的函数需要什么参数。单元测试总是一个不错的选择。 – 2010-09-07 19:59:37

+0

我的DLL不是包含要导出和调用函数的类型。入口点将在dwReason上切换/ case,并且在DLL_PROCESS_ATTACH上会用CreateThread()产生一个线程,这将会做一些工作。同一个DLL能够在OllyDbg中使用“generic .exe”进行调试,该DLL只需使用一个在DLL上调用LoadLibrary的stub exe文件。我可以轻松创建自己的框架可执行文件,它可以完成同样的功能,但是我无法通过IDE对其进行调试。 – Mike 2010-09-07 20:03:38

3

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

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

3

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

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

0

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

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

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

+0

我的DLL与常规DLL稍有不同。它会在DllMain中产生一个线程,并从那里做其他工作。我知道这是不好的做法。我希望能够像OllyDbg这样的反汇编程序来调试它。不同之处在于我可以在源代码级别执行此操作。 – Mike 2010-09-07 19:45:39

相关问题