如何调试未由java应用程序加载的dll。
场景是这样的:我的java应用程序正在加载使用另一个dll的jni.dll,而那个dll正在使用另一个dll。
java<->jni.dll<->dll<->dll
我有所有模块的源代码
我在调试jni.dll时使用的是visual studio express,但是我应该怎么做才能调试其他dll?
发布于 2008-12-12 07:10:50
但这是一样的。
我也是这样做的,所以让我解释一下我的工作集。
我正在使用eclipse 3.1和Visual C++ 2003 7.1.3088 (德语...对不起;) )和Windows XP。我使用jni类在java中加载some_jni.dll和some.dll。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中的调试器将在此位置停止。注意:只有在使用debug选项编译要调试的dll时才会发生这种情况!否则,调试器不会在C++断点处停止。
我半年前就这样做了,但这应该是正确的步骤。
希望你能得到它。
发布于 2008-12-11 17:38:13
在visual studio中,您可以使调试器适应正在运行的java进程。当命中C++代码中的断点时,调试器将在visual studio中显示该断点,并将停止该进程。
目前,我还没有安装visual studio,但是在debug选项中有一个窗口,您可以在其中看到所有正在运行的进程。查找java进程并将该进程添加到调试会话中。
当dll执行放置断点的行时,您将看到它。
编辑:必须使用调试信息编译的dll,并且不能处于发布模式,否则visual studio中的调试器不会在断点处停止!
发布于 2008-12-11 16:22:49
自从我上次这样做已经有很长一段时间了,即使是在Linux和Solaris上也是如此。一个不完整的解决方案是在DLL中嵌入“硬编码断点”和"_asm int 3;“。
当Windows执行此指令时,它使桌面用户有机会将适当配置的调试器附加到受影响的进程。
这不像将调试器指向已知的进程ID那样流畅,但它应该可以让您继续工作。
M.
https://stackoverflow.com/questions/359851
复制相似问题