19 #include <QCoreApplication>
21 #include "crashingthread.h"
23 #include <sys/types.h>
27 #if defined(USE_GOOGLE_BREAKPAD)
28 #include "client/linux/handler/exception_handler.h"
29 #include "client/linux/crash_generation/crash_generation_server.h"
30 #include "common/linux/eintr_wrapper.h"
31 #include "common/linux/linux_libc_support.h"
32 #include "third_party/lss/linux_syscall_support.h"
34 using namespace google_breakpad;
35 using google_breakpad::CrashGenerationServer;
37 static int server_fd = -1, client_fd = -1;
42 #if defined(USE_GOOGLE_BREAKPAD)
58 void setupSignalHandlers()
60 new ExceptionHandler(MinidumpDescriptor(
"/opt/minidumps"),
71 if (!CrashGenerationServer::CreateReportChannel(&server_fd, &client_fd))
73 qDebug() <<
"Client: CreateReportChannel failed!\n";
80 bool start_server(
const char* server_path_str)
82 qDebug() <<
"Client: entering startServer\n";
88 qDebug() <<
"Client: pipe failed!\n";
92 pid_t server_pid = fork();
95 qDebug() <<
"Client: in child after fork\n";
97 char pipe_fd_string[8];
98 sprintf(pipe_fd_string,
"%d", fds[1]);
100 char server_fd_string[8];
101 sprintf(server_fd_string,
"%d", server_fd);
103 char*
const argv[] = {strdup(server_path_str),
109 execv(server_path_str, argv);
110 qDebug() <<
"Client: execv failed\n";
116 memset(&pfd, 0,
sizeof(pfd));
118 pfd.events = POLLIN | POLLERR;
120 int r = HANDLE_EINTR(poll(&pfd, 1, 5000));
121 if (r != 1 || (pfd.revents & POLLIN) != POLLIN)
123 qDebug() <<
"Client: poll failed?\n";
124 if (pfd.revents & POLLERR)
126 qDebug() <<
"Client: POLLERR\n";
128 if (pfd.revents & POLLHUP)
130 qDebug() <<
"Client: POLLHUP\n";
132 if (pfd.revents & POLLNVAL)
134 qDebug() <<
"Client: POLLNVAL\n";
139 qDebug() <<
"Client: Poll result: " << r <<
"\n";
141 read(fds[0], &junk,
sizeof(junk));
144 qDebug() <<
"Client: exiting startServer\n";
150 void signalHandler(
int signum)
154 #define ONCASE(x) case x: qDebug() << "Caught signal" << #x; break
163 default: qDebug() <<
"Caught unknown signal %d" << signum;
break;
165 QCoreApplication *coreApp = QCoreApplication::instance();
166 if( NULL != coreApp )
167 coreApp->exit( signum );
169 signal(signum, SIG_DFL);
171 kill(getpid(), signum);
174 void setupSingalHandlers()
176 signal(SIGINT, signalHandler);
177 signal(SIGQUIT, signalHandler);
178 signal(SIGTERM, signalHandler);
179 signal(SIGILL, signalHandler);
180 signal(SIGABRT, signalHandler);
181 signal(SIGFPE, signalHandler);
182 signal(SIGSEGV, signalHandler);
188 int main(
int argc,
char *argv[])
190 QCoreApplication app(argc, argv);
192 qDebug() <<
"Client: started\n";
194 #if defined(USE_GOOGLE_BREAKPAD)
197 qDebug() <<
"Client: Pipe setup failed!\n";
203 QString app_path = app.applicationDirPath()+
"/server-pc";
204 if (!start_server(app_path.toLocal8Bit().data()))
206 qDebug() <<
"Client: Server did not start!\n";
211 setupSignalHandlers();
214 const int NUMBER_OF_THREADS = 50;
216 QList<CrashingThread*> threads;
217 for (
int i = 1; i <= NUMBER_OF_THREADS; ++i)
220 thread->setThreadNumber(i);