2014-07-16 35 views
0

我在Netbeans 7.2中使用GDB 7.4构建了一个(定制的)1.8 HotSpot虚拟机,该工具用于执行Java程序。我想通过调用由JNI调用的破坏对象头的本地函数来调试程序产生的SIGSEGV。在Netbeans中调试热点虚拟机

不过,我在调试HotSpot虚拟机时遇到了一些问题:在调用java.c中的main函数之前,我有几个断点。有时候,它们会触发,有时主函数会在没有所有断点停止之前执行。最远我可以得到的是

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

之后,一个脚步贯穿整个Java程序,最终触发SIGSEGV。该调用导致JNI API,因此我将“hotspot/src/share/vm/prims”目录包含在调试部分的源代码目录中。但是,我看不到任何效果。有没有人有一个想法,我可以如何进入调用Java主要方法的C++方法?

当SIGSEGV导致Netbeans调试视图停止时,调用堆栈会显示预期的调用堆栈。但是,它不是C++代码,而是显示汇编代码,同时显示C++类的名称。最初的调用者是“??()”。有什么方法可以查看C++代码,还是需要手动将汇编代码映射到C++代码?我读了一个伟大的article by Volker Simonis,他描述了这样的未知帧与生成的代码有关。然而,我仍然感到困惑的是,连续的调用者框架显示类和方法名称。这是源查找的问题还是仅仅涉及到第一个未知帧?

回答

0

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