HotSpot实战的作品目录

发布网友 发布时间:2022-04-25 06:07

我来回答

2个回答

懂视网 时间:2022-04-29 23:29

是什么?在linux终端找man后,对gdb的描述如下——

/**********gdb**********/

gdb即The GNU Debugger的缩写。

gdb是一种调试工具,使用gdb可以窥探一个程序在运行时或者crash时的内部信息,主要有以下四种功能:

1、启动程序,按自定义的方式运行程序。

2、在特定条件下(即断点处)stop程序。

3、程序stop时,检查程序中所发生的事情。

4、改变程序执行环境,修正bug行为。

gdb可以调试C/C++程序,如果GNU提供了Fortran编译器的话,也可以调试Fortran程序。在shell终端启动gdb有多种方式,如下:

1、直接运行gdb而不带任何参数

$ gdb

GNU gdb (GDB) 7.5.91.20130417-cvs-ubuntu

Copyright (C) 2013 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later<http://gnu.org/licenses/gpl.html>

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law. Type "showcopying"

and "show warranty" for details.

This GDB was configured as "x86_-linux-gnu".

For bug reporting instructions, please see:

<http://www.gnu.org/software/gdb/bugs/>.

(gdb)

2、带参数运行gdb的几种形式

$ gdb program

$ gdb program core

$ gdb program pid

program是可执行文件,core是程序非法执行时coredump产生的文件,对于服务程序可指定pid,这时gdb会自动attach上去。

下面是几个常用的gdb命令:

break [file:]function

在(file文件的)function函数上设置断点。

run [arglist]

运行程序(可以指定运行参数arglist)。

bt

即backtrace,显示程序栈信息。

print expr

显示expr表达式的值。

c

即continue,继续执行程序,例如程序停在某个断点之后。

next

程序停止后执行程序下一行,会跳过function。

edit [file:]function

在程序当前停止的地方查看程序行。

list [file:]function

打印程序当前停止地方附近的文本。

step

程序停止后执行程序下一行,会进入function。

help[name]

显示提示信息,name是某个gdb命令。

quit

推出gdb。

/**********gdb**********/

下面以一个具体的例子main.c作为示例。

// main.c
#include <stdio.h>

int sum(int n)
{
 int ret = 0;
 int i = 0;
 for (i = 1; i <= n; ++i) {
 ret += i;
 }
 return ret;
}

