예제 #1
0
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();
        }
    }
}
예제 #2
0
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();
        }
    }
}