Beispiel #1
0
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;
 }