int main(void)
{
 int n = 10;
 int result = sum(n);
 printf("result = %d
", result);
 
 return 0;
}

在linux终端编译main.c生成可执行文件test,-g生成调试信息,-o制定可执行文件名:

$ gcc -g main.c -o test

用gdb启动test:

$ gdb test

用list(缩写为l)显示sum函数的完整信息:

(gdb) list sum

1         // main.c

2         #include <stdio.h>

3

4         int sum(int n)

5         {

6             int ret = 0;

7             int i = 0;

8             for (i = 1; i <= n; ++i) {

9                 ret += i;

10         }

按回车键继续:

(gdb)

11          return ret;

12     }

13

14     int main(void)

15     {

16         int n = 10;

17         int result = sum(n);

18         printf("result = %d ", result);

19

20         return 0;

按回车键继续:

(gdb)

21     }

22

结束,再次按回车键会提示越界:

(gdb)

Line number 23 out of range; main.c has 22 lines.

用break(缩写为b)在程序第16行打断点:

(gdb) break 16

Breakpoint 1 at 0x400551: file main.c, line 16.

用b在程序sum函数处打断点:

(gdb) b sum

Breakpoint 2 at 0x40051b: file main.c, line 6.

用info(缩写为i)查看break断点信息:

(gdb) info break

Num Type Disp Enb Address What

1 breakpoint keep y 0x0000000000400551 in main at main.c:16

2 breakpoint keep y 0x000000000040051b in sum at main.c:6

用run(缩写为r)执行程序(停在了断点处):

(gdb) run

Starting program: /home/test


Breakpoint1, main () at main.c:16

16            int n = 10;

用backtrace(缩写为bt)查看函数栈:

(gdb) backtrace

#0 main () at main.c:16

用next(缩写为n)执行程序下一行:

(gdb) next

17             int result = sum(n);

用n执行程序下一行(又停在了断点处):

(gdb) n

Breakpoint 2, sum (n=10) at main.c:6

6            int ret = 0;

用n执行程序下一行:

(gdb) n

7             int i = 0;

用n执行程序下一行:

(gdb) n

8             for (i = 1; i <= n; ++i) {

用n执行程序下一行:

(gdb) n

9 ret += i;

用print(缩写为p)打印某个变量的值:

(gdb) print ret

$1 = 1

用n执行程序下一行(从9行返回到了8行):

(gdb) n

8            for (i = 1; i <= n; ++i) {

用continue(缩写为c)继续运行程序(直到下一个断点或者程序结束):

(gdb) continue

Continuing.

result = 55

[Inferior 1 (process 5540) exited normally]

如果没执行上面的continue命令,通过finish可结束当前函数:

(gdb) finish

Run till exit from #0 sum (n=10) at main.c:9

0x0000000000400562 in main () at main.c:17

17     int result = sum(n);

Value returned is $2 = 55

用quit(缩写为q)退出gdb:

(gdb) quit


初识gdb

标签:gdb

热心网友 时间:2022-04-29 20:37

第1章 初识HotSpot
1.1 JDK概述
1.1.1 JCP与JSR
1.1.2 JDK的发展历程
1.1.3 Java 7的语法变化
1.2 动手编译虚拟机
1.2.1 源代码下载
1.2.2 HotSpot源代码结构
1.2.3 搭建编译环境
1.2.4 编译目标
1.2.5 编译过程
1.2.6 编译常见问题
1.3 实战:在HotSpot内调试HelloWorld
1.3.1 认识GDB
1.3.2 准备调试脚本
1.4 小结
第2章 启动
2.1 HotSpot内核
2.1.1 如何阅读源代码
2.1.2 HotSpot内核框架
2.1.3 Prims
2.1.4 Services
2.1.5 Runtime
2.2 启动
2.2.1 Launcher
2.2.2 虚拟机生命周期
2.2.3 入口:main函数
2.2.4 主线程
2.2.5 InitializeJVM函数
2.2.6 JNI_CreateJavaVM函数
2.2.7 调用Java主方法
2.2.8 JVM退出路径
2.3 系统初始化
2.3.1 配置OS模块
2.3.2 配置系统属性
2.3.3 加载系统库
2.3.4 启动线程
2.3.5 vm_init_globals函数:初始化全局数据结构
2.3.6 init_globals函数:初始化全局模块
2.4 小结
第3章 类与对象
3.1 对象表示机制
3.1.1 OOP-Klass二分模型
3.1.2 Oops模块
3.1.3 OOP框架与对象访问机制
3.1.4 Klass与instanceKlass
3.1.5 实战:用HSDB调试HotSpot
3.2 类的状态转换
3.2.1 入口:Class文件
3.2.2 类的状态
3.2.3 加载
3.2.4 链接
3.2.5 初始化
3.2.6 实战:类的“族谱”
3.2.7 实战:系统字典
3.3 创建对象
3.3.1 实例对象的创建流程
3.3.2 实战:探测JVM内部对象
3.4 小结
第4章 运行时数据区
4.1 堆
4.1.1 Java的自动内存管理
4.1.2 堆的管理
4.2 线程私有区域
4.2.1 PC
4.2.2 JVM栈
4.3 方法区
4.3.1 纽带作用
4.3.2 常量池
4.3.3 常量池缓存:ConstantPoolCache
4.3.4 方法的表示:methodOop
4.3.5 方法的解析:将符号引用转换成直接引用
4.3.6 代码放在哪里:ConstMethodOop
4.3.7 实战:探测运行时常量池
4.4 性能监控数据区:Perf Data
4.4.1 描述这段空间:PerfMemory
4.4.2 查看
4.4.3 生产
4.5 转储
4.5.1 用VisualVM进行转储分析
4.5.2 JVM Crash
4.6 小结
第5章 垃圾收集
5.1 堆与GC
5.1.1 垃圾收集
5.1.2 分代收集
5.1.3 快速分配
5.1.4 栈上分配和逸出分析
5.1.5 GC公共模块
5.2 垃圾收集器
5.2.1 设计演进
5.2.2 CMS收集器
5.2.3 G1收集器
5.3 实战:性能分析方法
5.3.1 获取GC日志
5.3.2 GC监控信息
5.3.3 内存分析工具
5.3.4 选择合适的收集器与GC性能评估
5.3.5 不要忽略JVM Crash日志
5.4 小结
第6章 栈
6.1 硬件背景:了解真实机器
6.1.1 程序是如何运行的
6.1.2 x86与栈帧
6.1.3 ARM对Java硬件级加速:Jazelle技术
6.2 Java栈
6.2.1 寄存器式指令集与栈式指令集
6.2.2 HotSpot中的栈
6.2.3 栈帧
6.2.4 充分利用寄存器资源
6.2.5 虚拟机如何调用Java函数
6.2.6 优化:栈顶缓存
6.2.7 实战:操作数栈
6.3 小结
第7章 解释器和即时编译器
7.1 概述
7.2 解释器如何工作
7.2.1 Interpreter模块
7.2.2 Code模块
7.2.3 字节码表
7.2.4 Code Cache
7.2.5 InterpreterCodelet与Stubs队列
7.2.6 Code生成器
7.2.7 模板表与转发表
7.2.8 实战:InterpreterCodelet
7.3 即时编译器
7.3.1 概述
7.3.2 编译器模块
7.3.3 编译器的基本结构
7.3.4 实战:编译原理实践,了解编译中间环节
7.4 小结
第8章 指令集
8.1 再说栈式指令集
8.2 数据传送
8.2.1 局部变量、常量池和操作数栈之间的数据传送
8.2.2 数据传送指令
8.2.4 实战:数组的越界检查
8.3 类型转换
8.4 对象的创建和操作
8.5 程序流程控制
8.5.1 控制转移指令
8.5.2 条件转移
8.5.3 无条件转移
8.5.4 复合条件转移
8.5.5 实战:switch语句如何使用String
8.6 运算
8.6.1 加法:iadd
8.6.2 取负:ineg
8.7 函数的调用和返回
8.7.1 Java函数分发机制:VTABLE与ITABLE
8.7.2 invoke系列指令
8.7.3 动态分发:覆盖
8.7.4 静态分发:重载
8.8 异常
8.8.1 异常表
8.8.2 创建异常
8.8.3 try-catch
8.8.4 finally
8.9 小结
第9章 虚拟机监控工具
9.1 Attach机制
9.1.1 AttachProvider与VirtualMachine
9.1.2 命令的下发:execute()
9.1.3 命令的执行:Attach Listener守护线程
9.2 查看JVM进程
9.2.1 用jps查看Java进程
9.2.2 实战:定制jps,允许查看库路径
9.3 查看和配置JVM
9.3.1 用jinfo查看JVM参数配置
9.3.2 实战:扩展flags选项,允许查看命令行参数
9.4 堆内存转储工具
9.4.1 Heap Dump
9.4.2 原理
9.5 堆转储分析
9.5.1 Heap Dump分析工具:jhat
9.5.2 实战:MAT分析过程
9.6 线程转储分析
9.6.1 jstack
9.6.2 实战:如何分析资源等待
9.7 小结

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com