Mercurial > hg > graal-jvmci-8
comparison src/os/linux/vm/os_linux.cpp @ 2022:2d4762ec74af
7003748: Decode C stack frames when symbols are presented (PhoneHome project)
Summary: Implemented in-process C native stack frame decoding when symbols are available.
Reviewed-by: coleenp, never
author | zgu |
---|---|
date | Sat, 11 Dec 2010 13:20:56 -0500 |
parents | f95d63e2154a |
children | 54f5dd2aa1d9 |
comparison
equal
deleted
inserted
replaced
1972:f95d63e2154a | 2022:2d4762ec74af |
---|---|
58 #include "runtime/threadCritical.hpp" | 58 #include "runtime/threadCritical.hpp" |
59 #include "runtime/timer.hpp" | 59 #include "runtime/timer.hpp" |
60 #include "services/attachListener.hpp" | 60 #include "services/attachListener.hpp" |
61 #include "services/runtimeService.hpp" | 61 #include "services/runtimeService.hpp" |
62 #include "thread_linux.inline.hpp" | 62 #include "thread_linux.inline.hpp" |
63 #include "utilities/decoder.hpp" | |
63 #include "utilities/defaultStream.hpp" | 64 #include "utilities/defaultStream.hpp" |
64 #include "utilities/events.hpp" | 65 #include "utilities/events.hpp" |
65 #include "utilities/growableArray.hpp" | 66 #include "utilities/growableArray.hpp" |
66 #include "utilities/vmError.hpp" | 67 #include "utilities/vmError.hpp" |
67 #ifdef TARGET_ARCH_x86 | 68 #ifdef TARGET_ARCH_x86 |
1669 bool os::dll_address_to_function_name(address addr, char *buf, | 1670 bool os::dll_address_to_function_name(address addr, char *buf, |
1670 int buflen, int *offset) { | 1671 int buflen, int *offset) { |
1671 Dl_info dlinfo; | 1672 Dl_info dlinfo; |
1672 | 1673 |
1673 if (dladdr((void*)addr, &dlinfo) && dlinfo.dli_sname != NULL) { | 1674 if (dladdr((void*)addr, &dlinfo) && dlinfo.dli_sname != NULL) { |
1674 if (buf) jio_snprintf(buf, buflen, "%s", dlinfo.dli_sname); | 1675 if (buf != NULL) { |
1675 if (offset) *offset = addr - (address)dlinfo.dli_saddr; | 1676 if(!Decoder::demangle(dlinfo.dli_sname, buf, buflen)) { |
1677 jio_snprintf(buf, buflen, "%s", dlinfo.dli_sname); | |
1678 } | |
1679 } | |
1680 if (offset != NULL) *offset = addr - (address)dlinfo.dli_saddr; | |
1676 return true; | 1681 return true; |
1677 } else { | 1682 } else if (dlinfo.dli_fname != NULL && dlinfo.dli_fbase != 0) { |
1678 if (buf) buf[0] = '\0'; | 1683 if (Decoder::decode((address)(addr - (address)dlinfo.dli_fbase), |
1679 if (offset) *offset = -1; | 1684 dlinfo.dli_fname, buf, buflen, offset) == Decoder::no_error) { |
1680 return false; | 1685 return true; |
1681 } | 1686 } |
1687 } | |
1688 | |
1689 if (buf != NULL) buf[0] = '\0'; | |
1690 if (offset != NULL) *offset = -1; | |
1691 return false; | |
1682 } | 1692 } |
1683 | 1693 |
1684 struct _address_to_library_name { | 1694 struct _address_to_library_name { |
1685 address addr; // input : memory address | 1695 address addr; // input : memory address |
1686 size_t buflen; // size of fname | 1696 size_t buflen; // size of fname |