如何调试java应用程序未加载的dll。
场景是这样的:我的java应用程序正在加载正在使用另一个dll的jni.dll,而dll正在使用另一个dll。
java< - > jni.dll< - > dll< - > dll
我有所有模块的源代码
我在调试jni.dll时使用visual studio express但是我该怎么做才能调试其他dll?
答案 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
以打破循环,现在您可以逐步使用调试器。