寻找如何在 VS 9 中调试到导出的 dll 函数。可能吗?

Posted

技术标签:

【中文标题】寻找如何在 VS 9 中调试到导出的 dll 函数。可能吗?【英文标题】:Looking for how to debug into an exported dll function in VS 9. Possible? 【发布时间】:2010-08-26 16:43:19 【问题描述】:

有一个大型的 MFC C++ 项目。我们的 VS 版本是 2008。它加载一个常规 dll(用于一些可选功能)并从中调用导出的函数。当通过 MFC 应用程序调试并到达我们调用导出函数的地步时,您无法进入 dll 函数。有没有办法在 dll 函数中进行调试。即使我在 C++ 解决方案中包含了 dll 项目,它似乎也没有“看到” dll 代码。

编辑:我们有许多扩展 dll 并且调试它们工作得很好。这是一个直接的 dll,没有 mfc,/clr 选项集,因此我们可以调用一些托管代码。使用此 dll 的类,加载它,然后使用 GetProcAddress 查找指向导出函数的指针。以下是示例。

typedef void (*FP_OnEditOptions) ();

对函数进行原型化。 那么

m_fpOnEditOptions = (FP_OnEditOptions) GetProcAddress(hInstance, "Direct_Edit_Options");

获取proc指针,然后

static void OnEditOptions()
(*m_fpOnEditOptions)();

调用它。

调试时,调用它,按 F11,它调用它,但不介入。 是的,dll 有调试选项,当模块加载时,符号会从相应的 pdb 文件中加载。

谢谢,

安迪

【问题讨论】:

只要确定 dll 是用调试信息构建的,对吧? 【参考方案1】:

调试 + Windows + 模块。在列表中找到 DLL 并右键单击它。符号加载信息告诉您调试器在哪里查找 .pdb 文件。确保你得到它。

更新后:很有可能在启用 /clr 后,您实际上正在运行已编译为 IL 并即时编译的代码。就像托管代码一样。您需要将调试器切换到混合模式调试。项目 + 属性、调试、调试器类型 = 混合。

【讨论】:

嗨,是的,检查过并且正在加载符号。有关更多信息,请参阅编辑。可能我说的不够具体。谢谢你的信息;我不知道如何检查。 我不知道,您之前确实应该提到过 /clr。这是您要执行的托管代码吗?只需在要调试的 DLL 函数上设置断点即可。 不,不,我想。导出的函数看起来像这样。 extern "C" __declspec(dllexport) void Direct_Edit_Options() ... 该函数不是托管代码(至少我不这么认为),而是像这样调用一些托管函数。 FooTools::PaymentAPI::RunOptionsScreen();我已经尝试在 dll 函数中设置断点,但它并没有停在那里,正如我所说,如果我尝试进入这个函数,它只是运行它而不介入。谢谢你看这个。 C++/CLI 编译器功能强大,几乎可以将任何原生 C++ 代码转换为 IL。不知道如何在这样的环境中启用混合模式调试。尝试项目 + 属性、调试、调试器类型 = 混合。或仅原生 哇。你这个男人。将其设置为混合模式调试有效。谢谢,这将使调试过程变得更加容易。 :)【参考方案2】:

在工具->选项->调试->常规下查看

有几个选项可能会有所帮助 - 我不确定您到底需要哪一个。两个明显的是:

禁用“仅我的代码” 禁用“跳过属性和运算符”

您也可以尝试在被跳过的函数中放置一个断点。这应该会强制调试器在该代码处停止。

【讨论】:

以上是关于寻找如何在 VS 9 中调试到导出的 dll 函数。可能吗?的主要内容,如果未能解决你的问题,请参考以下文章

MFC DLL 导出函数的定义方式

VS2019尝试dll工程与控制台联调

windows 查看DLL导出函数的方法

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

在导出DLL的非启动项目中使用Nsight调试CUDA代码

VS2013调试时如何加载dll