odyaka341 / thread-sanitizer

Automatically exported from code.google.com/p/thread-sanitizer
0 stars 0 forks source link

TSan fails to print all the inlined frames touching a C++ string #22

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
Running a test under ThreadSanitizer I see the following log:

$ /usr/local/google/chrome-asan/src$ out/Release/net_unittests 
--gtest_filter=DiskCacheEntryTest.SimpleCacheSizeAtCreate 2>&1 | tee log

==================
WARNING: ThreadSanitizer: data race (pid=8375)
  Read of size 4 at 0x7d1800004ff0 by thread T2:
    #0 StripTrailingSeparatorsInternal /usr/local/google/chrome-asan/src/out/Release/../../base/files/file_path.cc:1246 (exe+0x0000020ac959)
    #1 DirName base/files/file_path.cc:307 (exe+0x0000020abe72)
...
  Previous atomic write of size 4 at 0x7d1800004ff0 by thread T3:
    #0 __tsan_atomic32_fetch_add /work/chromium/src/third_party/llvm/projects/compiler-rt/lib/tsan/rtl/tsan_interface_atomic.cc:465 (exe+0x00000024f8b7)
    #1 __exchange_and_add_dispatch /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/ext/atomicity.h:80 (exe+0x0000020ab10d)
    #2 ~BindState /usr/local/google/chrome-asan/src/out/Release/../../base/bind_internal.h:2620 (exe+0x000001dc7f57)
...
==================

The address 0x0000020ac959 most certainly corresponds to _M_is_leaked(), which 
touches the string refcounter in a racy way.
The debug info for the __tsan_read4 call looks fine, but for some reason the 
debug info for the actual memory access looks different:

$ objdump --start-address=0x20ac90a --stop-address=0x20acf00 -dS 
out/Release/net_unittests | grep -C 5 "20ac959" 
    _M_is_leaked() const
        { return this->_M_refcount < 0; }
 20ac950:   49 8d 7d f8             lea    -0x8(%r13),%rdi
 20ac954:   e8 17 2c 1b fe          callq  25f570 <__tsan_read4>
       pos > start && IsSeparator(path_[pos - 1]);
 20ac959:   4d 8d 77 ff             lea    -0x1(%r15),%r14
 20ac95d:   41 83 7d f8 00          cmpl   $0x0,-0x8(%r13)
 20ac962:   78 17                   js     20ac97b <_ZN4base8FilePath31StripTrailingSeparatorsInternalEv+0xbb>
 20ac964:   48 8b 5d d0             mov    -0x30(%rbp),%rbx

Here also are the line numbers printed by llvm-symbolizer:

$ third_party/llvm-build/Release+Asserts/bin/llvm-symbolizer 
out/Release/net_unittests 0x20ac958
_M_rep
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/basic_string.
h:187:0
_M_leak
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/basic_string.
h:311:0
IsSeparator
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/basic_string.
h:841:0
base::FilePath::StripTrailingSeparatorsInternal()
/usr/local/google/chrome-asan/src/out/Release/../../base/files/file_path.cc:1246
:0

out/Release/net_unittests 0x20ac959
base::FilePath::StripTrailingSeparatorsInternal()
/usr/local/google/chrome-asan/src/out/Release/../../base/files/file_path.cc:1246
:0

out/Release/net_unittests 0x20ac95d
_M_rep
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/basic_string.
h:187:0
_M_leak
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/basic_string.
h:311:0
IsSeparator
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/basic_string.
h:841:0
base::FilePath::StripTrailingSeparatorsInternal()
/usr/local/google/chrome-asan/src/out/Release/../../base/files/file_path.cc:1246
:0

Original issue reported on code.google.com by gli...@google.com on 11 Jun 2013 at 8:41

GoogleCodeExporter commented 9 years ago
Looks like debug info is fine - if you're symbolizing 0x20ac958 which 
corresponds to the actual memory access (__tsan_read4), the stack trace is 
correct. But instead TSan passes the return address (0x20ac959) to 
llvm-symbolizer.

