hprof_check.c

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

C
1,150
字号
                    quote     = "";                    long_form = 1;                    max_count = 8;                    count     = 0;                    switch ( ty ) {                        case HPROF_CHAR:                             long_form = 0;                            max_count = 72;                            quote     = "\"";                            /*FALLTHRU*/                        case HPROF_INT:                        case HPROF_DOUBLE:                         case HPROF_LONG:                        case HPROF_BYTE:                         case HPROF_BOOLEAN:                        case HPROF_SHORT:                        case HPROF_FLOAT:                             check_printf("  val=%s", quote);                            for(i=0; i<num_elements; i++) {                                jvalue val;                                                                if ( i > 0 && count == 0 ) {                                    check_printf("  %s", quote);                                }                                val = read_val(&p, ty);                                check_printf_val(ty, val, long_form);                                count += 1;                                if ( count >= max_count ) {                                    check_printf("\"\n");                                    count = 0;                                }                            }                            if ( count != 0 ) {                                check_printf("%s\n", quote);                            }                            break;                    }                }                HPROF_ASSERT(type_size[ty]*num_elements==(p-psave));                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);        table_cleanup(ctab, &cmap_cleanup, NULL);        return nrecords;}/* LookupTable cleanup callback for utab */static void utab_cleanup(TableIndex i, void *key_ptr, int key_len, void*info, void*data){    UmapInfo *umap = info;    if ( umap == NULL ) {        return;    }    if ( umap->str != NULL ) {        HPROF_FREE(umap->str);        umap->str = NULL;    }}/* Check all the heap tags in a heap dump */static int check_tags(unsigned char *pstart, int nbytes){    unsigned char      *p;    int                 nrecord;    struct LookupTable *utab;    UmapInfo            umap;    check_printf("\nCHECK TAGS: starting\n");    utab    = table_initialize("temp utf8 map", 64, 64, 512, sizeof(UmapInfo));    /* Walk the tags, assumes UTF8 tags are defined before used */    p       = pstart;    nrecord = 0;    while ( p < (pstart+nbytes) ) {        unsigned     tag;        unsigned     size;        int          nheap_records;        int          npos;        char        *label;        HprofId      id, nm, sg, so, gr, gn;        int          i, li, num_elements;        HprofType    ty;        SerialNumber trace_serial_num;        SerialNumber thread_serial_num;        SerialNumber class_serial_num;        unsigned     flags;        unsigned     depth;        float        cutoff;        unsigned     temp;        jint         nblive;        jint         nilive;        jlong        tbytes;        jlong        tinsts;        jint         total_samples;        jint         trace_count;                nrecord++;        /*LINTED*/        npos = (int)(p - pstart);        tag = read_u1(&p);        (void)read_u4(&p); /* microsecs */        size = read_u4(&p);        #define CASE_TAG(name) case name: label = #name;        switch ( tag ) {            CASE_TAG(HPROF_UTF8)                CHECK_FOR_ERROR(size>=(int)sizeof(HprofId));                id = read_id(&p);                check_printf("#%d@%d: %s, sz=%d, name_id=0x%x, \"",                                 nrecord, npos, label, size, id);                num_elements = size-(int)sizeof(HprofId);                check_raw(p, num_elements);                check_printf("\"\n");                /* Create entry in umap */                umap.str = HPROF_MALLOC(num_elements+1);                (void)strncpy(umap.str, (char*)p, (size_t)num_elements);                umap.str[num_elements] = 0;                (void)table_create_entry(utab, &id, sizeof(id), &umap);                p += num_elements;                break;            CASE_TAG(HPROF_LOAD_CLASS)                CHECK_FOR_ERROR(size==2*4+2*(int)sizeof(HprofId));                class_serial_num = read_u4(&p);                CHECK_CLASS_SERIAL_NO(class_serial_num);                id = read_id(&p);                trace_serial_num = read_u4(&p);                CHECK_TRACE_SERIAL_NO(trace_serial_num);                nm = read_id(&p);                check_printf("#%d@%d: %s, sz=%d, class_serial_num=%u,"                             " id=0x%x, trace_serial_num=%u, name_id=0x%x\n",                                 nrecord, npos, label, size, class_serial_num,                                 id, trace_serial_num, nm);                break;            CASE_TAG(HPROF_UNLOAD_CLASS)                CHECK_FOR_ERROR(size==4);                class_serial_num = read_u4(&p);                CHECK_CLASS_SERIAL_NO(class_serial_num);                check_printf("#%d@%d: %s, sz=%d, class_serial_num=%u\n",                                 nrecord, npos, label, size, class_serial_num);                break;            CASE_TAG(HPROF_FRAME)                CHECK_FOR_ERROR(size==2*4+4*(int)sizeof(HprofId));                id = read_id(&p);                nm = read_id(&p);                sg = read_id(&p);                so = read_id(&p);                class_serial_num = read_u4(&p);                CHECK_CLASS_SERIAL_NO(class_serial_num);                li = read_u4(&p);                check_printf("#%d@%d: %s, sz=%d, ", nrecord, npos, label, size);                check_print_utf8(utab, "id=", id);                check_printf(" name_id=0x%x, sig_id=0x%x, source_id=0x%x,"                             " class_serial_num=%u, lineno=%d\n",                                 nm, sg, so, class_serial_num, li);                break;            CASE_TAG(HPROF_TRACE)                CHECK_FOR_ERROR(size>=3*4);                trace_serial_num = read_u4(&p);                CHECK_TRACE_SERIAL_NO(trace_serial_num);                thread_serial_num = read_u4(&p); /* Can be 0 */                num_elements = read_u4(&p);                check_printf("#%d@%d: %s, sz=%d, trace_serial_num=%u,"                             " thread_serial_num=%u, nelems=%d [",                                 nrecord, npos, label, size,                                 trace_serial_num, thread_serial_num, num_elements);                for(i=0; i< num_elements; i++) {                    check_printf("0x%x,", read_id(&p));                }                check_printf("]\n");                break;            CASE_TAG(HPROF_ALLOC_SITES)                CHECK_FOR_ERROR(size>=2+4*4+2*8);                flags = read_u2(&p);                temp  = read_u4(&p);                cutoff = *((float*)&temp);                nblive = read_u4(&p);                nilive = read_u4(&p);                tbytes = read_u8(&p);                tinsts = read_u8(&p);                num_elements     = read_u4(&p);                check_printf("#%d@%d: %s, sz=%d, flags=0x%x, cutoff=%g,"                             " nblive=%d, nilive=%d, tbytes=(%d,%d),"                             " tinsts=(%d,%d), num_elements=%d\n",                                 nrecord, npos, label, size,                                flags, cutoff, nblive, nilive,                                 jlong_high(tbytes), jlong_low(tbytes),                                jlong_high(tinsts), jlong_low(tinsts),                                num_elements);                for(i=0; i< num_elements; i++) {                    ty = read_u1(&p);                    class_serial_num = read_u4(&p);                    CHECK_CLASS_SERIAL_NO(class_serial_num);                    trace_serial_num = read_u4(&p);                    CHECK_TRACE_SERIAL_NO(trace_serial_num);                    nblive = read_u4(&p);                    nilive = read_u4(&p);                    tbytes = read_u4(&p);                    tinsts = read_u4(&p);                    check_printf("\t %d: ty=%d, class_serial_num=%u,"                                 " trace_serial_num=%u, nblive=%d, nilive=%d,"                                 " tbytes=%d, tinsts=%d\n",                                 i, ty, class_serial_num, trace_serial_num,                                 nblive, nilive, (jint)tbytes, (jint)tinsts);                }                break;            CASE_TAG(HPROF_HEAP_SUMMARY)                CHECK_FOR_ERROR(size==2*4+2*8);                nblive = read_u4(&p);                nilive = read_u4(&p);                tbytes = read_u8(&p);                tinsts = read_u8(&p);                check_printf("#%d@%d: %s, sz=%d,"                             " nblive=%d, nilive=%d, tbytes=(%d,%d),"                             " tinsts=(%d,%d)\n",                                 nrecord, npos, label, size,                                nblive, nilive,                                 jlong_high(tbytes), jlong_low(tbytes),                                jlong_high(tinsts), jlong_low(tinsts));                break;            CASE_TAG(HPROF_START_THREAD)                CHECK_FOR_ERROR(size==2*4+4*(int)sizeof(HprofId));                thread_serial_num = read_u4(&p);                CHECK_THREAD_SERIAL_NO(thread_serial_num);                id = read_id(&p);                trace_serial_num = read_u4(&p);                CHECK_TRACE_SERIAL_NO(trace_serial_num);                nm = read_id(&p);                gr = read_id(&p);                gn = read_id(&p);                check_printf("#%d@%d: %s, sz=%d, thread_serial_num=%u,"                             " id=0x%x, trace_serial_num=%u, ",                                nrecord, npos, label, size,                                 thread_serial_num, id, trace_serial_num);                check_print_utf8(utab, "nm=", id);                check_printf(" trace_serial_num=%u, nm=0x%x,"                             " gr=0x%x, gn=0x%x\n",                                 trace_serial_num, nm, gr, gn);                break;            CASE_TAG(HPROF_END_THREAD)                CHECK_FOR_ERROR(size==4);                thread_serial_num = read_u4(&p);                CHECK_THREAD_SERIAL_NO(thread_serial_num);                check_printf("#%d@%d: %s, sz=%d, thread_serial_num=%u\n",                                 nrecord, npos, label, size, thread_serial_num);                break;            CASE_TAG(HPROF_HEAP_DUMP)                check_printf("#%d@%d: BEGIN: %s, sz=%d\n",                                 nrecord, npos, label, size);                nheap_records = check_heap_tags(utab, p, size);                check_printf("#%d@%d: END: %s, sz=%d, nheap_recs=%d\n",                                 nrecord, npos, label, size, nheap_records);                p += size;                break;            CASE_TAG(HPROF_HEAP_DUMP_SEGMENT) /* 1.0.2 */                check_printf("#%d@%d: BEGIN SEGMENT: %s, sz=%d\n",                                 nrecord, npos, label, size);                nheap_records = check_heap_tags(utab, p, size);                check_printf("#%d@%d: END SEGMENT: %s, sz=%d, nheap_recs=%d\n",                                 nrecord, npos, label, size, nheap_records);                p += size;                break;            CASE_TAG(HPROF_HEAP_DUMP_END) /* 1.0.2 */                check_printf("#%d@%d: SEGMENT END: %s, sz=%d\n",                                 nrecord, npos, label, size);                break;            CASE_TAG(HPROF_CPU_SAMPLES)                CHECK_FOR_ERROR(size>=2*4);                total_samples = read_u4(&p);                trace_count = read_u4(&p);                check_printf("#%d@%d: %s, sz=%d, total_samples=%d,"                             " trace_count=%d\n",                                 nrecord, npos, label, size,                                total_samples, trace_count);                for(i=0; i< trace_count; i++) {                    num_elements = read_u4(&p);                    trace_serial_num = read_u4(&p);                    CHECK_TRACE_SERIAL_NO(trace_serial_num);                    check_printf("\t %d: samples=%d, trace_serial_num=%u\n",                                 trace_serial_num, num_elements);                }                break;            CASE_TAG(HPROF_CONTROL_SETTINGS)                CHECK_FOR_ERROR(size==4+2);                flags = read_u4(&p);                depth = read_u2(&p);                check_printf("#%d@%d: %s, sz=%d, flags=0x%x, depth=%d\n",                                 nrecord, npos, label, size, flags, depth);                break;            default:                label = "UNKNOWN";                check_printf("#%d@%d: %s, sz=%d\n",                                 nrecord, npos, label, size);                HPROF_ERROR(JNI_TRUE, "unknown record type");                p += size;                break;        }        CHECK_FOR_ERROR(p<=(pstart+nbytes));    }    check_flush();    CHECK_FOR_ERROR(p==(pstart+nbytes));    table_cleanup(utab, &utab_cleanup, NULL);    return nrecord;}/* Read the entire file into memory */static void *get_binary_file_image(char *filename, int *pnbytes){    unsigned char *image;    int            fd;    jlong          nbytes;    int            nread;    *pnbytes = 0;    fd = md_open_binary(filename);    CHECK_FOR_ERROR(fd>=0);    if ( (nbytes = md_seek(fd, (jlong)-1)) == (jlong)-1 ) {        HPROF_ERROR(JNI_TRUE, "Cannot md_seek() to end of file");    }    CHECK_FOR_ERROR(((jint)nbytes)>512);    if ( md_seek(fd, (jlong)0) != (jlong)0 ) {        HPROF_ERROR(JNI_TRUE, "Cannot md_seek() to start of file");    }    image = HPROF_MALLOC(((jint)nbytes)+1);    CHECK_FOR_ERROR(image!=NULL);    /* Read the entire file image into memory */    nread = md_read(fd, image, (jint)nbytes);    if ( nread <= 0 ) {        HPROF_ERROR(JNI_TRUE, "System read failed.");    }    CHECK_FOR_ERROR(((jint)nbytes)==nread);    md_close(fd);    *pnbytes = (jint)nbytes;    return image;}/* ------------------------------------------------------------------ */void check_binary_file(char *filename){    unsigned char *image;    unsigned char *p;    unsigned       idsize;    int            nbytes;    int            nrecords;    image = get_binary_file_image(filename, &nbytes);    if ( image == NULL ) {        check_printf("No file image: %s\n", filename);        return;    }    p = image;    CHECK_FOR_ERROR(strcmp((char*)p, gdata->header)==0);    check_printf("Filename=%s, nbytes=%d, header=\"%s\"\n",                         filename, nbytes, p);    p+=((int)strlen((char*)p)+1);    idsize = read_u4(&p);    CHECK_FOR_ERROR(idsize==sizeof(HprofId));    (void)read_u4(&p);    (void)read_u4(&p);    /* LINTED */    nrecords = check_tags(p, nbytes - (int)( p - image ) );    check_printf("#%d total records found in %d bytes\n", nrecords, nbytes);    HPROF_FREE(image);}

⌨️ 快捷键说明

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