Tag: gdb

使用eclipse调试OpenJDK源代码

在我的项目中,我想使用eclipse调试OpenJDK版本8的C / C ++源代码。 为此,我做了以下事情: 使用此自述 –with-debug-level=slowdebug使用–with-debug-level=slowdebug编译OpenJDK8。 将源码makefile项目导入eclipse 创建了一个eclipse运行配置,对已编译的OpenJDK的java.exe执行gdb并定位示例java程序。 在这个配置中我附加了JDK源代码目录路径,这样eclipse就可以将调试符号转换为源代码行并查看它们(显然) 通过这种方法,我可以通过java.c等文件的代码进行调试。 我的问题是,我仍然无法通过本机代码进行调试。 例如java.lang.System.currentTimeMillis() 。 对我来说,看起来这些库没有包含在eclipse gdb-run中。 我试图手动运行gdb,它仍然无法通过该代码部分进行调试。 有没有人有同样的行为,或曾经尝试调试JDK源代码? 我想我在这里遗漏了一些东西……也许我的方法对于这个任务来说是不正确的? 很高兴听到有关如何正确调试JDK源代码的任何提议。 先谢谢你。

使用GDB更改JVM中的变量值

目前我有一个简单的Java程序: public class Test { public static void main(String[] args) { boolean test = true; while (test) { System.out.println(“Hello World”); try { Thread.sleep(1000); } catch (Exception e) {} } System.out.println(“Bye-bye”); } } 它每秒打印“Hello World”。 我想使用gdb附加到进程并制作一个内存补丁,以打印“Bye-bye”来阻止它。 我知道GDB可以从其控制台获取创建的VM(JNI_GetCreatedVMs),也可以通过GetEnv的API获得env对象。 如何在JVM中找到test变量地址并将其设置为false(这是可选的)以使程序正常退出? 不确定像AttachCurrentThread这样的API,像HotSpotVirtualMachine这样的类,像jmap或jstack这样的工具会有帮助吗? 并且没有调试选项,假设使用java -cp . Test在生产中运行简单程序java -cp . Test java -cp . Test 。 提前感谢任何指导。 🙂 附加信息(跟踪状态) jmap -dump:file=hex […]

为什么java应用程序在gdb中崩溃但在现实生活中正常运行?

尝试从gdb运行java应用程序导致segfault,但单独运行app却没有。 这个应用程序是.JAR,它使用JOGL和一些内存映射来与GPU通信。 下面的Stacktrace暗示了某种内存访问问题,但我不明白它为什么会出现在GDB中而不是现实生活中。 是否有一些环境因素gdb需要知道才能正确执行? 这个问题在JVM OpenJDK 6和7以及Oracle JRE 7之间仍然存在。在启用segfault之前,oracle JRE在启动时运行得更远。 所有段错误在试验之间的发生和位置上都是一致的。 Segfault在GPU和驱动程序之间持续存在(!!):nvidia,radeon,fglrx current和fglrx beta(14.xx)。 GDB将成功附加到已经运行的程序实例,但是gDEBugger似乎不可能这样做,这最终需要工作。 没有意图使用gdb进行实际调试。 相反,我试图使用gDEBugger来执行OpenGL调试。 gDEBugger显然依赖于GDB作为其后端的一部分,因此如果GDB失败,gDEBugger也会失败。 这导致尝试单独运行gdb以隔离问题。 gDEBugger output: GDB String: [Thread debugging using libthread_db enabled] GDB String: Using host libthread_db library /lib/x86_64-linux-gnu/libthread_db.so.1 . Thread Created: 140737353893632 (LWP: 3265) Thread Created: 140737294624512 (LWP: 3266) Thread Created: 140737293571840 (LWP: 3267) Thread Created: 140737292519168 (LWP: […]