【问题标题】:Is it possible to step into a member function defined in a .dll file?是否可以进入 .dll 文件中定义的成员函数?
【发布时间】:2025-12-16 13:30:02
【问题描述】:

我从 NVIDIA 下载了一个 SDK,并使用 Visual Studio 2015 运行 SDK 中提供的演示项目文件。

SDK 中的演示项目文件按预期工作,直到我对代码进行了一些小的更改(如果您想了解有关更改的详细信息,请参阅最后一段)。

进行这些更改后,代码中的一行似乎永远运行。使用调试器,我发现那行代码中有一个成员函数没有返回任何内容,因此程序流程只是停留在该行。我尝试进入这个函数,但它是在 SDK 附带的 .dll 文件中定义的。

Visual Studio 告诉我符号文件未加载,并且在 Microsoft 服务器上找不到 PDB 文件。调试器让我看到反汇编代码,但我不知道我是否可以使用它来识别问题。

所以现在我被困在一行代码中,因为在 .dll 文件中定义的成员函数不会返回任何内容,只会继续运行(我已经让它运行了一个多小时,但它仍然没有) t返回任何东西)。

我想确定发生这种情况的原因,但我无法看到成员函数的源代码,因此我不知道成员函数内部发生了什么或如何调试它。有什么方法可以确定这个问题的原因吗?是否有可能以某种我可以理解的方式查看成员函数的源代码?

有关我所做更改的更多详细信息:

我已将其与问题的主体分开,因为我认为它不是非常相关,但它可能对回答者有用。 SDK 将视频拼接成一个视频(创建 360 度观看视频)。只要我使用演示视频文件,演示项目就可以正常工作。视频文件使用命令行参数输入到项目中。当我将自己的视频文件提供给演示项目时,就是我遇到这个问题的时候,否则成员函数成功返回并且项目成功创建了拼接视频。我唯一改变的是项目的输入(即视频文件),我根本没有改变源代码。

【问题讨论】:

  • 有可能,但是您需要此 dll 的源代码和调试符号。
  • @VTT 据我所知,SDK 没有附带调试符号或 dll 的源代码。那么在那种情况下是不可能的吗?
  • 好吧,你总是可以深入了解一下汇编程序。但最有可能解决您面临的问题根本不需要进入 dll 函数。例如您传递了错误的参数,您的视频格式不受支持等等。
  • @VTT 对。该文档仅提到输入视频应为 .mp4。我已经尝试了多种参数排列来尝试让它工作,但这最终是一种反复试验的方法,到目前为止它还没有奏效。我只是想找到其他方法来解决问题。
  • "mp4" 是一个非常宽泛的术语,我敢打赌他们对使用的编解码器和色彩空间也提出了相当严格的要求。您可以使用 mediainfo 显示有关特定文件的视频格式的所有相关信息。您应该将演示视频的参数与您的参数进行比较。

标签: c++ debugging dll visual-studio-2015 360-degrees


【解决方案1】:

如果 DLL 的提供者不提供源代码,您显然看不到它。这将是处理它的常用方法 - 除非它们是开源的,否则它们的源代码是公司的知识产权,所以它们当然不会向您展示。

如果它是开源的,您通常可以下载调试 DLL(其中包含源代码)。 Microsoft 还提供了许多带有源代码版本的运行时 DLL(但当然不是 Windows 本身)。如果有该 DLL 的调试版本,请检查 SDK,并与其链接,而不是您当前使用的那个。

所以,简而言之,除非他们给你,否则你看不到它。

【讨论】:

    【解决方案2】:

    正如 VTT 和 Aganju 所述,除非将源代码与 DLL 一起提供给我,否则我无法进入 DLL 中定义的成员函数。这回答了我的问题。对于我的具体情况,我使用的是 NVIDIA VRWorks 360 Video SDK,问题是由于没有正确的编解码器来处理拼接的视频文件。虽然 SDK 文档中没有提到这一点,但应该使用的视频编解码器是 H264 - MPEG-4 AVC(第 10 部分)(AVC1)。

    【讨论】: