void printSourceFileAndLine ( Ostream& os, const fileName& filename, Dl_info *info, void *addr ) { uintptr_t address = uintptr_t(addr); word myAddress = addressToWord(address); if (filename.ext() == "so") { // Convert address into offset into dynamic library uintptr_t offset = uintptr_t(info->dli_fbase); intptr_t relativeAddress = address - offset; myAddress = addressToWord(relativeAddress); } if (filename[0] == '/') { string line = pOpen ( "addr2line -f --demangle=auto --exe " + filename + " " + myAddress, 1 ); if (line == "") { os << " addr2line failed"; } else if (line == "??:0") { os << " in " << filename; } else { string cwdLine(line.replaceAll(cwd() + '/', "")); string homeLine(cwdLine.replaceAll(home(), '~')); os << " at " << homeLine.c_str(); } } }
void printSourceFileAndLine ( Ostream& os, const fileName& filename, Dl_info *info, void *addr ) { uintptr_t address = uintptr_t(addr); word myAddress = addressToWord(address); #if ! defined(darwin64) if (filename.ext() == "so") { // Convert address into offset into dynamic library uintptr_t offset = uintptr_t(info->dli_fbase); intptr_t relativeAddress = address - offset; myAddress = addressToWord(relativeAddress); } #endif if (filename[0] == '/') { string line = pOpen ( #if ! defined(darwin64) "addr2line -f --demangle=auto --exe " + filename + " " + myAddress, 1 #else "echo 'image lookup -a " + myAddress + " " + filename + "'" + " | xcrun lldb " + "-O 'target create --no-dependents -a x86_64 " + filename + "' -o '" + "target modules load -f " + filename + " __TEXT " + addressToWord(reinterpret_cast<const uintptr_t>(info->dli_fbase)) + "'" + " | tail -1" #endif ); #if defined(darwin64) { const char *buf = line.c_str(); regex_t re; regmatch_t mt[3]; int st; regcomp(&re, ".\\+at \\(.\\+\\):\\(\\d\\+\\)", REG_ENHANCED); st = regexec(&re, buf, 3, mt, 0); if (st == REG_NOMATCH) { line = "??:0"; } else { size_t len = mt[1].rm_eo - mt[1].rm_so; string fname(buf + mt[1].rm_so, len); len = mt[2].rm_eo - mt[2].rm_so; string lnum(buf + mt[2].rm_so, len); line = fname + ":" + lnum; } regfree(&re); } #endif if (line == "") { os << " addr2line failed"; } else if (line == "??:0") { line = filename; string cwdLine(line.replaceAll(cwd() + '/', "")); string homeLine(cwdLine.replaceAll(home(), '~')); os << " in " << homeLine.c_str(); } else { string cwdLine(line.replaceAll(cwd() + '/', "")); string homeLine(cwdLine.replaceAll(home(), '~')); os << " at " << homeLine.c_str(); } } }