一、背景说明
在项目正常启动后,运营一段时间后,发现java进程死掉JVM崩溃,在项目服务器中生成hs_err_pid.log 错误日志,下面介绍一下hs_err_pid.log 日志中的 Instructions 信息的解析。
二、解析 Instructions 信息中机器码信息
将 Instructions 信息中的机器码信息转换为汇编码
其中Instructions信息如下所示:
Instructions: (pc=0x00007f029d015be0)
0x00007f029d015bc0: 00 00 00 e8 18 d3 83 15 48 8b 04 24 48 83 c4 10
0x00007f029d015bd0: c5 fb 10 04 24 48 83 c4 10 4c 8b 5d 18 41 ff d3
0x00007f029d015be0: 4c 8b 5d f8 c9 5f 49 8b e3 ff e7 be 00 00 00 00
0x00007f029d015bf0: e8 05 00 00 00 e9 7b 00 00 00 48 8d 44 24 08 4c
1、准备java capstone环境
引入Maven capstone jar包
com.github.transcurity
capstone
3.0.5-rc2
2、下载capstone.dll 文件
下载地址:https://github.com/aquynh/capstone/releases 下载版本:Version 3.0.5-rc2
3、将2位机器码转换为4位机器码
在2位机器码之前统一添加0x 变为4位机器码,例如:
00 00 00 e8 18 d3 83 15 48 8b 04 24 48 83 c4 10 -> 0x00 0x00 0x00 0xe8 0x18 0xd3 0x83 0x15 0x48 0x8b 0x04 0x24 0x48 0x83 0xc4 0x10
4、编写java 代码解析将4位机器码解析为汇编码
import capstone.Capstone;
public class Tests {
/**
* 线程随机标识符
*/
private static long addr = 0x00007f029d015bc0L;
/**
* 四位机器码
*/
private static byte[] hexCodes = {
0x00,0x00,0x00,(byte)0xe8,0x18,(byte)0xd3,(byte)0x83,0x15,0x48,(byte)0x8b,0x04,0x24,0x48,(byte)0x83,(byte)0xc4,0x10};
public static void main(String[] args) {
// 设置存放capstone.dll库的路径,需要注意跟jar包的版本保持一致
System.setProperty("jna.library.path","D:\\capstone-3.0.5-rc2-win64");
Capstone capstone = new Capstone(Capstone.CS_ARCH_X86, Capstone.CS_MODE_64);
Capstone.CsInsn[] allInsn = capstone.disasm(hexCodes, addr);
for (Capstone.CsInsn csInsn : allInsn) {
System.out.printf("0x%x:\t%s\t%s\n", csInsn.address,
csInsn.mnemonic, csInsn.opStr);
}
}
}
解析结果如下所示:
0x7f029d015bc0: add byte ptr [rax], al
0x7f029d015bc2: add al, ch
0x7f029d015bc4: sbb bl, dl
0x7f029d015bc6: adc dword ptr [rip + 0x24048b48], 0x48
0x7f029d015bcd: add esp, 0x10
接下来可以借助反汇编工具将汇编码反编译成JVM 崩溃前执行的指令信息
三、参考资料
https://blog.csdn.net/qq_37549757/article/details/103778394?depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-2&utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-2
https://blog.csdn.net/qq_37549757/article/details/103805270