mapinfo *init_mapinfo(int pid) { mapinfo *head = NULL, *prev, *t; char data[1024]; FILE *fp; sprintf(data, "/proc/%d/maps", pid); // strcpy(data, "/proc/28037/maps"); fp = fopen(data, "r"); if(fp) { while(fgets(data, sizeof(data), fp)) { t = parse_maps_line(data); if(t){ head = t; break; } } if(!head) return NULL; prev = head; while(fgets(data, sizeof(data), fp)) { mapinfo *mi = parse_maps_line(data); if(mi) { prev->next = mi; prev = mi; } } fclose(fp); } __android_log_print(ANDROID_LOG_INFO, LOG_TAG,"init_mapinfo head=%x\n", head); return head; }
void dump_crash_report(int tfd, unsigned pid, unsigned tid, bool at_fault) { char data[1024]; FILE *fp; mapinfo *milist = 0; unsigned int sp_list[STACK_CONTENT_DEPTH]; int stack_depth; int frame0_pc_sane = 1; if (!at_fault) { _LOG(tfd, true, "--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---\n"); _LOG(tfd, true, "pid: %d, tid: %d\n", pid, tid); } dump_registers(tfd, tid, at_fault); /* Clear stack pointer records */ memset(sp_list, 0, sizeof(sp_list)); sprintf(data, "/proc/%d/maps", pid); fp = fopen(data, "r"); if(fp) { while(fgets(data, 1024, fp)) { mapinfo *mi = parse_maps_line(data); if(mi) { mi->next = milist; milist = mi; } } fclose(fp); } parse_exidx_info(milist, tid); /* If stack unwinder fails, use the default solution to dump the stack * content. */ stack_depth = unwind_backtrace_with_ptrace(tfd, tid, milist, sp_list, &frame0_pc_sane, at_fault); /* The stack unwinder should at least unwind two levels of stack. If less * level is seen we make sure at lease pc and lr are dumped. */ if (stack_depth < 2) { dump_pc_and_lr(tfd, tid, milist, stack_depth, at_fault); } dump_stack_and_code(tfd, tid, milist, stack_depth, sp_list, frame0_pc_sane, at_fault); while(milist) { mapinfo *next = milist->next; free(milist); milist = next; } }
__LIBC_HIDDEN__ mapinfo_t* mapinfo_create(pid_t pid) { struct mapinfo_t* milist = NULL; char data[1024]; // Used to read lines as well as to construct the filename. snprintf(data, sizeof(data), "/proc/%d/maps", pid); FILE* fp = fopen(data, "r"); if (fp != NULL) { while (fgets(data, sizeof(data), fp) != NULL) { mapinfo_t* mi = parse_maps_line(data); if (mi) { mi->next = milist; milist = mi; } } fclose(fp); } return milist; }
__LIBC_HIDDEN__ mapinfo *init_mapinfo(int pid) { struct mapinfo *milist = NULL; char data[1024]; sprintf(data, "/proc/%d/maps", pid); FILE *fp = fopen(data, "r"); if(fp) { while(fgets(data, sizeof(data), fp)) { mapinfo *mi = parse_maps_line(data); if(mi) { mi->next = milist; milist = mi; } } fclose(fp); } return milist; }
map_info_t* load_map_info_list(pid_t tid) { char path[PATH_MAX]; char line[1024]; FILE* fp; map_info_t* milist = NULL; snprintf(path, PATH_MAX, "/proc/%d/maps", tid); fp = fopen(path, "r"); if (fp) { while(fgets(line, sizeof(line), fp)) { map_info_t* mi = parse_maps_line(line); if (mi) { mi->next = milist; milist = mi; } } fclose(fp); } return milist; }
mapinfo *get_process_mapinfo() { char data[1024]; mapinfo *milist = 0; FILE *fp; sprintf(data, "/proc/%d/maps", getpid()); fp = fopen(data, "r"); if(fp) { while(fgets(data, 1024, fp)) { mapinfo *mi = parse_maps_line(data); if(mi) { mi->next = milist; milist = mi; } } fclose(fp); } return milist; }
mapinfo* getMapInfoList() { Mutex::Autolock _l(mLock); if (milist == 0) { char data[1024]; FILE *fp; sprintf(data, "/proc/%d/maps", getpid()); fp = fopen(data, "r"); if (fp) { while(fgets(data, 1024, fp)) { mapinfo *mi = parse_maps_line(data); if(mi) { mi->next = milist; milist = mi; } } fclose(fp); } } return milist; }