Original comment by samso...@google.com on 11 Jun 2013 at 9:11

GoogleCodeExporter commented 9 years ago
The second stack frame is also incorrect, there must be string-related frames.

Original comment by dvyu...@google.com on 11 Jun 2013 at 9:32

GoogleCodeExporter commented 9 years ago
Looks like it's incorrect to not subtract 1 from the top stack frame's address.
If I always set is_last to false in __tsan::SymbolizeStack(), I get the 
following stack traces:

WARNING: ThreadSanitizer: data race (pid=12529)
  Read of size 4 at 0x7d1800005050 by thread T2: 
    #0 _M_rep /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/basic_string.h:187 (net_unittests+0x0000020b30e8)
    #1 _M_leak /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/basic_string.h:311 (net_unittests+0x0000020b30e8)
    #2 IsSeparator /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/basic_string.h:841 (net_unittests+0x0000020b30e8)
    #3 base::FilePath::StripTrailingSeparatorsInternal() base/files/file_path.cc:1246 (net_unittests+0x0000020b30e8)
    #4 base::FilePath::DirName() const base/files/file_path.cc:307 (net_unittests+0x0000020b2602)
    #5 (anonymous namespace)::WriteToDiskInternal(base::FilePath const&, scoped_ptr<Pickle, base::DefaultDeleter<Pickle> >, base::TimeTicks const&, bool) net/disk_cache/simple/simple_index_file.cc:43 (net_unittests+0x000001dcc375)
    #6 Run base/bind_internal.h:355 (net_unittests+0x000001dce5b6)
    #7 MakeItSo base/bind_internal.h:957 (net_unittests+0x000001dce5b6)
    #8 base::internal::Invoker<4, base::internal::BindState<base::internal::RunnableAdapter<void (*)(base::FilePath const&, scoped_ptr<Pickle, base::DefaultDeleter<Pickle> >, base::TimeTicks const&, bool)>, void (base::FilePath const&, scoped_ptr<Pickle, base::DefaultDeleter<Pickle> >, base::TimeTicks const&, bool), void (base::FilePath, base::internal::PassedWrapper<scoped_ptr<Pickle, base::DefaultDeleter<Pickle> > >, base::TimeTicks, bool)>, void (base::FilePath const&, scoped_ptr<Pickle, base::DefaultDeleter<Pickle> >, base::TimeTicks const&, bool)>::Run(base::internal::BindStateBase*) base/bind_internal.h:1568 (net_unittests+0x000001dce5b6)
    #9 Run base/callback.h:396 (net_unittests+0x0000020c2fe1)
    #10 base::MessageLoop::RunTask(base::PendingTask const&) base/message_loop.cc:484 (net_unittests+0x0000020c2fe1)
    #11 base::MessageLoop::DeferOrRunPendingTask(base::PendingTask const&) base/message_loop.cc:496 (net_unittests+0x0000020c33c7)
    #12 base::MessageLoop::DoWork() base/message_loop.cc:688 (net_unittests+0x0000020c3929)
    #13 base::MessagePumpLibevent::Run(base::MessagePump::Delegate*) base/message_pump_libevent.cc:235 (net_unittests+0x0000020a4a93)
    #14 base::MessageLoop::RunInternal() base/message_loop.cc:441 (net_unittests+0x0000020c26a0)
    #15 base::MessageLoop::RunHandler() base/message_loop.cc:414 (net_unittests+0x0000020c2559)
    #16 base::RunLoop::Run() base/run_loop.cc:45 (net_unittests+0x0000020dae72)
    #17 base::MessageLoop::Run() base/message_loop.cc:321 (net_unittests+0x0000020c1995)
    #18 base::Thread::Run(base::MessageLoop*) base/threading/thread.cc:158 (net_unittests+0x0000020f3cc9)
    #19 base::Thread::ThreadMain() base/threading/thread.cc:203 (net_unittests+0x0000020f3e6d)
    #20 base::(anonymous namespace)::ThreadFunc(void*) base/threading/platform_thread_posix.cc:80 (net_unittests+0x0000020ece89)

  Previous atomic write of size 4 at 0x7d1800005050 by thread T3: 
    #0 __tsan_atomic32_fetch_add /usr/local/google/asan/llvm/projects/compiler-rt/lib/tsan/rtl/tsan_interface_atomic.cc:466 (net_unittests+0x0000002479b7)
    #1 __exchange_and_add_dispatch /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/ext/atomicity.h:80:9 (net_unittests+0x0000020b189d)
    #2 _M_rep /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/basic_string.h:240 (net_unittests+0x0000020b189d)
    #3 ~basic_string /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/basic_string.h:534 (net_unittests+0x0000020b189d)
    #4 ~basic_string /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/basic_string.h:534 (net_unittests+0x0000020b189d)
    #5 base::FilePath::~FilePath() base/files/file_path.cc:184 (net_unittests+0x0000020b189d)
    #6 ~BindState base/bind_internal.h:2620 (net_unittests+0x000001dce6e7)
    #7 ~BindState base/bind_internal.h:2619 (net_unittests+0x000001dce6e7)
    #8 base::internal::BindState<base::internal::RunnableAdapter<void (*)(base::FilePath const&, scoped_refptr<base::SingleThreadTaskRunner>, base::Callback<void (scoped_ptr<__gnu_cxx::hash_map<unsigned long, disk_cache::EntryMetadata, __gnu_cxx::hash<unsigned long>, std::equal_to<unsigned long>, std::allocator<disk_cache::EntryMetadata> >, base::DefaultDeleter<__gnu_cxx::hash_map<unsigned long, disk_cache::EntryMetadata, __gnu_cxx::hash<unsigned long>, std::equal_to<unsigned long>, std::allocator<disk_cache::EntryMetadata> > > >, bool)> const&)>, void (base::FilePath const&, scoped_refptr<base::SingleThreadTaskRunner>, base::Callback<void (scoped_ptr<__gnu_cxx::hash_map<unsigned long, disk_cache::EntryMetadata, __gnu_cxx::hash<unsigned long>, std::equal_to<unsigned long>, std::allocator<disk_cache::EntryMetadata> >, base::DefaultDeleter<__gnu_cxx::hash_map<unsigned long, disk_cache::EntryMetadata, __gnu_cxx::hash<unsigned long>, std::equal_to<unsigned long>, std::allocator<disk_cache::EntryMetadata> > > >, bool)> const&), void (base::FilePath, scoped_refptr<base::SingleThreadTaskRunner>, base::Callback<void (scoped_ptr<__gnu_cxx::hash_map<unsigned long, disk_cache::EntryMetadata, __gnu_cxx::hash<unsigned long>, std::equal_to<unsigned long>, std::allocator<disk_cache::EntryMetadata> >, base::DefaultDeleter<__gnu_cxx::hash_map<unsigned long, disk_cache::EntryMetadata, __gnu_cxx::hash<unsigned long>, std::equal_to<unsigned long>, std::allocator<disk_cache::EntryMetadata> > > >, bool)>)>::~BindState() base/bind_internal.h:2619 (net_unittests+0x000001dce6e7)
    #9 DeleteInternal base/memory/ref_counted.h:151 (net_unittests+0x0000020a8208)
    #10 Destruct base/memory/ref_counted.h:114 (net_unittests+0x0000020a8208)
    #11 Release base/memory/ref_counted.h:142 (net_unittests+0x0000020a8208)
    #12 ~scoped_refptr base/memory/ref_counted.h:250 (net_unittests+0x0000020a8208)
    #13 ~scoped_refptr base/memory/ref_counted.h:248 (net_unittests+0x0000020a8208)
    #14 base::internal::CallbackBase::~CallbackBase() base/callback_internal.cc:35 (net_unittests+0x0000020a8208)
    #15 ~Callback base/callback_forward.h:11 (net_unittests+0x0000020d1daa)
    #16 ~Callback base/callback_forward.h:11 (net_unittests+0x0000020d1daa)
    #17 base::PendingTask::~PendingTask() base/pending_task.cc:38 (net_unittests+0x0000020d1daa)
    #18 base::(anonymous namespace)::WorkerThread::ThreadMain() base/threading/worker_pool_posix.cc:106 (net_unittests+0x0000020f8c6e)
    #19 base::(anonymous namespace)::ThreadFunc(void*) base/threading/platform_thread_posix.cc:80 (net_unittests+0x0000020ece89)

