[SERVER-10431] Add segfault handler to unit test framework Created: 05/Aug/13  Updated: 11/Jul/16  Resolved: 06/Aug/14

Status: Closed
Project: Core Server
Component/s: Testing Infrastructure
Affects Version/s: None
Fix Version/s: 2.7.5

Type: Improvement Priority: Major - P3
Reporter: Tad Marshall Assignee: Andy Schwerin
Resolution: Done Votes: 1
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
Related
Backwards Compatibility: Fully Compatible
Participants:
Linked BF Score: 0

 Description   

Unit tests that cause segfaults (access violations) exit silently (or almost silently) with a non-zero exit code. They should instead print a message indicating that a segfault has occurred, print a stack trace, and then exit.

Sample code:

    TEST_F(AllNodesDown, ReadFromPrimary) {
#if 1
        char* crash = reinterpret_cast<char*>(0x123);
        *crash = 'A';
#endif
        // ...
    }

Program output:

 4:05:01.15 C:\Visual Studio 2010 Projects\mongodev> build\win32\64\dd\mongo\dbclient_rs_test.exe
Mon Aug 05 04:05:43.286 going to run suite: AllNodesDown
Mon Aug 05 04:05:43.289          going to run test: ReadFromPrimary
 
 4:05:45.45 C:\Visual Studio 2010 Projects\mongodev> echo %ERRORLEVEL%
-1073741819

tad@Ubuntu-1204-x64 ~/mongo/mongodev (SERVER-8707-04)
$ build/linux2/64/dd/mongo/dbclient_rs_test 
Mon Aug  5 04:15:07.794 going to run suite: AllNodesDown
Mon Aug  5 04:15:07.801          going to run test: ReadFromPrimary
Segmentation fault (core dumped)
 
tad@Ubuntu-1204-x64 ~/mongo/mongodev (SERVER-8707-04)
$ echo $?
139



 Comments   
Comment by Githook User [ 06/Aug/14 ]

Author:

{u'username': u'andy10gen', u'name': u'Andy Schwerin', u'email': u'schwerin@mongodb.com'}

Message: SERVER-10431 Split synchronous signal handlers into new library; use them in unit tests.

With this change, unit tests that segfault or abort will correctly print stack traces.
Branch: master
https://github.com/mongodb/mongo/commit/eaac0152f37484f7e581be6fc1d838eb6001ddfb

Comment by Tad Marshall [ 06/Aug/13 ]

The above commit provides this feature for Windows. We still need it for all other platforms.

Comment by auto [ 06/Aug/13 ]

Author:

{u'username': u'tadmarshall', u'name': u'Tad Marshall', u'email': u'tad@10gen.com'}

Message: SERVER-10431 Add Windows unhandled exception filter to unit tests
Branch: master
https://github.com/mongodb/mongo/commit/85e79d7ad2db6fa0607957cac536d20a3738f6a5

Comment by Tad Marshall [ 05/Aug/13 ]

This is what you would see on Windows once this is implemented:

 4:05:55.82 C:\Visual Studio 2010 Projects\mongodev> build\win32\64\dd\mongo\dbclient_rs_test.exe
Mon Aug 05 04:33:02.447 going to run suite: AllNodesDown
Mon Aug 05 04:33:02.450          going to run test: ReadFromPrimary
Mon Aug 05 04:33:02.454 *** unhandled exception (access violation) at 0x00000001402EE6A0, terminating
Mon Aug 05 04:33:02.460 *** access violation was a write to 0x0000000000000123
Mon Aug 05 04:33:02.463 *** stack trace for unhandled exception:
Mon Aug 05 04:33:03.340 dbclient_rs_test.exe  ...\src\mongo\client\dbclient_rs_test.cpp(197)                       `anonymous namespace'::UnitTest__AllNodesDown__ReadFromPrimary::_doTest+0x50
Mon Aug 05 04:33:03.352 dbclient_rs_test.exe  ...\src\mongo\unittest\unittest.cpp(108)                             mongo::unittest::Test::run+0x48
Mon Aug 05 04:33:03.363 dbclient_rs_test.exe  ...\src\mongo\unittest\unittest.h(296)                               mongo::unittest::Suite::runTestObject<`anonymousnamespace'::UnitTest__AllNodesDown__ReadFromPrimary>+0x33
Mon Aug 05 04:33:03.377 dbclient_rs_test.exe  ...\src\third_party\boost\boost\function\function_template.hpp(113)  boost::detail::function::void_function_invoker0<void (__cdecl*)(void),void>::invoke+0x2f
Mon Aug 05 04:33:03.391 dbclient_rs_test.exe  ...\src\third_party\boost\boost\function\function_template.hpp(761)  boost::function0<void>::operator()+0x87
Mon Aug 05 04:33:03.402 dbclient_rs_test.exe  ...\src\mongo\unittest\unittest.h(194)                               mongo::unittest::TestHolder::run+0x2f
Mon Aug 05 04:33:03.411 dbclient_rs_test.exe  ...\src\mongo\unittest\unittest.cpp(164)                             mongo::unittest::Suite::run+0x74b
Mon Aug 05 04:33:03.419 dbclient_rs_test.exe  ...\src\mongo\unittest\unittest.cpp(228)                             mongo::unittest::Suite::run+0x498
Mon Aug 05 04:33:03.428 dbclient_rs_test.exe  ...\src\mongo\unittest\unittest_main.cpp(28)                         main+0xb7
Mon Aug 05 04:33:03.435 dbclient_rs_test.exe  f:\dd\vctools\crt_bld\self_64_amd64\crt\src\crt0.c(278)              __tmainCRTStartup+0xe2
Mon Aug 05 04:33:03.443 dbclient_rs_test.exe  f:\dd\vctools\crt_bld\self_64_amd64\crt\src\crt0.c(189)              mainCRTStartup+0xe
Mon Aug 05 04:33:03.451 kernel32.dll                                                                               BaseThreadInitThunk+0xd
Mon Aug 05 04:33:03.457
Mon Aug 05 04:33:03.459 writing minidump diagnostic file mongo.dmp
Mon Aug 05 04:33:03.489 *** immediate exit due to unhandled exception

Generated at Thu Feb 08 03:23:09 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.