【问题标题】:How do debug C++ dll for a Java application如何为 Java 应用程序调试 C++ dll
【发布时间】:2012-05-13 21:15:25
【问题描述】:

我为 Java 应用程序创建了一个 C++ dll。如果我单独启动它,我的 dll 在应用程序中工作,其中包括一个非常长的批处理文件来获取所有正确的参数。我想尝试调试我在 Visual Studio 2010 中创建的 dll。我尝试将命令行和参数放入 Visual Studio 的调试属性页中。虽然我无法让应用程序正确启动。

启动应用程序的命令行如下所示,假设应用程序是 ApplicationName...

   start "ApplicationName" "C:\AppDirectory\jre\bin\javaw" -D sun.java2d.nodraw=true -Xms24m -Xmx128m -classpath "C:\AppDirectory\classes\;C:\AppDirectory\classes\iText.jar" ApplicationName

关于如何为此设置调试设置的任何想法? 关于在哪里可以找到有关此文档的任何想法?

【问题讨论】:

  • 您是否有理由不能在 C++ 中构建一个与 dll 链接并直接对其进行测试的虚拟应用程序?

标签: java c++ debugging dll visual-studio-debugging


【解决方案1】:

我会强烈考虑以下几点:

  1. 如果可能,构建 JNI,使执行工作的代码对 JNI 一无所知。让它只接收原生 C++ 内容作为参数,并返回原生 C++ 内容作为返回值,而不调用任何 JNIEnv 函数。
  2. 拥有一个 shim 层,其中包含 Java 类中本机方法的实际实现。 shim 层将知道如何调用 JNIEnv 函数来提取参数,将它们转换为本地 C++ 对象并将它们传递给工作代码。同样,这一层将知道如何将 C++ 对象转换回 Java 对象。例如,如果一个工作函数返回一个std::string,那么 shim 层将知道如何调用 JNIEnv 函数以使本机方法返回一个 Java String 回 JVM。

我知道事情不能总是以这种方式组织,但它有一些很好的优势:

  1. 它将允许您编写一个 C++ 程序来直接驱动工作代码。这可以让您更快、更轻松地测试您的代码,而不必将您的 Java 应用程序操作到它正在使用您想要测试的方式使用您的代码的状态。
  2. 您将能够仅在调试器、valgrind、内存分析器等下运行您的代码,而无需在该工具下运行整个 JVM。这样可以更加更轻松地确定哪些内存可能被泄漏、缓冲区溢出等,而不会被 JVM 内部操作引起的“噪音”淹没。

确实,这种方法意味着没有测试 shim 层。但由于 shim 层只是在 Java 世界和 C++ 世界之间转换对象,因此希望它非常简单,因此可以在完整的 Java 应用程序的上下文中进行测试。

【讨论】:

  • 如果你用 C++ 仔细编写它,你可以让 SWIG 之类的东西自动为你生成所有繁琐的 JNI 胶水。
【解决方案2】:

在我的应用程序中,我添加了在启动时检查命令行选项并在命令行选项传递给它时调用 DebugBreak 的逻辑。

我这样做是因为我的应用程序经常在相当复杂的脚本中被调用,而且有时很难甚至不可能从调试器启动应用程序并设置正确的环境(路径、环境变量、临时文件……)由脚本。

因此,如果将特定命令行选项传递给您的 DLL,只需调用 DebugBreak(请参阅 http://msdn.microsoft.com/en-us/library/windows/desktop/ms679297%28v=vs.85%29.aspx)。

当断点关闭时,JIT 调试器将显示一个弹出窗口,您可以在其中启动或附加调试器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    相关资源
    最近更新 更多