我在 Quantlib 中有一个模块,当我通过 SWIG 从 C# 调用它时它不能正常工作。有没有办法从我的 C# 单元测试中调试到 Quantlib?
1 回答
还没有其他人回答,所以我将提供我们在调试 Ruby + SWIG 时在类似情况下所做的事情。
创建一个 Visual Studio 项目,其中包含 SWIG 生成的 C# 源代码、SWIG 生成的 C++、C# 单元测试和 Quantlib 源代码的其余部分。
我只是查看了 Quantlib 提供的 Visual Studio 解决方案文件,并没有看到 SWIG 目标,这很不幸,但如果您至少有 C++ 源代码,并且可以在调试模式下构建它,那么您可能会到达那里。困难的部分是您正在调用的 C# Dll 将期望在其调用中引用某个 C++ DLL。您可能必须将 C++ Quantlib 调试库移动到 C# 项目的 Debug 文件夹中,以便它找到您想要的特定版本。
配置解决方案后,将所有内容构建为调试或带有调试符号的 rel。
如果此时您在同一解决方案中拥有 C# 绑定源和 Quantlib C++ 源,您应该能够在 C# 或 C++ 中的任何位置设置断点,并能够逐步执行从一个到另一个的调用。
在我们的 SWIG Ruby 情况下,我们能够在 SWIG 生成的 CXX 文件或由 swig 包装的 C++ 库源中设置断点,并逐步执行 Ruby 解释器的调用。我们可以通过从 Visual Studio 中启动 ruby 作为启动项目来做到这一点。
- 这可能是关键点。在同一个解决方案中同时拥有要调试的 DLL 和正在加载 DLL 的应用程序(即使它使用 LoadLibrary 调用,因为它来自 C# 或来自 Ruby)。然后,Visual Studio 将在已调试的 DLL 中执行您的断点。如果断点没有被执行,您可能需要使用 Microsoft 的 procexp 来查看加载了哪个 DLL,以及 C# 库是否找到了与您想要的不同版本的 C++ 库。
我希望这些信息能提供一些帮助。