借助capstone解析JVM崩溃 hs_err_pid.log 日志中的机器码

一、背景说明
    在项目正常启动后,运营一段时间后,发现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包

<dependency>
    <groupId>com.github.transcurity</groupId>
    <artifactId>capstone</artifactId>
    <version>3.0.5-rc2</version>
</dependency>

     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
 

猜你喜欢

转载自blog.csdn.net/TimerBin/article/details/105628053