从java java-> jni.dll调试dll - > app.dll - > app.dll

时间:2008-12-11 16:02:53

标签: java dll java-native-interface

如何调试java应用程序未加载的dll。

场景是这样的:我的java应用程序正在加载正在使用另一个dll的jni.dll,而dll正在使用另一个dll。

java< - > jni.dll< - > dll< - > dll

我有所有模块的源代码

我在调试jni.dll时使用visual studio express但是我该怎么做才能调试其他dll?

5 个答案:

答案 0 :(得分:8)

但这是一样的。

我也这样做,所以让我解释一下我的工作集。

我正在使用eclipse 3.1和Visual C ++ 2003 7.1.3088(德语......抱歉;))和Windows XP。 我在java中加载some_jni.dll和some.dll并使用jni类。 some.dll加载internaly other.dll。 我可以在visual studio中调试some.dll和other.dll。

启动你的应用程序并在第一个jni类调用中放置一个断点。打开VS并转到(德语)“Debuggen”(调试) - > “Prozesse”(流程) 他们你会看到javaw.exe

选择javaw.exe,然后按“Anfügen”(附加)。

当我记得时,c ++中的代码页必须在VS中打开断点。当断点被自动命中时,VS将不会打开页面。 加载dll并执行放置断点的代码行时,VS中的调试器将停在此位置。 注意:只有在使用调试选项编译要调试的DLL时才会发生这种情况!否则调试器不会停在C ++断点处。

我半年前做过这个,但这应该是正确的步骤。

希望你明白。

答案 1 :(得分:1)

在visual studio中,您可以将调试器调整为正在运行的java进程。当命中C ++代码中的断点时,调试器将在visual studio中显示它并将停止该过程。

目前我没有安装Visual Studio,但在调试选项中是一个窗口,您可以在其中查看所有正在运行的进程。查找java进程并将进程添加到调试会话。

当dll执行放置断点的行时,您将看到它。

编辑: 您必须使用调试信息编译而不是在发布模式下编译,否则Visual Studio中的debuger将不会在断点处停止!

答案 2 :(得分:0)

自从我上次这样做以来已经有很长一段时间了,即便如此,它还是在Linux& Solaris操作系统。一个不完整的解决方案是在您的DLL中使用“_asm int 3;

嵌入“硬编码断点”

每当Windows执行此指令时,它都会让桌面用户有机会将适当配置的调试器附加到受影响的进程。

它不像将调试器指向已知的进程ID那么顺利,但它应该让你前进。

微米。

答案 3 :(得分:0)

作为替代方案,请尝试使用IKVM。 http://www.ikvm.net/

答案 4 :(得分:0)

一种粗略的做法是在要调试的dll中创建一个无限循环:

int x = 1;
while(x);

Java应用程序进入此循环后,通过调试器附加到此进程,并将x的值设置为0以打破循环,现在您可以逐步使用调试器。