hprof_check.c

来自「一个小公司要求给写的很简单的任务管理系统。」· C语言 代码 · 共 1,150 行 · 第 1/3 页

C
1,150
字号
           cmap->finfo = new_finfo;       }   }   cmap->finfo[i].id = id;   cmap->finfo[i].ty = ty;}/* LookupTable callback for cmap entry cleanup */static void cmap_cleanup(TableIndex i, void *key_ptr, int key_len, void*info, void*data){    CmapInfo *cmap = info;    if ( cmap == NULL ) {        return;    }    if ( cmap->finfo != NULL ) {        HPROF_FREE(cmap->finfo);        cmap->finfo = NULL;    }}/* Case label for a switch on hprof heap dump elements */#define CASE_HEAP(name) case name: label = #name;/* Given the heap dump data and the utf8 map, check/write the heap dump. */static intcheck_heap_tags(struct LookupTable *utab, unsigned char *pstart, int nbytes){    int                 nrecords;    unsigned char      *p;    unsigned char      *psave;    struct LookupTable *ctab;    CmapInfo            cmap;    char               *label;    unsigned            tag;    HprofType           ty;    HprofId             id, id2, fr, sup;    int                 num_elements;    int                 num_bytes;    SerialNumber        trace_serial_num;    SerialNumber        thread_serial_num;    int                 npos;    int                 i;    int                 inst_size;    ctab     = table_initialize("temp ctab", 64, 64, 512, sizeof(CmapInfo));    /* First pass over heap records just fills in the CmapInfo table */    nrecords = 0;    p        = pstart;    while ( p < (pstart+nbytes) ) {        nrecords++;        /*LINTED*/        npos = (int)(p - pstart);        tag  = read_u1(&p);        switch ( tag ) {            CASE_HEAP(HPROF_GC_ROOT_UNKNOWN)                id = read_id(&p);                break;            CASE_HEAP(HPROF_GC_ROOT_JNI_GLOBAL)                id  = read_id(&p);                id2 = read_id(&p);                break;            CASE_HEAP(HPROF_GC_ROOT_JNI_LOCAL)                id = read_id(&p);                thread_serial_num = read_u4(&p);                fr = read_u4(&p);                break;            CASE_HEAP(HPROF_GC_ROOT_JAVA_FRAME)                id = read_id(&p);                thread_serial_num = read_u4(&p);                fr = read_u4(&p);                break;            CASE_HEAP(HPROF_GC_ROOT_NATIVE_STACK)                id = read_id(&p);                thread_serial_num = read_u4(&p);                break;            CASE_HEAP(HPROF_GC_ROOT_STICKY_CLASS)                id = read_id(&p);                break;            CASE_HEAP(HPROF_GC_ROOT_THREAD_BLOCK)                id = read_id(&p);                thread_serial_num = read_u4(&p);                break;            CASE_HEAP(HPROF_GC_ROOT_MONITOR_USED)                id = read_id(&p);                break;            CASE_HEAP(HPROF_GC_ROOT_THREAD_OBJ)                id = read_id(&p);                thread_serial_num = read_u4(&p);                trace_serial_num = read_u4(&p);                break;            CASE_HEAP(HPROF_GC_CLASS_DUMP)                (void)memset((void*)&cmap, 0, sizeof(cmap));                id = read_id(&p);                trace_serial_num = read_u4(&p);                {                    HprofId ld, si, pr, re1, re2;                                        sup      = read_id(&p);                    ld       = read_id(&p);                    si       = read_id(&p);                    pr       = read_id(&p);                    re1      = read_id(&p);                    re2      = read_id(&p);                    cmap.sup = sup;                }                inst_size = read_u4(&p);                cmap.inst_size = inst_size;                num_elements = read_u2(&p);                for(i=0; i<num_elements; i++) {                    (void)read_u2(&p);                    ty = read_u1(&p);                    (void)read_val(&p, ty);                }                num_elements = read_u2(&p);                for(i=0; i<num_elements; i++) {                    (void)read_id(&p);                    ty = read_u1(&p);                    (void)read_val(&p, ty);                }                num_elements = read_u2(&p);                for(i=0; i<num_elements; i++) {                    HprofType ty;                    HprofId   id;                                        id = read_id(&p);                    ty = read_u1(&p);                    add_inst_field_to_cmap(&cmap, id, ty);                }                (void)table_create_entry(ctab, &id, sizeof(id), &cmap);                break;            CASE_HEAP(HPROF_GC_INSTANCE_DUMP)                id = read_id(&p);                trace_serial_num = read_u4(&p);                id2 = read_id(&p); /* class id */                num_bytes = read_u4(&p);                p += num_bytes;                break;            CASE_HEAP(HPROF_GC_OBJ_ARRAY_DUMP)                id = read_id(&p);                trace_serial_num = read_u4(&p);                num_elements = read_u4(&p);                id2 = read_id(&p);                p += num_elements*(int)sizeof(HprofId);                break;            CASE_HEAP(HPROF_GC_PRIM_ARRAY_DUMP)                id = read_id(&p);                trace_serial_num = read_u4(&p);                num_elements = read_u4(&p);                ty = read_u1(&p);                p += type_size[ty]*num_elements;                break;            default:                label = "UNKNOWN";                check_printf("H#%d@%d %s: ERROR!\n",                                 nrecords, npos, label);                HPROF_ERROR(JNI_TRUE, "unknown heap record type");                break;        }    }    CHECK_FOR_ERROR(p==pstart+nbytes);       /* Scan again once we have our cmap */    nrecords = 0;    p        = pstart;    while ( p < (pstart+nbytes) ) {        nrecords++;        /*LINTED*/        npos = (int)(p - pstart);        tag  = read_u1(&p);        switch ( tag ) {            CASE_HEAP(HPROF_GC_ROOT_UNKNOWN)                id = read_id(&p);                check_printf("H#%d@%d %s: id=0x%x\n",                         nrecords, npos, label, id);                break;            CASE_HEAP(HPROF_GC_ROOT_JNI_GLOBAL)                id = read_id(&p);                id2 = read_id(&p);                check_printf("H#%d@%d %s: id=0x%x, id2=0x%x\n",                         nrecords, npos, label, id, id2);                break;            CASE_HEAP(HPROF_GC_ROOT_JNI_LOCAL)                id = read_id(&p);                thread_serial_num = read_u4(&p);                fr = read_u4(&p);                check_printf("H#%d@%d %s: id=0x%x, thread_serial_num=%u, fr=0x%x\n",                         nrecords, npos, label, id, thread_serial_num, fr);                break;            CASE_HEAP(HPROF_GC_ROOT_JAVA_FRAME)                id = read_id(&p);                thread_serial_num = read_u4(&p);                fr = read_u4(&p);                check_printf("H#%d@%d %s: id=0x%x, thread_serial_num=%u, fr=0x%x\n",                         nrecords, npos, label, id, thread_serial_num, fr);                break;            CASE_HEAP(HPROF_GC_ROOT_NATIVE_STACK)                id = read_id(&p);                thread_serial_num = read_u4(&p);                check_printf("H#%d@%d %s: id=0x%x, thread_serial_num=%u\n",                         nrecords, npos, label, id, thread_serial_num);                break;            CASE_HEAP(HPROF_GC_ROOT_STICKY_CLASS)                id = read_id(&p);                check_printf("H#%d@%d %s: id=0x%x\n",                         nrecords, npos, label, id);                break;            CASE_HEAP(HPROF_GC_ROOT_THREAD_BLOCK)                id = read_id(&p);                thread_serial_num = read_u4(&p);                check_printf("H#%d@%d %s: id=0x%x, thread_serial_num=%u\n",                         nrecords, npos, label, id, thread_serial_num);                break;            CASE_HEAP(HPROF_GC_ROOT_MONITOR_USED)                id = read_id(&p);                check_printf("H#%d@%d %s: id=0x%x\n",                         nrecords, npos, label, id);                break;            CASE_HEAP(HPROF_GC_ROOT_THREAD_OBJ)                id = read_id(&p);                thread_serial_num = read_u4(&p);                trace_serial_num = read_u4(&p);                CHECK_TRACE_SERIAL_NO(trace_serial_num);                check_printf("H#%d@%d %s: id=0x%x, thread_serial_num=%u,"                             " trace_serial_num=%u\n",                         nrecords, npos, label, id, thread_serial_num,                         trace_serial_num);                break;            CASE_HEAP(HPROF_GC_CLASS_DUMP)                id = read_id(&p);                trace_serial_num = read_u4(&p);                CHECK_TRACE_SERIAL_NO(trace_serial_num);                check_printf("H#%d@%d %s: id=0x%x, trace_serial_num=%u\n",                         nrecords, npos, label, id, trace_serial_num);                {                    HprofId ld, si, pr, re1, re2;                                        sup = read_id(&p);                    ld  = read_id(&p);                    si  = read_id(&p);                    pr  = read_id(&p);                    re1 = read_id(&p);                    re2 = read_id(&p);                    check_printf("  su=0x%x, ld=0x%x, si=0x%x,"                                 " pr=0x%x, re1=0x%x, re2=0x%x\n",                         sup, ld, si, pr, re1, re2);                }                inst_size = read_u4(&p);                check_printf("  instance_size=%d\n", inst_size);                                 num_elements = read_u2(&p);                for(i=0; i<num_elements; i++) {                    HprofType ty;                    unsigned  cpi;                    jvalue    val;                                        cpi = read_u2(&p);                    ty  = read_u1(&p);                    val = read_val(&p, ty);                    check_printf("  constant_pool %d: cpi=%d, ty=%d, val=",                                 i, cpi, ty);                    check_printf_val(ty, val, 1);                    check_printf("\n");                }                                num_elements = read_u2(&p);                check_printf("  static_field_count=%d\n", num_elements);                for(i=0; i<num_elements; i++) {                    HprofType ty;                    HprofId   id;                    jvalue    val;                                        id  = read_id(&p);                    ty  = read_u1(&p);                    val = read_val(&p, ty);                    check_printf("  static field %d: ", i);                    check_print_utf8(utab, "id=", id);                    check_printf(", ty=%d, val=", ty);                    check_printf_val(ty, val, 1);                    check_printf("\n");                }                                num_elements = read_u2(&p);                check_printf("  instance_field_count=%d\n", num_elements);                for(i=0; i<num_elements; i++) {                    HprofType ty;                    HprofId   id;                                        id = read_id(&p);                    ty = read_u1(&p);                    check_printf("  instance_field %d: ", i);                    check_print_utf8(utab, "id=", id);                    check_printf(", ty=%d\n", ty);                }                break;            CASE_HEAP(HPROF_GC_INSTANCE_DUMP)                id = read_id(&p);                trace_serial_num = read_u4(&p);                CHECK_TRACE_SERIAL_NO(trace_serial_num);                id2 = read_id(&p); /* class id */                num_bytes = read_u4(&p);                check_printf("H#%d@%d %s: id=0x%x, trace_serial_num=%u,"                             " cid=0x%x, nbytes=%d\n",                             nrecords, npos, label, id, trace_serial_num,                             id2, num_bytes);                /* This is a packed set of bytes for the instance fields */                if ( num_bytes > 0 ) {                    TableIndex cindex;                    int        ifield;                    CmapInfo  *map;                            cindex = table_find_entry(ctab, &id2, sizeof(id2));                    HPROF_ASSERT(cindex!=0);                    map = (CmapInfo*)table_get_info(ctab, cindex);                    HPROF_ASSERT(map!=NULL);                    HPROF_ASSERT(num_bytes==map->inst_size);                                            psave  = p;                    ifield = 0;                                        do {                        for(i=0;i<map->n_finfo;i++) {                            HprofType ty;                            HprofId   id;                            jvalue    val;                            ty = map->finfo[i].ty;                            id = map->finfo[i].id;                            HPROF_ASSERT(ty!=0);                            HPROF_ASSERT(id!=0);                            val = read_val(&p, ty);                            check_printf("  field %d: ", ifield);                            check_print_utf8(utab, "id=", id);                            check_printf(", ty=%d, val=", ty);                            check_printf_val(ty, val, 1);                            check_printf("\n");                            ifield++;                        }                        id2    = map->sup;                        map    = NULL;                        cindex = 0;                        if ( id2 != 0 ) {                            cindex = table_find_entry(ctab, &id2, sizeof(id2));                            HPROF_ASSERT(cindex!=0);                            map = (CmapInfo*)table_get_info(ctab, cindex);                            HPROF_ASSERT(map!=NULL);                        }                    } while ( map != NULL );                    HPROF_ASSERT(num_bytes==(p-psave));                }                break;            CASE_HEAP(HPROF_GC_OBJ_ARRAY_DUMP)                id = read_id(&p);                trace_serial_num = read_u4(&p);                CHECK_TRACE_SERIAL_NO(trace_serial_num);                num_elements = read_u4(&p);                id2 = read_id(&p);                check_printf("H#%d@%d %s: id=0x%x, trace_serial_num=%u, nelems=%d, eid=0x%x\n",                                 nrecords, npos, label, id, trace_serial_num, num_elements, id2);                for(i=0; i<num_elements; i++) {                    HprofId id;                                        id = read_id(&p);                    check_printf("  [%d]: id=0x%x\n", i, id);                }                break;            CASE_HEAP(HPROF_GC_PRIM_ARRAY_DUMP)                id = read_id(&p);                trace_serial_num = read_u4(&p);                CHECK_TRACE_SERIAL_NO(trace_serial_num);                num_elements = read_u4(&p);                ty = read_u1(&p);                psave = p;                check_printf("H#%d@%d %s: id=0x%x, trace_serial_num=%u, "                             "nelems=%d, ty=%d\n",                                 nrecords, npos, label, id, trace_serial_num, num_elements, ty);                HPROF_ASSERT(HPROF_TYPE_IS_PRIMITIVE(ty));                if ( num_elements > 0 ) {                    int   count;                    int   long_form;                    int   max_count;                    char *quote;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?