调试Netbeans中的热点虚拟机

时间:2014-07-16 14:47:45

标签: debugging netbeans jvm

我使用GDB 7.4在Netbeans 7.2中构建了一个(自定义的)1.8 HotSpot VM,用于执行Java程序。我想通过调用JNI调用的破坏对象头的本机函数来调试程序生成的SIGSEGV。

但是,调试HotSpot VM时遇到一些问题:在调用java.c中的main函数之前,我有几个断点。有时,它们会触发,有时主要功能会在没有所有断点停止之前执行。我能得到的最远的是

/* Invoke main method. */
(*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs);

之后,一个步骤贯穿整个Java程序,最终触发SIGSEGV。调用通向JNI API,因此我将“hotspot / src / share / vm / prims”目录包含在调试部分的源目录中。但是,我看不到任何效果。有没有人知道如何进入调用Java main方法的C ++方法?

当SIGSEGV导致Netbeans调试视图停止时,调用堆栈显示预期的调用堆栈。但是,它只显示汇编代码而不是C ++代码,同时显示C ++类的名称。初始调用者是“??()”。有没有办法看到C ++代码或我是否必须手动将汇编程序代码映射到C ++代码?我读了一篇很棒的article by Volker Simonis,他描述了这些未知帧与生成的代码有关。但是,我仍然感到困惑的是,连续的调用者帧显示了类和方法名称。它是源查找的问题还是只与第一个未知帧有关?

1 个答案:

答案 0 :(得分:0)

您是否在debug模式下编译热点,i。即make all_debug?如果热点是优化的,那么代码可能会以不同于源文件的顺序运行,并且某些符号可以被删除,从而阻止调试器为您提供有意义的信息,或者设置断点。