+ std::string gdb_run_file= create_tmpfile(_exectuble_name);
+ std::fstream file_stream;
+ file_stream.open(gdb_run_file.c_str(), std::fstream::out | std::fstream::trunc);
+
+ _gdb_filename= create_tmpfile(_exectuble_name);
+ file_stream
+ << "set logging redirect on" << std::endl
+ << "set logging file " << _gdb_filename << std::endl
+ << "set logging overwrite on" << std::endl
+ << "set logging on" << std::endl
+ << "set environment LIBTEST_IN_GDB=1" << std::endl
+ << "run " << arguments() << std::endl
+ << "thread apply all bt" << std::endl
+ << "quit" << std::endl;
+
+ fatal_assert(file_stream.good());
+ file_stream.close();
+
+ if (_use_libtool)
+ {
+ // libtool --mode=execute gdb -f -x binary
+ char *argv[]= {
+ const_cast<char *>(libtool()),
+ const_cast<char *>("--mode=execute"),
+ const_cast<char *>("gdb"),
+ const_cast<char *>("-batch"),
+ const_cast<char *>("-f"),
+ const_cast<char *>("-x"),
+ const_cast<char *>(gdb_run_file.c_str()),
+ const_cast<char *>(_exectuble_with_path.c_str()),
+ 0};
+
+ spawn_ret= posix_spawnp(&_pid, libtool(), &file_actions, NULL, argv, NULL);
+ }
+ else
+ {
+ // gdb binary
+ char *argv[]= {
+ const_cast<char *>("gdb"),
+ const_cast<char *>("-batch"),
+ const_cast<char *>("-f"),
+ const_cast<char *>("-x"),
+ const_cast<char *>(gdb_run_file.c_str()),
+ const_cast<char *>(_exectuble_with_path.c_str()),
+ 0};
+ spawn_ret= posix_spawnp(&_pid, "gdb", &file_actions, NULL, argv, NULL);
+ }
+ }
+ else
+ {
+ if (_use_libtool)
+ {
+ spawn_ret= posix_spawn(&_pid, built_argv[0], &file_actions, NULL, built_argv, NULL);
+ }
+ else
+ {
+ spawn_ret= posix_spawnp(&_pid, built_argv[0], &file_actions, NULL, built_argv, NULL);
+ }
+ }
+
+ posix_spawn_file_actions_destroy(&file_actions);
+
+ stdin_fd.close(Application::Pipe::READ);
+ stdout_fd.close(Application::Pipe::WRITE);
+ stderr_fd.close(Application::Pipe::WRITE);
+
+ if (spawn_ret)
+ {
+ return Application::INVALID;
+ }
+
+ return Application::SUCCESS;
+}
+
+Application::error_t Application::wait()
+{
+ if (_pid == -1)
+ {
+ Error << "wait() got an invalid pid_t";
+ return Application::INVALID;
+ }
+
+ {
+ ssize_t read_length;
+ char buffer[1024]= { 0 };
+ bool bail= false;
+ while (((read_length= ::read(stdout_fd.fd()[0], buffer, sizeof(buffer))) != 0) or bail)
+ {
+ if (read_length == -1)
+ {
+ switch(errno)
+ {
+ case EAGAIN:
+ continue;
+
+ default:
+ Error << strerror(errno);
+ bail= true;
+ }
+ }
+ _stdout_buffer.reserve(read_length +1);
+ for (size_t x= 0; x < read_length; x++)
+ {
+ _stdout_buffer.push_back(buffer[x]);
+ }
+ // @todo Suck up all output code here
+ }
+ }
+
+ {
+ ssize_t read_length;
+ char buffer[1024]= { 0 };
+ bool bail= false;
+ while (((read_length= ::read(stderr_fd.fd()[0], buffer, sizeof(buffer))) != 0) or bail)
+ {
+ if (read_length == -1)
+ {
+ switch(errno)
+ {
+ case EAGAIN:
+ continue;
+
+ default:
+ Error << strerror(errno);
+ bail= true;
+ }
+ }
+ _stderr_buffer.reserve(read_length +1);
+ for (size_t x= 0; x < read_length; x++)
+ {
+ _stderr_buffer.push_back(buffer[x]);
+ }
+ // @todo Suck up all errput code here
+ }