void pmcpl_annotate_process(struct pmcstat_process *pp, struct pmcstat_pmcrecord *pmcr, uint32_t nsamples, uintfptr_t *cc, int usermode, uint32_t cpu) { struct pmcstat_pcmap *map; struct pmcstat_symbol *sym; uintfptr_t newpc; struct pmcstat_image *image; (void) pmcr; (void) nsamples; (void) usermode; (void) cpu; map = pmcstat_process_find_map(usermode ? pp : pmcstat_kernproc, cc[0]); if (map == NULL) { /* Unknown offset. */ pmcstat_stats.ps_samples_unknown_offset++; return; } assert(cc[0] >= map->ppm_lowpc && cc[0] < map->ppm_highpc); image = map->ppm_image; newpc = cc[0] - (map->ppm_lowpc + (image->pi_vaddr - image->pi_start)); sym = pmcstat_symbol_search(image, newpc); if (sym == NULL) return; fprintf(args.pa_graphfile, "%p %s 0x%jx 0x%jx\n", (void *)cc[0], pmcstat_string_unintern(sym->ps_name), (uintmax_t)(sym->ps_start + image->pi_vaddr), (uintmax_t)(sym->ps_end + image->pi_vaddr)); }
void pmcpl_annotate_cg_process(struct pmcstat_process *pp, struct pmcstat_pmcrecord *pmcr, uint32_t nsamples, uintfptr_t *cc, int usermode, uint32_t cpu) { struct pmcstat_pcmap *map; struct pmcstat_symbol *sym; uintfptr_t newpc; struct pmcstat_image *image; int i; char filename[PATH_MAX], funcname[PATH_MAX]; unsigned sline; (void) pmcr; (void) nsamples; (void) usermode; (void) cpu; for (i = 0; i < (int) nsamples; i++) { map = NULL; sym = NULL; image = NULL; filename[0] = '\0'; funcname[0] = '\0'; sline = 0; map = pmcstat_process_find_map(usermode ? pp : pmcstat_kernproc, cc[i]); if (map != NULL) { assert(cc[i] >= map->ppm_lowpc && cc[i] < map->ppm_highpc); image = map->ppm_image; newpc = cc[i] - (map->ppm_lowpc + (image->pi_vaddr - image->pi_start)); sym = pmcstat_symbol_search(image, newpc); } if (map != NULL && image != NULL && sym != NULL) { (void) pmcstat_image_addr2line(image, cc[i], filename, sizeof(filename), &sline, funcname, sizeof(funcname)); } if (map != NULL && sym != NULL) { fprintf(args.pa_graphfile, "%p %s %s:%d\n", (void *)(intptr_t)cc[i], funcname, filename, sline); } else { fprintf(args.pa_graphfile, "%p <unknown> ??:0\n", (void *)(intptr_t)cc[i]); } } fprintf(args.pa_graphfile, "--\n"); }