00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094 #include "ink_config.h"
00095
00096 #if defined(linux)
00097 #include "CoreUtils.h"
00098
00099 #define __p_type p_type //ugly hack? - see resolv.h
00100 #define D(x) x
00101 intptr_t f1, f2;
00102 int framepointer = 0;
00103 int program_counter = 0;
00104 #endif // linux check
00105
00106 #if defined(darwin) || defined(freebsd) || defined(solaris) || defined(openbsd) // FIXME: solaris x86
00107
00108 #include <stdio.h>
00109 #include <stdlib.h>
00110 #include <stdint.h>
00111 #include <math.h>
00112 #include "libts.h"
00113 #include "CoreUtils.h"
00114 #endif
00115
00116 #include "EventName.h"
00117
00118 #include "http/HttpSM.h"
00119
00120 bool inTable;
00121 FILE *fp;
00122 memTable default_memTable = { 0, 0, 0 };
00123 DynArray<struct memTable>arrayMem(&default_memTable, 0);
00124
00125 HTTPHdrImpl *global_http;
00126 HttpSM *last_seen_http_sm = NULL;
00127
00128 char ethread_ptr_str[256] = "";
00129 char netvc_ptr_str[256] = "";
00130
00131 HdrHeap *swizzle_heap;
00132 char *ptr_data;
00133
00134
00135
00136 intptr_t
00137 CoreUtils::find_vaddr(intptr_t vaddr, intptr_t upper, intptr_t lower)
00138 {
00139 intptr_t index = (intptr_t) floor((double)((upper + lower) / 2));
00140
00141
00142 if (arrayMem[index].vaddr == vaddr) {
00143 inTable = true;
00144 return index + 1;
00145
00146 } else if (upper == lower) {
00147 inTable = false;
00148 return upper;
00149
00150 } else if (index == lower) {
00151 inTable = false;
00152 if ((index == 0) && (arrayMem[index].vaddr > vaddr))
00153 return 0;
00154 else
00155 return index + 1;
00156 } else {
00157 if (arrayMem[index].vaddr > vaddr)
00158 return find_vaddr(vaddr, index, lower);
00159 else
00160 return find_vaddr(vaddr, upper, index);
00161 }
00162 assert(0);
00163 return -1;
00164 }
00165
00166
00167 void
00168 CoreUtils::insert_table(intptr_t vaddr1, intptr_t offset1, intptr_t fsize1)
00169 {
00170
00171 #if 0
00172 memTable m;
00173 m.vaddr = vaddr1;
00174 m.offset = offset1;
00175 m.fsize = fsize1;
00176 #endif
00177
00178 if (arrayMem.length() == 0) {
00179 arrayMem(0);
00180 arrayMem[(intptr_t)0].vaddr = vaddr1;
00181 arrayMem[(intptr_t)0].offset = offset1;
00182 arrayMem[(intptr_t)0].fsize = fsize1;
00183 } else {
00184 intptr_t index = find_vaddr(vaddr1, arrayMem.length(), 0);
00185 if (index == arrayMem.length()) {
00186 arrayMem(index);
00187 arrayMem[index].vaddr = vaddr1;
00188 arrayMem[index].offset = offset1;
00189 arrayMem[index].fsize = fsize1;
00190 } else if (index == 0) {
00191 arrayMem(arrayMem.length());
00192 for (intptr_t i = 0; i < arrayMem.length(); i++) {
00193 arrayMem[arrayMem.length() - i - 1].vaddr = arrayMem[arrayMem.length() - i - 2].vaddr;
00194 arrayMem[arrayMem.length() - i - 1].offset = arrayMem[arrayMem.length() - i - 2].offset;
00195 arrayMem[arrayMem.length() - i - 1].fsize = arrayMem[arrayMem.length() - i - 2].fsize;
00196 }
00197 arrayMem[(intptr_t)0].vaddr = vaddr1;
00198 arrayMem[(intptr_t)0].offset = offset1;
00199 arrayMem[(intptr_t)0].fsize = fsize1;
00200 } else {
00201 arrayMem(arrayMem.length());
00202 for (intptr_t i = 1; i < arrayMem.length() - index; i++) {
00203 arrayMem[arrayMem.length() - i].vaddr = arrayMem[arrayMem.length() - i - 1].vaddr;
00204 arrayMem[arrayMem.length() - i].offset = arrayMem[arrayMem.length() - i - 1].offset;
00205 arrayMem[arrayMem.length() - i].fsize = arrayMem[arrayMem.length() - i - 1].fsize;
00206 }
00207 arrayMem[index].vaddr = vaddr1;
00208 arrayMem[index].offset = offset1;
00209 arrayMem[index].fsize = fsize1;
00210 }
00211 }
00212 }
00213
00214
00215
00216
00217 intptr_t
00218 CoreUtils::read_core_memory(intptr_t vaddr, intptr_t length, char *buf, FILE * fp)
00219 {
00220 intptr_t index = find_vaddr(vaddr, arrayMem.length(), 0);
00221 if (inTable == false)
00222 return -1;
00223 else {
00224 intptr_t offset = arrayMem[index].offset;
00225
00226 if (fseek(fp, offset, SEEK_SET) != -1) {
00227 for (int j = 0; j < length; j++) {
00228 *buf++ = (char) getc(fp);
00229 }
00230 }
00231 return 1;
00232 }
00233 }
00234
00235
00236
00237 intptr_t
00238 CoreUtils::read_core_memory(intptr_t offset, intptr_t vaddr, intptr_t length, char *buf, FILE * fp)
00239 {
00240 intptr_t index = find_vaddr(vaddr, arrayMem.length(), 0);
00241
00242 if (inTable == false)
00243 return -1;
00244 else {
00245 intptr_t offset2 = arrayMem[index].offset;
00246
00247 if (fseek(fp, offset2 + offset, SEEK_SET) != -1) {
00248 for (int j = 0; j < length; j++) {
00249 *buf++ = (char) getc(fp);
00250 }
00251 }
00252 return 1;
00253 }
00254 }
00255
00256
00257
00258
00259 intptr_t
00260 CoreUtils::read_from_core(intptr_t vaddr, intptr_t bytes, char *buf)
00261 {
00262 intptr_t index = find_vaddr(vaddr, arrayMem.length(), 0);
00263 intptr_t vadd = arrayMem[index - 1].vaddr;
00264 intptr_t offset = arrayMem[index - 1].offset;
00265 intptr_t size = arrayMem[index - 1].fsize;
00266 intptr_t offset2 = abs(vaddr - vadd);
00267
00268 if (bytes > (size - offset2))
00269 return -1;
00270 else {
00271 if (fseek(fp, offset2 + offset, SEEK_SET) != -1) {
00272 char *frameoff;
00273 if ((frameoff = (char *)ats_malloc(sizeof(char) * bytes))) {
00274 if (fread(frameoff, bytes, 1, fp) == 1) {
00275 memcpy(buf, frameoff, bytes);
00276
00277
00278
00279
00280 ats_free(frameoff);
00281 return bytes;
00282 }
00283 ats_free(frameoff);
00284 }
00285 } else
00286 return -1;
00287 }
00288
00289 return -1;
00290 }
00291
00292
00293
00294
00295 #if defined(linux)
00296
00297
00298 void
00299 CoreUtils::get_base_frame(intptr_t framep, core_stack_state *coress)
00300 {
00301
00302 intptr_t index = find_vaddr(framep, arrayMem.length(), 0);
00303 intptr_t vadd = arrayMem[index - 1].vaddr;
00304 intptr_t off = arrayMem[index - 1].offset;
00305 intptr_t off2 = abs(vadd - framep);
00306 intptr_t size = arrayMem[index - 1].fsize;
00307 intptr_t i = 0;
00308
00309 memset(coress, 0, sizeof(*coress));
00310 D(printf("stkbase=%p\n", (void*)(vadd + size)));
00311
00312 if (fseek(fp, off + off2, SEEK_SET) != -1) {
00313 void **frameoff;
00314 if ((frameoff = (void **)ats_malloc(sizeof(long)))) {
00315 if (fread(frameoff, 4, 1, fp) == 1) {
00316 coress->framep = (intptr_t) *frameoff;
00317 if (fread(frameoff, 4, 1, fp) == 1) {
00318 coress->pc = (intptr_t) *frameoff;
00319 }
00320
00321 for (i = 0; i < NO_OF_ARGS; i++) {
00322 if (fread(frameoff, 4, 1, fp) == 1) {
00323 coress->arg[i] = (intptr_t) *frameoff;
00324 }
00325 }
00326 }
00327 ats_free(frameoff);
00328 }
00329 } else {
00330 printf("Failed to seek to top of the stack\n");
00331 }
00332
00333 }
00334
00335
00336
00337 int
00338 CoreUtils::get_next_frame(core_stack_state * coress)
00339 {
00340 intptr_t i = 0;
00341 intptr_t framep = coress->framep;
00342
00343 intptr_t index = find_vaddr(framep, arrayMem.length(), 0);
00344
00345
00346 intptr_t vadd = arrayMem[index - 1].vaddr;
00347 intptr_t off = arrayMem[index - 1].offset;
00348 intptr_t off2 = abs(vadd - framep);
00349
00350
00351 if (fseek(fp, off + off2, SEEK_SET) != -1) {
00352 void **frameoff;
00353 if ((frameoff = (void **)ats_malloc(sizeof(long)))) {
00354 if (fread(frameoff, 4, 1, fp) == 1) {
00355 coress->framep = (intptr_t) *frameoff;
00356 if (*frameoff == NULL) {
00357 ats_free(frameoff);
00358 return 0;
00359 }
00360 if (fread(frameoff, 4, 1, fp) == 1) {
00361 coress->pc = (intptr_t) *frameoff;
00362 }
00363 for (i = 0; i < NO_OF_ARGS; i++) {
00364 if (fread(frameoff, 4, 1, fp) == 1) {
00365 coress->arg[i] = (intptr_t) *frameoff;
00366 }
00367 }
00368 }
00369 ats_free(frameoff);
00370 }
00371 return 1;
00372 }
00373
00374 return 0;
00375 }
00376
00377
00378 void
00379 CoreUtils::find_stuff(StuffTest_f f)
00380 {
00381 intptr_t framep = framepointer;
00382 intptr_t pc = program_counter;
00383 core_stack_state coress;
00384 intptr_t i;
00385 void *test_val;
00386 int framecount = 0;
00387
00388
00389 D(printf("\nStack Trace:\n"));
00390 D(printf("stack frame#%d framep=%p pc=%p\n", framecount, (void*)framep, (void*)pc));
00391 framecount++;
00392 get_base_frame(framep, &coress);
00393 f2 = framep;
00394 do {
00395 f1 = f2;
00396 f2 = coress.framep;
00397 D(printf
00398 ("stack frame#%d framep=%p pc=%p f1-f2=%p coress=%p %p %p %p %p\n", framecount, (void*)coress.framep, (void*)coress.pc,
00399 (void*)(f2 - f1), (void*)coress.arg[0], (void*)coress.arg[1], (void*)coress.arg[2], (void*)coress.arg[3], (void*)coress.arg[4]));
00400
00401 for (i = 0; i < NO_OF_ARGS; i++) {
00402 test_val = (void *) coress.arg[i];
00403 f(test_val);
00404 }
00405 framecount++;
00406 } while (get_next_frame(&coress) != 0);
00407 }
00408 #endif // linux check
00409
00410
00411
00412
00413 void
00414 CoreUtils::test_HdrHeap(void *arg)
00415 {
00416 HdrHeap *hheap_test = (HdrHeap *) arg;
00417 uint32_t *magic_ptr = &(hheap_test->m_magic);
00418 uint32_t magic = 0;
00419
00420 if (read_from_core((intptr_t) magic_ptr, sizeof(uint32_t), (char *) &magic) != 0) {
00421 if (magic == HDR_BUF_MAGIC_ALIVE ||
00422 magic == HDR_BUF_MAGIC_DEAD || magic == HDR_BUF_MAGIC_CORRUPT || magic == HDR_BUF_MAGIC_MARSHALED) {
00423
00424 printf("Found Hdr Heap @ 0x%p\n", arg);
00425 }
00426 }
00427 }
00428
00429
00430
00431
00432
00433
00434 #ifndef __clang_analyzer__
00435 void
00436 CoreUtils::test_HttpSM_from_tunnel(void *arg)
00437 {
00438 char *tmp = (char *) arg;
00439 intptr_t offset = (intptr_t) &(((HttpTunnel *) NULL)->sm);
00440 HttpSM **hsm_ptr = (HttpSM **) (tmp + offset);
00441 HttpSM *hsm_test;
00442
00443 if (read_from_core((intptr_t) hsm_ptr, sizeof(HttpSM *), (char *) &hsm_test) == 0)
00444 return;
00445
00446 unsigned int *magic_ptr = &(hsm_test->magic);
00447 unsigned int magic = 0;
00448
00449 if (read_from_core((intptr_t) magic_ptr, sizeof(int), (char *) &magic) != 0) {
00450 if (magic == HTTP_SM_MAGIC_ALIVE || magic == HTTP_SM_MAGIC_DEAD) {
00451 process_HttpSM(hsm_test);
00452 }
00453 }
00454 }
00455 #endif
00456
00457
00458
00459 void
00460 CoreUtils::test_HttpSM(void *arg)
00461 {
00462 HttpSM *hsm_test = (HttpSM *) arg;
00463 unsigned int *magic_ptr = &(hsm_test->magic);
00464 unsigned int magic = 0;
00465
00466 if (read_from_core((intptr_t) magic_ptr, sizeof(int), (char *) &magic) != 0) {
00467 if (magic == HTTP_SM_MAGIC_ALIVE || magic == HTTP_SM_MAGIC_DEAD) {
00468 printf("test_HttpSM:******MATCH*****\n");
00469 process_HttpSM(hsm_test);
00470 }
00471 }
00472 }
00473
00474 void
00475 CoreUtils::process_HttpSM(HttpSM * core_ptr)
00476 {
00477
00478 if (last_seen_http_sm != core_ptr) {
00479 HttpSM *http_sm = (HttpSM *)ats_malloc(sizeof(HttpSM));
00480
00481 if (read_from_core((intptr_t) core_ptr, sizeof(HttpSM), (char *) http_sm) < 0) {
00482
00483 printf("ERROR: Failed to read httpSM @ 0x%p from core\n", core_ptr);
00484 ats_free(http_sm);
00485 return;
00486 }
00487
00488 if (http_sm->magic == HTTP_SM_MAGIC_ALIVE) {
00489 last_seen_http_sm = core_ptr;
00490
00491 if (is_debug_tag_set("magic")) {
00492 #if defined(linux)
00493 printf("\n*****match-ALIVE*****\n");
00494 #endif
00495 }
00496
00497 printf("---- Found HttpSM --- id %" PRId64 " ------ @ 0x%p -----\n\n", http_sm->sm_id, http_sm);
00498
00499 print_http_hdr(&http_sm->t_state.hdr_info.client_request, "Client Request");
00500 print_http_hdr(&http_sm->t_state.hdr_info.server_request, "Server Request");
00501 print_http_hdr(&http_sm->t_state.hdr_info.server_response, "Server Response");
00502 print_http_hdr(&http_sm->t_state.hdr_info.client_response, "Client Response");
00503
00504 dump_history(http_sm);
00505
00506 printf("------------------------------------------------\n\n\n");
00507 } else if (http_sm->magic == HTTP_SM_MAGIC_DEAD) {
00508 if (is_debug_tag_set("magic")) {
00509 #if defined(linux)
00510 printf("\n*****match-DEAD*****\n");
00511 #endif
00512 }
00513 } else {
00514 if (is_debug_tag_set("magic")) {
00515
00516 ;
00517 }
00518 }
00519
00520 ats_free(http_sm);
00521 } else
00522 printf("process_HttpSM : last_seen_http_sm == core_ptr\n");
00523 }
00524
00525
00526 void
00527 CoreUtils::print_http_hdr(HTTPHdr * h, const char *name)
00528 {
00529 HTTPHdr new_handle;
00530
00531 if (h->m_heap && h->m_http) {
00532 int r = load_http_hdr(h, &new_handle);
00533
00534 if (r > 0) {
00535 printf("----------- %s ------------\n", name);
00536 new_handle.m_mime = new_handle.m_http->m_fields_impl;
00537 new_handle.print(NULL, 0, NULL, NULL);
00538 printf("-----------------------------\n\n");
00539 }
00540 }
00541 }
00542
00543 int
00544 CoreUtils::load_http_hdr(HTTPHdr * core_hdr, HTTPHdr * live_hdr)
00545 {
00546
00547 HTTPHdr *http_hdr = core_hdr;
00548 HdrHeap *heap = (HdrHeap *) core_hdr->m_heap;
00549 HdrHeap *heap_ptr = (HdrHeap *) http_hdr->m_heap;
00550 char *buf = (char *)ats_malloc(sizeof(char) * sizeof(HdrHeap));
00551 intptr_t ptr_heaps = 0;
00552 intptr_t ptr_heap_size = 0;
00553 intptr_t ptr_xl_size = 2;
00554 intptr_t str_size = 0;
00555 intptr_t str_heaps = 0;
00556 MarshalXlate default_MarshalXlate = { 0, 0, 0 };
00557 DynArray<struct MarshalXlate>ptr_xlation(&default_MarshalXlate, 2);
00558
00559
00560 intptr_t used;
00561 intptr_t i;
00562 intptr_t copy_size;
00563
00564
00565 do {
00566 if (read_from_core((intptr_t) heap, sizeof(HdrHeap), buf) == -1) {
00567 printf("Cannot read from core\n");
00568 _exit(0);
00569 }
00570 heap = (HdrHeap *) buf;
00571 copy_size = (int) (heap->m_free_start - heap->m_data_start);
00572 ptr_heap_size += copy_size;
00573 heap = heap->m_next;
00574 } while (heap && ((intptr_t) heap != 0x1));
00575
00576 swizzle_heap = (HdrHeap *)ats_malloc(sizeof(HdrHeap));
00577 live_hdr->m_heap = swizzle_heap;
00578 ptr_data = (char *)ats_malloc(sizeof(char) * ptr_heap_size);
00579
00580
00581
00582 do {
00583 if (read_from_core((intptr_t) heap_ptr, sizeof(HdrHeap), buf) == -1) {
00584 printf("Cannot read from core\n");
00585 _exit(0);
00586 }
00587 heap_ptr = (HdrHeap *) buf;
00588 copy_size = (int) (heap_ptr->m_free_start - heap_ptr->m_data_start);
00589
00590 if (read_from_core((intptr_t) heap_ptr->m_data_start, copy_size, ptr_data) == -1) {
00591 printf("Cannot read from core\n");
00592 _exit(0);
00593 }
00594
00595 if (ptr_heaps >= ptr_xl_size) {
00596 ptr_xlation(ptr_heaps);
00597 }
00598
00599 char *data, *free, *off;
00600 data = heap_ptr->m_data_start;
00601 free = heap_ptr->m_free_start;
00602 off = (char *) (heap_ptr->m_data_start - ptr_data);
00603
00604 ptr_xlation[ptr_heaps].start = data;
00605 ptr_xlation[ptr_heaps].end = free;
00606 ptr_xlation[ptr_heaps].offset = off;
00607 ptr_data += copy_size;
00608 ptr_heaps++;
00609 heap_ptr = heap_ptr->m_next;
00610 } while (heap_ptr && ((intptr_t) heap_ptr != 0x1));
00611
00612 heap = (HdrHeap *) http_hdr->m_heap;
00613 if (read_from_core((intptr_t) heap, sizeof(HdrHeap), buf) == -1) {
00614 printf("Cannot read from core\n");
00615 _exit(0);
00616 }
00617 heap = (HdrHeap *) buf;
00618
00619 swizzle_heap->m_free_start = NULL;
00620 swizzle_heap->m_data_start = (char *) ptr_data - ptr_heap_size;
00621 swizzle_heap->m_magic = HDR_BUF_MAGIC_ALIVE;
00622 swizzle_heap->m_writeable = false;
00623 swizzle_heap->m_size = ptr_heap_size;
00624 swizzle_heap->m_next = NULL;
00625 swizzle_heap->m_free_size = 0;
00626 swizzle_heap->m_read_write_heap.m_ptr = NULL;
00627
00628
00629 swizzle_heap->m_ronly_heap[0].m_heap_start = (char *)(intptr_t)swizzle_heap->m_size;
00630 swizzle_heap->m_ronly_heap[0].m_ref_count_ptr.m_ptr = NULL;
00631
00632 for (int i = 1; i < HDR_BUF_RONLY_HEAPS; i++)
00633 swizzle_heap->m_ronly_heap[i].m_heap_start = NULL;
00634
00635
00636
00637
00638
00639 MarshalXlate str_xlation[HDR_BUF_RONLY_HEAPS + 1];
00640
00641
00642 if (heap->m_read_write_heap) {
00643 HdrStrHeap *hdr = (HdrStrHeap *) heap->m_read_write_heap.m_ptr;
00644 char *copy_start = ((char *) heap->m_read_write_heap.m_ptr) + sizeof(HdrStrHeap);
00645 char *str_hdr = (char *)ats_malloc(sizeof(char) * sizeof(HdrStrHeap));
00646 if (read_from_core((intptr_t) hdr, sizeof(HdrStrHeap), str_hdr) == -1) {
00647 printf("Cannot read from core\n");
00648 _exit(0);
00649 }
00650
00651 char *free_start = (char *) (((HdrStrHeap *) str_hdr)->m_free_start);
00652 int nto_copy = abs((char *) copy_start - free_start);
00653 ats_free(str_hdr);
00654 #if defined(__GNUC__)
00655 char rw_heap[sizeof(char) * nto_copy];
00656 #else
00657 char *rw_heap = (char *)ats_malloc(sizeof(char) * nto_copy);
00658 #endif
00659 if (read_from_core((intptr_t) copy_start, nto_copy, rw_heap) == -1) {
00660 printf("Cannot read from core\n");
00661 _exit(0);
00662 }
00663
00664 str_xlation[str_heaps].start = copy_start;
00665 str_xlation[str_heaps].end = copy_start + nto_copy;
00666 str_xlation[str_heaps].offset = (char *) (copy_start - rw_heap);
00667
00668 str_size += nto_copy;
00669 str_heaps++;
00670 #if !defined(__GNUC__)
00671 ats_free(rw_heap);
00672 #endif
00673 }
00674
00675 for (i = 0; i < HDR_BUF_RONLY_HEAPS; i++) {
00676 if (heap->m_ronly_heap[i].m_heap_start != NULL) {
00677 #if defined(__GNUC__)
00678 char ro_heap[sizeof(char) * heap->m_ronly_heap[i].m_heap_len];
00679 #else
00680 char * ro_heap = (char *)ats_malloc(sizeof(char) * heap->m_ronly_heap[i].m_heap_len);
00681 #endif
00682 if (read_from_core((intptr_t) heap->m_ronly_heap[i].m_heap_start, heap->m_ronly_heap[i].m_heap_len, ro_heap) == -1) {
00683 printf("Cannot read from core\n");
00684 _exit(0);
00685 }
00686
00687 str_xlation[str_heaps].start = heap->m_ronly_heap[i].m_heap_start;
00688 str_xlation[str_heaps].end = heap->m_ronly_heap[i].m_heap_start + heap->m_ronly_heap[i].m_heap_len;
00689 str_xlation[str_heaps].offset = (char *) (heap->m_ronly_heap[i].m_heap_start - ro_heap);
00690
00691 ink_assert(str_xlation[str_heaps].start <= str_xlation[str_heaps].end);
00692
00693 str_heaps++;
00694 str_size += heap->m_ronly_heap[i].m_heap_len;
00695 #if !defined(__GNUC__)
00696 ats_free(ro_heap);
00697 #endif
00698 }
00699 }
00700
00701
00702 swizzle_heap->m_ronly_heap[0].m_heap_len = str_size;
00703
00704 char *obj_data = swizzle_heap->m_data_start;
00705 char *mheap_end = swizzle_heap->m_data_start + swizzle_heap->m_size;
00706
00707 while (obj_data < mheap_end) {
00708 HdrHeapObjImpl *obj = (HdrHeapObjImpl *) obj_data;
00709 ink_assert(obj_is_aligned(obj));
00710
00711 switch (obj->m_type) {
00712 case HDR_HEAP_OBJ_URL:
00713 if (((URLImpl *) obj)->marshal(str_xlation, str_heaps) < 0) {
00714 goto Failed;
00715 }
00716 break;
00717 case HDR_HEAP_OBJ_HTTP_HEADER:
00718 if (((HTTPHdrImpl *) obj)->marshal(ptr_xlation, ptr_heaps, str_xlation, str_heaps) < 0) {
00719 goto Failed;
00720 }
00721 live_hdr->m_http = (HTTPHdrImpl *) obj;
00722 break;
00723 case HDR_HEAP_OBJ_FIELD_BLOCK:
00724 if (((MIMEFieldBlockImpl *) obj)->marshal(ptr_xlation, ptr_heaps, str_xlation, str_heaps) < 0) {
00725 goto Failed;
00726 }
00727 break;
00728 case HDR_HEAP_OBJ_MIME_HEADER:
00729 if (((MIMEHdrImpl *) obj)->marshal(ptr_xlation, ptr_heaps, str_xlation, str_heaps)) {
00730 goto Failed;
00731 }
00732 break;
00733 case HDR_HEAP_OBJ_EMPTY:
00734 break;
00735 case HDR_HEAP_OBJ_RAW:
00736
00737
00738 if (obj->m_length <= 0) {
00739 ink_assert(0);
00740 goto Failed;
00741 }
00742
00743 break;
00744 default:
00745 ink_release_assert(0);
00746 }
00747 obj_data = obj_data + obj->m_length;
00748 }
00749
00750
00751 used = ptr_heap_size + str_size + HDR_HEAP_HDR_SIZE;
00752 used = ROUND(used, HDR_PTR_SIZE);
00753
00754 return used;
00755
00756 Failed:
00757 swizzle_heap->m_magic = HDR_BUF_MAGIC_CORRUPT;
00758 return -1;
00759
00760 }
00761
00762 void
00763 CoreUtils::dump_history(HttpSM * hsm)
00764 {
00765 printf("-------- Begin History -------------\n");
00766
00767
00768 for (int i = 0; i < hsm->history_pos; i++) {
00769 int r = (int) hsm->history[i].reentrancy;
00770 int e = (int) hsm->history[i].event;
00771 char *fileline = load_string(hsm->history[i].fileline);
00772
00773 fileline = (fileline != NULL) ? fileline : ats_strdup("UNKNOWN");
00774
00775 printf("%d %d %s", e, r, fileline);
00776
00777 char buffer[32];
00778 const char *msg = event_int_to_string(e, sizeof(buffer), buffer);
00779 printf(" event string: \"%s\"\n", msg);
00780
00781 ats_free(fileline);
00782 }
00783
00784 printf("-------- End History -----------\n\n");
00785 }
00786
00787 intptr_t
00788 CoreUtils::read_heap_header(intptr_t vaddr, intptr_t bytes, HdrHeap h)
00789 {
00790 intptr_t index = find_vaddr(vaddr, arrayMem.length(), 0);
00791 intptr_t vadd = arrayMem[index - 1].vaddr;
00792 intptr_t offset = arrayMem[index - 1].offset;
00793 intptr_t size = arrayMem[index - 1].fsize;
00794 intptr_t offset2 = abs(vaddr - vadd);
00795
00796 if (bytes > (size - offset2))
00797 return -1;
00798 else {
00799 if (fseek(fp, offset2 + offset, SEEK_SET) != -1) {
00800 if (fread(&h, sizeof(HdrHeap), 1, fp) > 0)
00801 return bytes;
00802 else
00803 return -1;
00804 }
00805 }
00806 return -1;
00807 }
00808
00809 void
00810 CoreUtils::process_EThread(EThread * eth_test)
00811 {
00812 char *buf = (char *)ats_malloc(sizeof(char) * sizeof(EThread));
00813
00814 if (read_from_core((intptr_t) eth_test, sizeof(EThread), buf) != -1) {
00815 EThread *loaded_eth = (EThread *) buf;
00816
00817
00818 printf("----------- EThread @ 0x%p ----------\n", eth_test);
00819 #if !defined(kfreebsd) && (defined(freebsd) || defined(darwin) || defined(openbsd))
00820 printf(" thread_id: %p\n", loaded_eth->tid);
00821 #else
00822 printf(" thread_id: %i\n", (int) loaded_eth->tid);
00823 #endif
00824
00825 }
00826
00827 ats_free(buf);
00828 }
00829
00830 static void
00831 print_netstate(NetState * n)
00832 {
00833
00834 printf(" enabled: %d\n", n->enabled);
00835 printf(" op: %d _cont: 0x%p\n", n->vio.op, n->vio._cont);
00836 printf(" nbytes: %d done: %d\n", (int)n->vio.nbytes, (int)n->vio.ndone);
00837 printf(" vc_server: 0x%p mutex: 0x%p\n\n", n->vio.vc_server, n->vio.mutex.m_ptr);
00838 }
00839
00840 void
00841 CoreUtils::process_NetVC(UnixNetVConnection * nvc_test)
00842 {
00843 char *buf = (char *)ats_malloc(sizeof(char) * sizeof(UnixNetVConnection));
00844
00845 if (read_from_core((intptr_t) nvc_test, sizeof(UnixNetVConnection), buf) != -1) {
00846 UnixNetVConnection *loaded_nvc = (UnixNetVConnection *) buf;
00847
00848
00849 char addrbuf[INET6_ADDRSTRLEN];
00850 printf("----------- UnixNetVConnection @ 0x%p ----------\n", nvc_test);
00851 printf(" ip: %s port: %d\n",
00852 ats_ip_ntop(&loaded_nvc->server_addr.sa, addrbuf, sizeof(addrbuf)),
00853 ats_ip_port_host_order(&loaded_nvc->server_addr));
00854 printf(" closed: %d\n\n", loaded_nvc->closed);
00855 printf(" read state: \n");
00856 print_netstate(&loaded_nvc->read);
00857 printf(" write state: \n");
00858 print_netstate(&loaded_nvc->write);
00859 }
00860
00861 ats_free(buf);
00862 }
00863
00864
00865 char *
00866 CoreUtils::load_string(const char *addr)
00867 {
00868 char buf[2048];
00869 int index = 0;
00870
00871 if (addr == NULL) {
00872 return ats_strdup("NONE");
00873 }
00874
00875 while (index < 2048) {
00876 if (read_from_core((intptr_t) (addr + index), 1, buf + index) < 0) {
00877 return NULL;
00878 }
00879
00880 if (buf[index] == '\0') {
00881 return ats_strdup(buf);
00882 }
00883 index++;
00884 }
00885
00886 return NULL;
00887 }
00888
00889
00890 #if defined(linux)
00891 void
00892 process_core(char *fname)
00893 {
00894 Elf32_Ehdr ehdr;
00895 Elf32_Phdr phdr;
00896 int phoff, phnum, phentsize;
00897 int framep = 0, pc = 0;
00898
00899
00900 if (!(fp = fopen(fname, "r"))) {
00901 printf("cannot open file\n");
00902 _exit(1);
00903 }
00904
00905
00906 if (fread(&ehdr, sizeof ehdr, 1, fp) != 1) {
00907 printf("Unable to read ehdr\n");
00908 _exit(1);
00909 }
00910
00911 phoff = ehdr.e_phoff;
00912
00913 phnum = ehdr.e_phnum;
00914
00915 phentsize = ehdr.e_phentsize;
00916
00917 for (int i = 0; i < phnum; i++) {
00918 if (fseek(fp, phoff + i * phentsize, SEEK_SET) == -1) {
00919 fprintf(stderr, "Unable to seek to Phdr %d\n", i);
00920 _exit(1);
00921 }
00922
00923 if (fread(&phdr, sizeof phdr, 1, fp) != 1) {
00924 fprintf(stderr, "Unable to read Phdr %d\n", i);
00925 _exit(1);
00926 }
00927 int poffset, psize;
00928 int pvaddr;
00929
00930
00931 pvaddr = phdr.p_vaddr;
00932
00933
00934 poffset = phdr.p_offset;
00935
00936
00937 psize = phdr.p_filesz;
00938
00939 if (pvaddr != 0) {
00940 CoreUtils::insert_table(pvaddr, poffset, psize);
00941 }
00942
00943 if (is_debug_tag_set("phdr")) {
00944 printf("\n******* PHDR %d *******\n", i);
00945 printf("p_type = %u ", phdr.p_type);
00946 printf("p_offset = %u ", phdr.p_offset);
00947 printf("p_vaddr = %#x ", pvaddr);
00948
00949 printf("p_paddr = %#x\n", phdr.p_paddr);
00950 printf("p_filesz = %u ", phdr.p_filesz);
00951 printf("p_memsz = %u ", phdr.p_memsz);
00952 printf("p_flags = %u ", phdr.p_flags);
00953 printf("p_align = %u\n", phdr.p_align);
00954 }
00955
00956 if (phdr.p_type == PT_NOTE) {
00957 printf("NOTE\n");
00958 if (fseek(fp, phdr.p_offset, SEEK_SET) != -1) {
00959 Elf32_Nhdr *nhdr, *thdr;
00960 if ((nhdr = (Elf32_Nhdr *)ats_malloc(sizeof(Elf32_Nhdr) * phdr.p_filesz))) {
00961 if (fread(nhdr, phdr.p_filesz, 1, fp) == 1) {
00962 int size = phdr.p_filesz;
00963 int sum = 0;
00964 thdr = nhdr;
00965 while (size) {
00966 int len;
00967
00968 len = sizeof *thdr + ((thdr->n_namesz + 3) & ~3) + ((thdr->n_descsz + 3) & ~3);
00969
00970 char *offset = (char *) (thdr + 1) + ((thdr->n_namesz + 3) & ~3);
00971
00972 if (len<0 || len> size) {
00973 _exit(1);
00974 }
00975 printf("size=%d, len=%d\n", size, len);
00976
00977 prstatus_t pstat;
00978 prstatus_t *ps;
00979 prpsinfo_t infostat, *ist;
00980 elf_gregset_t rinfo;
00981 unsigned int j;
00982
00983 switch (thdr->n_type) {
00984
00985 case NT_PRSTATUS:
00986 ps = (prstatus_t *) offset;
00987 memcpy(&pstat, ps, sizeof(prstatus_t));
00988 printf("\n*** printing registers****\n");
00989 for (j = 0; j < ELF_NGREG; j++) {
00990 rinfo[j] = pstat.pr_reg[j];
00991
00992 printf("%#x ", (unsigned int) rinfo[j]);
00993 }
00994 printf("\n");
00995
00996
00997 printf("\n**** NT_PRSTATUS ****\n");
00998
00999 printf("Process id = %d\n", pstat.pr_pid);
01000 printf("Parent Process id = %d\n", pstat.pr_ppid);
01001
01002 printf("Signal that caused this core dump is signal = %d\n", pstat.pr_cursig);
01003
01004
01005
01006
01007 printf("stack pointer = %#x\n", (unsigned int) pstat.pr_reg[SP_REGNUM]);
01008 framep = pstat.pr_reg[FP_REGNUM];
01009 pc = pstat.pr_reg[PC_REGNUM];
01010
01011 printf("frame pointer = %#x\n", (unsigned int) pstat.pr_reg[FP_REGNUM]);
01012 printf("program counter if no save = %#x\n", (unsigned int) pstat.pr_reg[PC_REGNUM]);
01013
01014 break;
01015
01016 case NT_PRPSINFO:
01017 ist = (prpsinfo_t *) offset;
01018 memcpy(&infostat, ist, sizeof(prpsinfo_t));
01019
01020 if (is_debug_tag_set("note")) {
01021 printf("\n**** NT_PRPSINFO of active process****\n");
01022 printf("process state = %c\n", infostat.pr_state);
01023 printf("Name of the executable = %s\n", infostat.pr_fname);
01024 printf("Arg List = %s\n", infostat.pr_psargs);
01025
01026 printf("process id = %d\n", infostat.pr_pid);
01027 }
01028 break;
01029 }
01030 thdr = (Elf32_Nhdr *) ((char *) thdr + len);
01031 sum += len;
01032 size -= len;
01033 }
01034 }
01035 ats_free(nhdr);
01036 }
01037 }
01038 }
01039 }
01040 framepointer = framep;
01041 program_counter = pc;
01042
01043
01044 CoreUtils::find_stuff(&CoreUtils::test_HdrHeap);
01045 CoreUtils::find_stuff(&CoreUtils::test_HttpSM);
01046
01047 fclose(fp);
01048 }
01049 #endif
01050
01051 #if !defined(linux)
01052 void
01053 process_core(char *fname)
01054 {
01055
01056 Warning("Only supported on Sparc Solaris and Linux");
01057 }
01058 #endif