1

I have created a C++ dll for a java application. I have the dll working within the application if I launch it separately, which includes a very lengthy batch file to get all of the correct arguments. I would like to try an debug the dll that I created in Visual Studio 2010. I have tried putting the command line and arguments into the debugging property page in visual studio. Although I am not able to get the application to launch correctly.

The command line to launch the application looks like this assuming the application is 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

Any ideas on how to property setup the debug settings for this? Any ideas on where I could find some documentation on this?

4

2 回答 2

1

我会强烈考虑以下几点:

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

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

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

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

于 2012-05-13T22:14:45.150 回答
0

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

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

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

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

于 2012-05-13T21:27:39.730 回答