Original comment by gli...@google.com on 11 Jun 2013 at 10:25

GoogleCodeExporter commented 9 years ago
Should be fixed by r184112.
Please verify.

Original comment by dvyu...@google.com on 17 Jun 2013 at 8:01

GoogleCodeExporter commented 9 years ago
Works for me, thanks!

==================
WARNING: ThreadSanitizer: data race (pid=13374)
  Read of size 4 at 0x7d1800004e10 by thread T2: 
    #0 _M_rep /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/basic_string.h:187 (net_unittests+0x000001f0a318)
    #1 _M_leak /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/basic_string.h:311 (net_unittests+0x000001f0a318)
    #2 IsSeparator /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/basic_string.h:841 (net_unittests+0x000001f0a318)
    #3 base::FilePath::StripTrailingSeparatorsInternal() base/files/file_path.cc:1246 (net_unittests+0x000001f0a318)
    #4 base::FilePath::DirName() const base/files/file_path.cc:307 (net_unittests+0x000001f09832)
    #5 (anonymous namespace)::WriteToDiskInternal(base::FilePath const&, scoped_ptr<Pickle, base::DefaultDeleter<Pickle> >, base::TimeTicks const&, bool) net/disk_cache/simple/simple_index_file.cc:44 (net_unittests+0x000001c1fbd5)
    #6 Run base/bind_internal.h:355 (net_unittests+0x000001c21e26)
    #7 MakeItSo base/bind_internal.h:957 (net_unittests+0x000001c21e26)
    #8 base::internal::Invoker<4, base::internal::BindState<base::internal::RunnableAdapter<void (*)(base::FilePath const&, scoped_ptr<Pickle, base::DefaultDeleter<Pickle> >, base::TimeTicks const&, bool)>, void (base::FilePath const&, scoped_ptr<Pickle, base::DefaultDeleter<Pickle> >, base::TimeTicks const&, bool), void (base::FilePath, base::internal::PassedWrapper<scoped_ptr<Pickle, base::DefaultDeleter<Pickle> > >, base::TimeTicks, bool)>, void (base::FilePath const&, scoped_ptr<Pickle, base::DefaultDeleter<Pickle> >, base::TimeTicks const&, bool)>::Run(base::internal::BindStateBase*) base/bind_internal.h:1568 (net_unittests+0x000001c21e26)
    #9 Run base/callback.h:396 (net_unittests+0x000001f19db1)
    #10 base::MessageLoop::RunTask(base::PendingTask const&) base/message_loop/message_loop.cc:484 (net_unittests+0x000001f19db1)
    #11 base::MessageLoop::DeferOrRunPendingTask(base::PendingTask const&) base/message_loop/message_loop.cc:496 (net_unittests+0x000001f1a197)
    #12 base::MessageLoop::DoWork() base/message_loop/message_loop.cc:688 (net_unittests+0x000001f1a6f9)
    #13 base::MessagePumpLibevent::Run(base::MessagePump::Delegate*) base/message_pump_libevent.cc:235 (net_unittests+0x000001efbbf3)
    #14 base::MessageLoop::RunInternal() base/message_loop/message_loop.cc:441 (net_unittests+0x000001f19470)
    #15 base::MessageLoop::RunHandler() base/message_loop/message_loop.cc:414 (net_unittests+0x000001f19329)
    #16 base::RunLoop::Run() base/run_loop.cc:45 (net_unittests+0x000001f320a2)
    #17 base::MessageLoop::Run() base/message_loop/message_loop.cc:321 (net_unittests+0x000001f18765)
    #18 base::Thread::Run(base::MessageLoop*) base/threading/thread.cc:158 (net_unittests+0x000001f4b219)
    #19 base::Thread::ThreadMain() base/threading/thread.cc:203 (net_unittests+0x000001f4b3bd)
    #20 base::(anonymous namespace)::ThreadFunc(void*) base/threading/platform_thread_posix.cc:80 (net_unittests+0x000001f440b9)

  Previous atomic write of size 4 at 0x7d1800004e10 by main thread:
    #0 __tsan_atomic32_fetch_add /usr/local/google/asan/llvm/projects/compiler-rt/lib/tsan/rtl/tsan_interface_atomic.cc:465 (net_unittests+0x00000023e918)
    #1 __exchange_and_add_dispatch /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/ext/atomicity.h:80:9 (net_unittests+0x000001f08acd)
    #2 _M_rep /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/basic_string.h:240 (net_unittests+0x000001f08acd)
    #3 ~basic_string /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/basic_string.h:534 (net_unittests+0x000001f08acd)
    #4 ~basic_string /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/basic_string.h:534 (net_unittests+0x000001f08acd)
    #5 base::FilePath::~FilePath() base/files/file_path.cc:184 (net_unittests+0x000001f08acd)
    #6 disk_cache::SimpleIndexFile::~SimpleIndexFile() net/disk_cache/simple/simple_index_file.cc:116 (net_unittests+0x000001c1dbb0)
    #7 disk_cache::SimpleIndexFile::~SimpleIndexFile() net/disk_cache/simple/simple_index_file.cc:116 (net_unittests+0x000001c1db69)
    #8 operator() base/memory/scoped_ptr.h:137 (net_unittests+0x000001c17c78)
    #9 ~scoped_ptr_impl base/memory/scoped_ptr.h:220 (net_unittests+0x000001c17c78)
    #10 ~scoped_ptr_impl base/memory/scoped_ptr.h:216 (net_unittests+0x000001c17c78)
    #11 ~scoped_ptr base/memory/scoped_ptr.h:310 (net_unittests+0x000001c17c78)
    #12 ~list base/memory/scoped_ptr.h:310 (net_unittests+0x000001c17c78)
    #13 disk_cache::SimpleIndex::~SimpleIndex() net/disk_cache/simple/simple_index.cc:122 (net_unittests+0x000001c17c78)
    #14 disk_cache::SimpleIndex::~SimpleIndex() net/disk_cache/simple/simple_index.cc:114 (net_unittests+0x000001c17b19)
    #15 operator() base/memory/scoped_ptr.h:137 (net_unittests+0x000001c07275)
    #16 ~scoped_ptr_impl base/memory/scoped_ptr.h:220 (net_unittests+0x000001c07275)
    #17 ~scoped_ptr_impl base/memory/scoped_ptr.h:216 (net_unittests+0x000001c07275)
    #18 ~scoped_ptr base/memory/scoped_ptr.h:310 (net_unittests+0x000001c07275)
    #19 ~hash_map base/memory/scoped_ptr.h:310 (net_unittests+0x000001c07275)
    #20 disk_cache::SimpleBackendImpl::~SimpleBackendImpl() net/disk_cache/simple/simple_backend_impl.cc:179 (net_unittests+0x000001c07275)
    #21 disk_cache::SimpleBackendImpl::~SimpleBackendImpl() net/disk_cache/simple/simple_backend_impl.cc:177 (net_unittests+0x000001c07199)
    #22 DiskCacheTestWithCache::TearDown() net/disk_cache/disk_cache_test_base.cc:231 (net_unittests+0x000001608f6b)
    #23 void testing::internal::HandleExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) testing/gtest/src/gtest.cc:2051 (net_unittests+0x0000015d902e)
    #24 testing::Test::Run() testing/gtest/src/gtest.cc:2075 (net_unittests+0x0000015d8f0e)
    #25 testing::TestInfo::Run() testing/gtest/src/gtest.cc:2244 (net_unittests+0x0000015da016)
    #26 testing::TestCase::Run() testing/gtest/src/gtest.cc:2351 (net_unittests+0x0000015da7d8)
    #27 testing::internal::UnitTestImpl::RunAllTests() testing/gtest/src/gtest.cc:4177 (net_unittests+0x0000015e1eb7)
    #28 impl testing/gtest/src/gtest.cc:2051 (net_unittests+0x0000015e183a)
    #29 testing::UnitTest::Run() testing/gtest/src/gtest.cc:3810 (net_unittests+0x0000015e183a)
    #30 base::TestSuite::Run() base/test/test_suite.cc:167 (net_unittests+0x0000015f5370)
    #31 main net/test/run_all_unittests.cc:52 (net_unittests+0x000001411cc9)

  Location is heap block of size 93 at 0x7d1800004e00 allocated by main thread:
    #0 operator new(unsigned long) /usr/local/google/asan/llvm/projects/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc:497 (net_unittests+0x000000218244)
    #1 <null> <null>:0 (libstdc++.so.6+0x00000009ea88)
    #2 base::FilePath::AppendASCII(base::BasicStringPiece<std::string> const&) const base/files/file_path.cc:505 (net_unittests+0x000001f0ae7b)
    #3 disk_cache::SimpleIndexFile::SimpleIndexFile(base::SingleThreadTaskRunner*, base::TaskRunner*, base::FilePath const&) net/disk_cache/simple/simple_index_file.cc:114 (net_unittests+0x000001c1db35)
    #4 disk_cache::SimpleBackendImpl::Init(base::Callback<void (int)> const&) net/disk_cache/simple/simple_backend_impl.cc:189 (net_unittests+0x000001c07507)
    #5 DiskCacheTestWithCache::CreateBackend(unsigned int, base::Thread*) net/disk_cache/disk_cache_test_base.cc:278 (net_unittests+0x000001606c88)
    #6 DiskCacheTestWithCache::InitDiskCache() net/disk_cache/disk_cache_test_base.cc:263 (net_unittests+0x000001605c5f)
    #7 DiskCacheTestWithCache::InitCache() net/disk_cache/disk_cache_test_base.cc:75 (net_unittests+0x000001604fbd)
    #8 DiskCacheEntryTest_SimpleCacheSizeAtCreate_Test::TestBody() net/disk_cache/entry_unittest.cc:2361 (net_unittests+0x0000006b8296)
    #9 void testing::internal::HandleExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) testing/gtest/src/gtest.cc:2051 (net_unittests+0x0000015d902e)
    #10 testing::Test::Run() testing/gtest/src/gtest.cc:2067 (net_unittests+0x0000015d8e90)
    #11 testing::TestInfo::Run() testing/gtest/src/gtest.cc:2244 (net_unittests+0x0000015da016)
    #12 testing::TestCase::Run() testing/gtest/src/gtest.cc:2351 (net_unittests+0x0000015da7d8)
    #13 testing::internal::UnitTestImpl::RunAllTests() testing/gtest/src/gtest.cc:4177 (net_unittests+0x0000015e1eb7)
    #14 impl testing/gtest/src/gtest.cc:2051 (net_unittests+0x0000015e183a)
    #15 testing::UnitTest::Run() testing/gtest/src/gtest.cc:3810 (net_unittests+0x0000015e183a)
    #16 base::TestSuite::Run() base/test/test_suite.cc:167 (net_unittests+0x0000015f5370)

Original comment by gli...@chromium.org on 19 Jun 2013 at 8:09