Skip to content

Commit ef1e371

Browse files
Merge pull request #79 from Ashatta/core_dump
Core dump
2 parents b6e4ed8 + 80fe5fd commit ef1e371

File tree

6 files changed

+72
-1
lines changed

6 files changed

+72
-1
lines changed

trikGui/main.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
#include "backgroundWidget.h"
3333
#include <QsLog.h>
3434

35+
#include <trikKernel/coreDumping.h>
36+
3537
using namespace trikGui;
3638

3739
void printUsage() {
@@ -110,6 +112,8 @@ int main(int argc, char *argv[])
110112
startDirPath += "/";
111113
}
112114

115+
trikKernel::coreDumping::initCoreDumping(startDirPath);
116+
113117
#ifdef Q_WS_QWS
114118
QWSServer * const server = QWSServer::instance();
115119
if (server) {
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#pragma once
2+
3+
#include <QtCore/QString>
4+
5+
namespace trikKernel {
6+
7+
namespace coreDumping {
8+
void initCoreDumping(QString const &dumpDir);
9+
}
10+
}

trikKernel/src/coreDumping.cpp

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#include "coreDumping.h"
2+
3+
#include <QtCore/QDir>
4+
5+
#include <sys/resource.h>
6+
#include <signal.h>
7+
8+
void (*oldHandler)(int);
9+
QString dumpDirPath = "/home/root/trik";
10+
11+
void dumpHandler(int signal)
12+
{
13+
QDir::setCurrent(dumpDirPath);
14+
oldHandler(signal);
15+
}
16+
17+
void initSignals()
18+
{
19+
QList<int> const signalsList({ SIGQUIT, SIGILL, SIGABRT, SIGFPE, SIGSEGV, SIGBUS, SIGSYS, SIGTRAP, SIGXCPU, SIGXFSZ
20+
, SIGIOT});
21+
22+
struct sigaction oldAction;
23+
sigaction(SIGSEGV, nullptr, &oldAction);
24+
oldHandler = oldAction.sa_handler;
25+
26+
struct sigaction action;
27+
action.sa_handler = dumpHandler;
28+
sigemptyset(&action.sa_mask);
29+
action.sa_flags = 0;
30+
31+
for (int signal : signalsList) {
32+
sigaddset(&action.sa_mask, signal);
33+
sigaction(signal, &action, nullptr);
34+
}
35+
}
36+
37+
void setCoreLimits()
38+
{
39+
rlimit core_limits;
40+
core_limits.rlim_cur = core_limits.rlim_max = RLIM_INFINITY;
41+
setrlimit(RLIMIT_CORE, &core_limits);
42+
}
43+
44+
void trikKernel::coreDumping::initCoreDumping(QString const &dumpDir)
45+
{
46+
dumpDirPath = dumpDir;
47+
initSignals();
48+
setCoreLimits();
49+
}

trikKernel/trikKernel.pro

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,15 @@ HEADERS += \
2424
$$PWD/include/trikKernel/debug.h \
2525
$$PWD/include/trikKernel/fileUtils.h \
2626
$$PWD/include/trikKernel/trikServer.h \
27-
$$PWD/include/trikKernel/version.h \
27+
$$PWD/include/trikKernel/coreDumping.h \
28+
$$PWD/include/trikKernel/version.h
2829

2930
SOURCES += \
3031
$$PWD/src/connection.cpp \
3132
$$PWD/src/debug.cpp \
3233
$$PWD/src/fileUtils.cpp \
3334
$$PWD/src/trikServer.cpp \
35+
$$PWD/src/coreDumping.cpp
3436

3537
TEMPLATE = lib
3638

trikRun/main.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <QtCore/QDir>
2727

2828
#include <trikKernel/fileUtils.h>
29+
#include <trikKernel/coreDumping.h>
2930
#include <trikControl/brick.h>
3031
#include <trikScriptRunner/trikScriptRunner.h>
3132

@@ -76,6 +77,8 @@ int main(int argc, char *argv[])
7677
startDirPath += "/";
7778
}
7879

80+
trikKernel::coreDumping::initCoreDumping(startDirPath);
81+
7982
#ifdef Q_WS_QWS
8083
QWSServer * const server = QWSServer::instance();
8184
if (server) {

trikServer/main.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
#include <trikCommunicator/trikCommunicator.h>
2929
#include <trikControl/brick.h>
30+
#include <trikKernel/coreDumping.h>
3031

3132
#include <QsLog.h>
3233

@@ -70,6 +71,8 @@ int main(int argc, char *argv[])
7071
startDirPath += "/";
7172
}
7273

74+
trikKernel::coreDumping::initCoreDumping(startDirPath);
75+
7376
#ifdef Q_WS_QWS
7477
QWSServer * const server = QWSServer::instance();
7578
if (server) {

0 commit comments

Comments
 (0)