如何调试 java 应用程序未加载的 dll。
场景是这样的:我的 java 应用程序正在加载使用另一个 dll 的 jni.dll,而该 dll 正在使用另一个 dll。
java<->jni.dll<->dll<->dll
我有所有模块的源代码
我在调试 jni.dll 时使用了 Visual Studio Express,但我应该怎么做才能调试其他 dll?
如何调试 java 应用程序未加载的 dll。
场景是这样的:我的 java 应用程序正在加载使用另一个 dll 的 jni.dll,而该 dll 正在使用另一个 dll。
java<->jni.dll<->dll<->dll
我有所有模块的源代码
我在调试 jni.dll 时使用了 Visual Studio Express,但我应该怎么做才能调试其他 dll?
但这是一样的。
我也这样做,所以让我解释一下我的工作集。
我正在使用 eclipse 3.1 和 Visual C++ 2003 7.1.3088(德语...对不起;))和 Windows XP。我在 java 中加载 some_jni.dll 和 some.dll 并使用 jni 类。some.dll 在内部加载 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++ 断点处停止。
我半年前就这样做了,但这应该是正确的步骤。
它希望你得到它。
在 Visual Studio 中,您可以使调试器适应正在运行的 Java 进程。当 C++ 代码中的断点被命中时,调试器将在 Visual Studio 中显示并停止进程。
目前我没有安装 Visual Studio,但在调试选项中有一个窗口,您可以在其中看到所有正在运行的进程。查找 java 进程并将该进程添加到调试会话。
当 dll 执行断点所在的行时,您将看到它。
编辑:您必须使用调试信息而不是在发布模式下编译的 dll,否则 Visual Studio 中的调试器将不会在断点处停止!
作为替代方案,请尝试 IKVM。http://www.ikvm.net/
自从我上次这样做以来已经有很长时间了,即便如此,它还是在 Linux 和 Solaris 上。一个不完整的解决方案是使用“”在您的 DLL 中嵌入“硬编码断点_asm int 3;
”
每当 Windows 执行此指令时,它都会让桌面用户有机会将适当配置的调试器附加到受影响的进程。
它不像将调试器指向已知的进程 ID 那样顺利,但它应该能让你继续前进。
M。
一种粗略的做法是在要调试的 dll 中创建一个无限循环:
int x = 1;
while(x);
一旦 Java 应用程序进入此循环,通过调试器附加到此进程并将值设置x
为0
以中断循环,现在您可以使用调试器逐步完成。