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 + -
显示快捷键?