Skip to content

Commit 7f37858

Browse files
committed
Send all stacktrace output to the passed in ostream instead of cerr
1 parent 6ce06f5 commit 7f37858

File tree

4 files changed

+46
-6
lines changed

4 files changed

+46
-6
lines changed

CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,7 @@ set( fc_sources
284284
src/network/url.cpp
285285
src/compress/smaz.cpp
286286
src/compress/zlib.cpp
287+
src/stacktrace.cpp
287288
)
288289

289290
file( GLOB_RECURSE fc_headers ${CMAKE_CURRENT_SOURCE_DIR} *.hpp *.h )

src/stacktrace.cpp

+7-6
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ std::string run_command( const std::string& command )
5353
return "";
5454
}
5555

56-
void print_stacktrace_linenums( void** addrlist, int addrlen )
56+
void print_stacktrace_linenums(std::ostream& out, void** addrlist, int addrlen )
5757
{
5858
if( addrlen == 0 )
5959
return;
@@ -63,6 +63,7 @@ void print_stacktrace_linenums( void** addrlist, int addrlen )
6363
if( result < 0 )
6464
{
6565
std::cerr << "print_stacktrace_linenums() failed, could not read PID" << std::endl;
66+
out << "print_stacktrace_linenums() failed, could not read PID" << std::endl;
6667
return;
6768
}
6869
else
@@ -75,10 +76,10 @@ void print_stacktrace_linenums( void** addrlist, int addrlen )
7576
for( int i=0; i<addrlen; i++ )
7677
ss_cmd << " " << std::setfill('0') << std::setw(16) << std::hex << std::noshowbase << uint64_t(addrlist[i]);
7778
std::string cmd = ss_cmd.str();
78-
std::cerr << "executing command:" << std::endl;
79-
std::cerr << cmd << std::endl;
79+
out << "executing command:" << '\n'
80+
<< cmd << '\n';
8081
std::string output = run_command(cmd);
81-
std::cerr << output << std::endl;
82+
out << output << '\n';
8283
}
8384

8485
void print_stacktrace(std::ostream& out, unsigned int max_frames /* = 63 */, void* caller_overwrite_hack /* = nullptr */ )
@@ -163,7 +164,7 @@ void print_stacktrace(std::ostream& out, unsigned int max_frames /* = 63 */, voi
163164
}
164165
}
165166

166-
print_stacktrace_linenums(addrlist, addrlen);
167+
print_stacktrace_linenums(out, addrlist, addrlen);
167168

168169
free(funcname);
169170
free(symbollist);
@@ -197,7 +198,7 @@ void segfault_handler(int sig_num, siginfo_t * info, void * ucontext)
197198
#endif
198199

199200
// avoids compiler warning
200-
//FC_UNUSED(caller_address);
201+
(void)caller_address;
201202

202203
print_stacktrace( std::cerr, 128, nullptr );
203204
std::exit(EXIT_FAILURE);

tests/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ add_executable( all_tests all_tests.cpp
5757
bloom_test.cpp
5858
real128_test.cpp
5959
serialization_test.cpp
60+
stacktrace_test.cpp
6061
time_test.cpp
6162
utf8_test.cpp
6263
)

tests/stacktrace_test.cpp

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#include <boost/test/unit_test.hpp>
2+
3+
#include <fc/stacktrace.hpp>
4+
#include <fc/thread/thread.hpp>
5+
6+
BOOST_AUTO_TEST_SUITE(fc_stacktrace)
7+
8+
BOOST_AUTO_TEST_CASE(stacktrace_test)
9+
{
10+
// print the stack trace
11+
//print_stacktrace(std::ostream& out, unsigned int max_frames = 63, void* caller_overwrite_hack = nullptr)
12+
std::stringstream ss;
13+
fc::print_stacktrace(ss);
14+
std::string results = ss.str();
15+
BOOST_CHECK(!results.empty());
16+
BOOST_CHECK(results.find("fc::print_stacktrace") != std::string::npos);
17+
//std::cout << results << '\n';
18+
}
19+
20+
BOOST_AUTO_TEST_CASE(threaded_stacktrace_test)
21+
{
22+
fc::thread test_thread("a_thread");
23+
std::string results = test_thread.async(
24+
[] ()->std::string {
25+
// cause a pause
26+
for(int i = 0; i < 10000; i++);
27+
std::stringstream ss;
28+
fc::print_stacktrace(ss);
29+
return ss.str();
30+
}
31+
).wait();
32+
BOOST_CHECK(!results.empty());
33+
BOOST_CHECK(results.find("fc::print_stacktrace") != std::string::npos);
34+
//std::cout << results << '\n';
35+
}
36+
37+
BOOST_AUTO_TEST_SUITE_END()

0 commit comments

Comments
 (0)