5806 } |
5806 } |
5807 } |
5807 } |
5808 |
5808 |
5809 //--------------------------------------------------------------------------------- |
5809 //--------------------------------------------------------------------------------- |
5810 |
5810 |
5811 static address same_page(address x, address y) { |
|
5812 intptr_t page_bits = -os::vm_page_size(); |
|
5813 if ((intptr_t(x) & page_bits) == (intptr_t(y) & page_bits)) |
|
5814 return x; |
|
5815 else if (x > y) |
|
5816 return (address)(intptr_t(y) | ~page_bits) + 1; |
|
5817 else |
|
5818 return (address)(intptr_t(y) & page_bits); |
|
5819 } |
|
5820 |
|
5821 bool os::find(address addr, outputStream* st) { |
5811 bool os::find(address addr, outputStream* st) { |
5822 Dl_info dlinfo; |
5812 Dl_info dlinfo; |
5823 memset(&dlinfo, 0, sizeof(dlinfo)); |
5813 memset(&dlinfo, 0, sizeof(dlinfo)); |
5824 if (dladdr(addr, &dlinfo)) { |
5814 if (dladdr(addr, &dlinfo)) { |
5825 #ifdef _LP64 |
5815 #ifdef _LP64 |
5841 #endif |
5831 #endif |
5842 st->cr(); |
5832 st->cr(); |
5843 |
5833 |
5844 if (Verbose) { |
5834 if (Verbose) { |
5845 // decode some bytes around the PC |
5835 // decode some bytes around the PC |
5846 address begin = same_page(addr-40, addr); |
5836 address begin = clamp_address_in_page(addr-40, addr, os::vm_page_size()); |
5847 address end = same_page(addr+40, addr); |
5837 address end = clamp_address_in_page(addr+40, addr, os::vm_page_size()); |
5848 address lowest = (address) dlinfo.dli_sname; |
5838 address lowest = (address) dlinfo.dli_sname; |
5849 if (!lowest) lowest = (address) dlinfo.dli_fbase; |
5839 if (!lowest) lowest = (address) dlinfo.dli_fbase; |
5850 if (begin < lowest) begin = lowest; |
5840 if (begin < lowest) begin = lowest; |
5851 Dl_info dlinfo2; |
5841 Dl_info dlinfo2; |
5852 if (dladdr(end, &dlinfo2) && dlinfo2.dli_saddr != dlinfo.dli_saddr |
5842 if (dladdr(end, &dlinfo2) && dlinfo2.dli_saddr != dlinfo.dli_saddr |