45 #include "libmesh/libmesh_config.h" 46 #include "libmesh/print_trace.h" 47 #include "libmesh/libmesh.h" 49 #ifdef LIBMESH_HAVE_UNISTD_H 50 #include <sys/types.h> 54 #ifdef LIBMESH_HAVE_PROCESS_H 63 #ifndef LIBMESH_HAVE_MKSTEMP 67 #if defined(LIBMESH_HAVE_GLIBC_BACKTRACE) 79 #if defined(LIBMESH_HAVE_GLIBC_BACKTRACE) 80 std::string process_trace(
const char *
name)
82 std::string fullname =
name;
83 std::string saved_begin, saved_end;
84 size_t namestart, nameend;
92 namestart = fullname.find(
"0x");
93 if (namestart != std::string::npos)
95 namestart = fullname.find(
' ', namestart) + 1;
96 saved_begin = fullname.substr(0, namestart);
100 nameend = fullname.find(
'+');
101 if (nameend == std::string::npos ||
102 nameend <= namestart)
103 nameend = fullname.size();
107 saved_end = fullname.substr(nameend, fullname.length());
110 namestart = fullname.find(
'(');
111 if (namestart == std::string::npos)
115 nameend = fullname.find(
'+');
116 if (nameend == std::string::npos ||
117 nameend <= namestart)
121 std::string type_name = fullname.substr(namestart, nameend - namestart);
134 bool gdb_backtrace(std::ostream & out_stream)
136 #ifdef LIBMESH_GDB_COMMAND 143 char temp_file[] =
"temp_print_trace.XXXXXX";
153 auto this_pid = getpid();
159 std::string gdb_command =
162 std::ostringstream command;
163 command << gdb_command
166 <<
" -batch -ex bt -ex detach 2>/dev/null 1>" 168 exit_status = std::system(command.str().c_str());
172 std::cerr <<
"Unable to run gdb" << std::endl;
180 std::ifstream fin(temp_file);
181 if (fin && (fin.peek() != std::ifstream::traits_type::eof()) && (exit_status == 0))
182 out_stream << fin.rdbuf();
188 std::remove(temp_file);
209 bool gdb_worked =
false;
213 if ((std::string(LIBMESH_GDB_COMMAND) != std::string(
"no") &&
216 gdb_worked = gdb_backtrace(out_stream);
221 #if defined(LIBMESH_HAVE_GLIBC_BACKTRACE) 224 void * addresses[40];
227 int size = backtrace(addresses, 40);
228 strings = backtrace_symbols(addresses, size);
229 out_stream <<
"Stack frames: " << size << std::endl;
230 for (
int i = 0; i < size; i++)
231 out_stream << i <<
": " << process_trace(strings[i]) << std::endl;
242 #ifdef LIBMESH_ENABLE_TRACEFILES 243 std::stringstream outname;
245 std::ofstream traceout(outname.str().c_str(), std::ofstream::app);
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
The libMesh namespace provides an interface to certain functionality in the library.
void write_traceout()
Writes a stack trace to a uniquely named file if –enable-tracefiles has been set by configure...
T command_line_value(const std::string &, T)
std::string demangle(const char *name)
Mostly system independent demangler.
void print_trace(std::ostream &out_stream=std::cerr)
Print a stack trace (for code compiled with gcc)
processor_id_type global_processor_id()
bool on_command_line(std::string arg)