《HotSpot实战》—— 1.3 实战:在HotSpot内调试HelloWorld

    xiaoxiao2024-08-16  95

    本节书摘来异步社区《HotSpot实战》一书中的第1章,第1.3节,作者:陈涛,更多章节内容可以访问云栖社区“异步社区”公众号查看。

    1.3 实战:在HotSpot内调试HelloWorld

    本节讲解的是Java入门程序HelloWorld在HotSpot上的执行过程。我们通过一个普通Java程序的运行过程,能够以点带面地讲解到涉及HotSpot内部实现的基础概念。

    虽然是调试简单的HelloWorld程序,但在这个过程中会涉及HotSpot的基本数据结构以及环境准备等内容。理解这些,一方面使读者对HotSpot项目有个感性认识,其实调试HotSpot没有想象的那么困难,这利于我们增强驾驭HotSpot的自信心;另一方面,让我们正式接触到HotSpot的基本代码,并掌握HotSpot项目的基本调试方法。

    调试准备过程如图1-6所示,具体步骤如下。

    (1)选择调试器。

    (2)配置GDB工作目录的绝对路径。

    (3)配置JDK和动态链接库路径。

    (4)定位Launcher。

    (5)运行GDB初始化脚本,准备GDB运行环境。

    (6)设置HotSpot项目断点。

    (7)启动调试脚本。

    (8)虚拟机运行HelloWorld程序,在断点处暂停。

    (9)利用GDB命令调试HotSpot虚拟机程序的运行。

    接下来,我们先了解一下如何使用GDB调试程序,然后开启我们的调试之旅。

    1.3.1 认识GDB

    本地程序(C/C++)的调试,一般使用GDB命令。对于Java程序员来说,GDB有些陌生,其实我们只需要掌握一些基本的调试命令,便足够应付HotSpot的调试任务了。

    下面附上一些常用的GDB命令,包括断点、执行、查看代码、查看栈帧、查看数据等,如清单1-16所示。

    清单1-16断点:

    break InitializeJVM:在InitializeJVM函数入口处设置断点 break java.c:JavaMain:在源文件java.c的InitializeJVM函数入口处设置断点 break os_linux.cpp:4380:在源文件os_linux.cpp的第4380行处设置断点 break *0x8048000:在地址为0x8048000的地址处设置断点 delete 1:删除断点1 delete:删除所有断点 执行: step:执行1条语句,会进入函数 step n:执行n条语句,会进入函数 next:与step类似,但是不进入函数 next n:与step n类似,但是不进入函数 continue:继续运行 finish:运行至当前函数返回后退出 查看代码: list n:查看当前源文件中第n行的代码 list InitializeJVM:查看InitializeJVM函数开始位置的代码 list:查看更多的行 list -:查看上次查看的代码行数之前的代码 默认,GDB打印10行。若需要调整,可使用: set listsize n:调整打印行数为n行 查看栈帧: frame n:从当前栈帧移动到#n栈帧 up n:从当前栈帧向上移动n个栈帧 down n:从当前栈帧向下移动n个栈帧 select-frame:查看更多的行 backstrace:查看整个调用栈 backstrace n:与backstrace类似,只不过只查看4个栈帧 backstrace full:查看整个调用栈,另外还打印出局部变量和参数 info args:查看函数参数 info locals:查看局部变量 查看数据: print expr:查看expr的值,其中expr是源文件中的表达式 print /f expr n:以f指定的格式查看expr的值。其中f表示的格式可以为: x:十六进制整数 d:有符号整数 u:无符号整数 o:八进制整数 t:二进制整数 c:字符常量 f:浮点数 s:字符串 r:原始格式 a:地址 x 0xbfffd034:查看内存地址为0xbfffd34的值 disassemble:查看汇编代码,反汇编当前函数 info registers:查看所有寄存器的值 print $eax:以十进制形式查看寄存器
    转载请注明原文地址: https://yun.8miu.com/read-131828.html
    最新回复(0)