Closed GoogleCodeExporter closed 9 years ago
In a totally different context, I saw this text by a compiler guru:
} the compiler calls the nothrow version
} of new. When the compiler does that, by default it checks the return
} value of new for NULL, and throws an exception if it sees one.
So this may have to do with how much virtual memory you have on your machine.
What
does 'vmstat' say?
The other two failures (with heap-checker) are known -- heap-checker doesn't
work on
non-linux system. This and related constraints are documented in the README and
(especially) the INSTALL file.
Original comment by csilv...@gmail.com
on 8 Apr 2008 at 10:50
> vmstat
procs memory page disks faults cpu
r b w avm fre flt re pi po fr sr ad12 cd0 in sy cs us sy id
2 0 0 1205104 230464 951 3 4 2 1034 1380 0 0 215 24075 5228 22 4 74
Original comment by visa_des...@yahoo.com
on 9 Apr 2008 at 5:33
I also believe that exceptions are broken on FreeBSD-7.0 now if you compile
with the
system compiler. Failures may have been caused by this.
Original comment by visa_des...@yahoo.com
on 9 Apr 2008 at 5:36
Nope, exceptions work ok on FreeBSD. And still 4 self-failures.
I would like to make a suggestion: if some tests are known to fail on some
platforms
please print this explicitly. This will minimize confusion.
For example:
================================================================================
4 of 22 tests failed, 2 of 4 failures are expected on this platform (see
INSTALL file
for details)
Please report to opensource@google.com
================================================================================
Original comment by visa_des...@yahoo.com
on 9 Apr 2008 at 9:50
I don't know how to edit the "make test" output (which is generated by
automake) -- but if you do, please feel free to submit a patch!
As for the two failures that raise bad_alloc, I'm unable to reproduce them, so
I'm
afraid the onus of debugging a bit further will fall to you. It's tricky to
debug
this since most of the work is done in libc, but if you can check even that the
new(nothrow) test code is actually calling the nothrow version of new in
tcmalloc.cc,
that would be a help. Anything you could do to follow the logic in libc's
exception-handling code, beyond there, when the allocation fails, would be even
better.
Original comment by csilv...@gmail.com
on 9 Apr 2008 at 11:25
Ok, I will debug this.
Original comment by visa_des...@yahoo.com
on 9 Apr 2008 at 11:37
I am looking into this TestOneNothrowNew case.
It calls the following lines:
1. TestNothrowNew(&::operator new);
2. static void TestNothrowNew(void* (*func)(size_t, const std::nothrow_t&)) {
...
// test with new_handler:
std::set_new_handler(TestNewHandler);
TestOneNothrowNew(func); // <----
3. if ((*func)(kTooBig, std::nothrow) != 0) {
4. void* operator new(size_t size, const std::nothrow_t&) __THROW {
void* p = cpp_alloc(size, true); // <-----
5. static inline void* cpp_alloc(size_t size, bool nothrow) {
...
try {
(*nh)(); // <---- here it's not caught
} catch (const std::bad_alloc&) {
if (!nothrow) throw; // nothrow here is true
return p;
}
6. static void TestNewHandler() throw (std::bad_alloc) {
++news_handled;
throw std::bad_alloc(); // <---- here exception is thrown
}
So exception is thrown from the level 6.
But on level 5 it for some reason isn't caught and it causes:
terminate called after throwing an instance of 'std::bad_alloc'.
Original comment by visa_des...@yahoo.com
on 29 Apr 2008 at 2:24
I think we have to go back to issue 3, that exceptions are broken somehow on
your
system. Certainly this test passes on my freebsd 6.0-stable system. And your
sleuthing has determined that the code is correctly raising the right
exception, it's
just not being caught for some reason. So that argues the problem is in the
libc
exception-handling code somewhere.
Based on that, I'm going to close this as Invalid (meaning it's not a tcmalloc
bug).
But if you see evidence the problem actually is somewhere in tcmalloc, please feel
free to reopen.
craig
Original comment by csilv...@gmail.com
on 29 Apr 2008 at 7:33
I did some more troubleshooting and found that indeed it was my system that
caused
the problems related to exceptions.
It was an astray /usr/local/lib/libgcc_s.so.1 not belonging to any package that
this
testcase was linked to. This libgcc_s.so.1 belonged to some older gcc version
that
must have been left there by mistake by some ports installed earlier.
But there are 2 other cases that still fail:
FAIL: heap-checker-death_unittest.sh
FAIL: profiler_unittest.sh
Original comment by visa_des...@yahoo.com
on 29 Apr 2008 at 8:49
Original issue reported on code.google.com by
visa_des...@yahoo.com
on 8 Apr 2008 at 4:03