middle of porting; unstable, don't checkout, added xml check output; refs #1
This commit is contained in:
@@ -88,22 +88,22 @@ namespace mrw {
|
||||
//----------------------------------------------------------------------------
|
||||
mrw::StackTrace::StackTrace() throw(std::bad_exception) {
|
||||
// maximum trace level is limited here to 50, see below why
|
||||
# if defined(__GNUG__)
|
||||
{
|
||||
# define PUSH(i) \
|
||||
(__builtin_frame_address(i)!=0 ? \
|
||||
(_trace.push_back(__builtin_return_address(i)), true) : false)
|
||||
PUSH(0) && PUSH(1) && PUSH(2) && PUSH(3) && PUSH(4) && PUSH(5) &&
|
||||
PUSH(6) && PUSH(7) && PUSH(8) && PUSH(9) && PUSH(10) && PUSH(11) &&
|
||||
PUSH(12) && PUSH(13) && PUSH(14) && PUSH(15) && PUSH(16) && PUSH(17)
|
||||
&& PUSH(18) && PUSH(19) && PUSH(20) && PUSH(21) && PUSH(22) &&
|
||||
PUSH(23) && PUSH(24) && PUSH(25) && PUSH(26) && PUSH(27) && PUSH(28)
|
||||
&& PUSH(29) && PUSH(30) && PUSH(31) && PUSH(32) && PUSH(33) &&
|
||||
PUSH(34) && PUSH(35) && PUSH(36) && PUSH(37) && PUSH(38) && PUSH(39)
|
||||
&& PUSH(40) && PUSH(41) && PUSH(42) && PUSH(43) && PUSH(44) &&
|
||||
PUSH(45) && PUSH(46) && PUSH(47) && PUSH(48) && PUSH(49);
|
||||
# undef PUSH
|
||||
}
|
||||
# if defined(__GNUG__)
|
||||
{
|
||||
# define PUSH(i) \
|
||||
(__builtin_frame_address(i)!=0 ? \
|
||||
(_trace.push_back(__builtin_return_address(i)), true) : false)
|
||||
PUSH(0) && PUSH(1) && PUSH(2) && PUSH(3) && PUSH(4) && PUSH(5) &&
|
||||
PUSH(6) && PUSH(7) && PUSH(8) && PUSH(9) && PUSH(10) && PUSH(11) &&
|
||||
PUSH(12) && PUSH(13) && PUSH(14) && PUSH(15) && PUSH(16) && PUSH(17)
|
||||
&& PUSH(18) && PUSH(19) && PUSH(20) && PUSH(21) && PUSH(22) &&
|
||||
PUSH(23) && PUSH(24) && PUSH(25) && PUSH(26) && PUSH(27) && PUSH(28)
|
||||
&& PUSH(29) && PUSH(30) && PUSH(31) && PUSH(32) && PUSH(33) &&
|
||||
PUSH(34) && PUSH(35) && PUSH(36) && PUSH(37) && PUSH(38) && PUSH(39)
|
||||
&& PUSH(40) && PUSH(41) && PUSH(42) && PUSH(43) && PUSH(44) &&
|
||||
PUSH(45) && PUSH(46) && PUSH(47) && PUSH(48) && PUSH(49);
|
||||
# undef PUSH
|
||||
}
|
||||
# elif defined(__GLIBC__)
|
||||
{
|
||||
const int TRACE_LEVEL(50);
|
||||
@@ -332,15 +332,18 @@ mrw::StackTrace::BinFiles mrw::StackTrace::filename()
|
||||
std::string range, perm, x1, x2, size, lib;
|
||||
while (getline(is, s)) try {
|
||||
range = perm = x1 = x2 = size = lib = "????";
|
||||
s>>range>>perm>>x1>>x2>>size>>lib;
|
||||
range.resize(range.find_first_not_of("0123456789abcdefABCDEF"));
|
||||
void* addr(0);
|
||||
range>>addr;
|
||||
// added check: no names in brackets: [lib], because there are
|
||||
// [heap], [stack] and [vdso] that cannot be loaded
|
||||
// question: should only files with ending '.so' be loaded?
|
||||
if (lib.size() && lib[0]!='[' && lib[lib.size()-1]!=']' && addr>0)
|
||||
res<<BinFiles::value_type(lib, addr);
|
||||
s>>range>>perm>>x1>>x2>>size;
|
||||
if (mrw::to<int>(size)>0) {
|
||||
s>>lib;
|
||||
range.resize(range.find_first_not_of("0123456789abcdefABCDEF"));
|
||||
void* addr(0);
|
||||
range>>addr;
|
||||
// added check: no names in brackets: [lib], because there are
|
||||
// [heap], [stack] and [vdso] that cannot be loaded
|
||||
// question: should only files with ending '.so' be loaded?
|
||||
if (lib.size() && lib[0]!='[' && lib[lib.size()-1]!=']' && addr>0)
|
||||
res<<BinFiles::value_type(lib, addr);
|
||||
}
|
||||
} catch (...) {} // ignore non matching lines
|
||||
return res;
|
||||
}
|
||||
|
Reference in New Issue
Block a user