Skip to content

Commit 86f40de

Browse files
authored
DPL: add ability to dump stacktrace on a signal (#5343)
Use libSegFault.so to dump the stacktrace and extra informations when one of the provided signals is raised. E.g. --stacktrace-on-signal segv
1 parent af1cea4 commit 86f40de

File tree

3 files changed

+28
-4
lines changed

3 files changed

+28
-4
lines changed

Framework/Core/COOKBOOK.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,16 @@ export O2DPLDEBUG='xterm -hold -e sudo gdb attach $O2DEBUGGEDPID &'
8080
Be sure to use single quotes to avoid direct expansion of O2DEBUGGEDPID variable.
8181
The `&` character add the end is needed to start gdb in a separate process.
8282

83+
### Dumping stacktraces on a signal
84+
85+
If you are on linux you can get stacktraces on a various signals via the:
86+
87+
```
88+
--stacktrace-on-signal "<signal> [<signal>..]"
89+
```
90+
91+
option, where `<signal>` can be: all, segv, bus, ill, abrt, fpe and sys.
92+
8393

8494
### Debug GUI
8595

Framework/Core/src/DeviceSpecHelpers.cxx

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1058,6 +1058,17 @@ void DeviceSpecHelpers::prepareArguments(bool defaultQuiet, bool defaultStopped,
10581058
split(environment, tmpEnv);
10591059
}
10601060

1061+
/// Add libSegFault to the stack if provided.
1062+
if (varmap.count("stacktrace-on-signal") && varmap["stacktrace-on-signal"].as<std::string>() != "none") {
1063+
char const* preload = getenv("LD_PRELOAD");
1064+
if (preload == nullptr) {
1065+
tmpEnv.push_back("LD_PRELOAD=libSegFault.so");
1066+
} else {
1067+
tmpEnv.push_back(fmt::format("LD_PRELOAD=\"{}:libSegFault.so\"", preload));
1068+
}
1069+
tmpEnv.push_back(fmt::format("SEGFAULT_SIGNALS=\"{}\"", varmap["stacktrace-on-signal"].as<std::string>()));
1070+
}
1071+
10611072
// options can be grouped per processor spec, the group is entered by
10621073
// the option created from the actual processor spec name
10631074
// if specified, the following string is interpreted as a sequence
@@ -1074,6 +1085,7 @@ void DeviceSpecHelpers::prepareArguments(bool defaultQuiet, bool defaultStopped,
10741085
realOdesc.add_options()("child-driver", bpo::value<std::string>());
10751086
realOdesc.add_options()("rate", bpo::value<std::string>());
10761087
realOdesc.add_options()("environment", bpo::value<std::string>());
1088+
realOdesc.add_options()("stacktrace-on-signal", bpo::value<std::string>());
10771089
realOdesc.add_options()("post-fork-command", bpo::value<std::string>());
10781090
realOdesc.add_options()("shm-segment-size", bpo::value<std::string>());
10791091
realOdesc.add_options()("shm-mlock-segment", bpo::value<std::string>());
@@ -1199,6 +1211,8 @@ boost::program_options::options_description DeviceSpecHelpers::getForwardedDevic
11991211
("shm-throw-bad-alloc", bpo::value<std::string>()->default_value("true"), "throw if insufficient shm memory") //
12001212
("shm-segment-id", bpo::value<std::string>()->default_value("0"), "shm segment id") //
12011213
("environment", bpo::value<std::string>(), "comma separated list of environment variables to set for the device") //
1214+
("stacktrace-on-signal", bpo::value<std::string>()->default_value("none"), //
1215+
"dump stacktrace on specified signal(s) (any of `all`, `segv`, `bus`, `ill`, `abrt`, `fpe`, `sys`.)") //
12021216
("post-fork-command", bpo::value<std::string>(), "post fork command to execute (e.g. numactl {pid}") //
12031217
("session", bpo::value<std::string>(), "unique label for the shared memory session") //
12041218
("configuration,cfg", bpo::value<std::string>(), "configuration connection string") //

Framework/Core/test/test_FrameworkDataFlowToDDS.cxx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,16 +99,16 @@ BOOST_AUTO_TEST_CASE(TestDDS)
9999
dumpDeviceSpec2DDS(ss, devices, executions);
100100
BOOST_CHECK_EQUAL(ss.str(), R"EXPECTED(<topology name="o2-dataflow">
101101
<decltask name="A">
102-
<exe reachable="true">foo --id A --control static --shm-monitor false --log-color false --color false --jobs 4 --severity info --shm-mlock-segment false --shm-segment-id 0 --shm-throw-bad-alloc true --shm-zero-segment false --session dpl_workflow-id --plugin-search-path $FAIRMQ_ROOT/lib --plugin dds</exe>
102+
<exe reachable="true">foo --id A --control static --shm-monitor false --log-color false --color false --jobs 4 --severity info --shm-mlock-segment false --shm-segment-id 0 --shm-throw-bad-alloc true --shm-zero-segment false --stacktrace-on-signal none --session dpl_workflow-id --plugin-search-path $FAIRMQ_ROOT/lib --plugin dds</exe>
103103
</decltask>
104104
<decltask name="B">
105-
<exe reachable="true">foo --id B --control static --shm-monitor false --log-color false --color false --jobs 4 --severity info --shm-mlock-segment false --shm-segment-id 0 --shm-throw-bad-alloc true --shm-zero-segment false --session dpl_workflow-id --plugin-search-path $FAIRMQ_ROOT/lib --plugin dds</exe>
105+
<exe reachable="true">foo --id B --control static --shm-monitor false --log-color false --color false --jobs 4 --severity info --shm-mlock-segment false --shm-segment-id 0 --shm-throw-bad-alloc true --shm-zero-segment false --stacktrace-on-signal none --session dpl_workflow-id --plugin-search-path $FAIRMQ_ROOT/lib --plugin dds</exe>
106106
</decltask>
107107
<decltask name="C">
108-
<exe reachable="true">foo --id C --control static --shm-monitor false --log-color false --color false --jobs 4 --severity info --shm-mlock-segment false --shm-segment-id 0 --shm-throw-bad-alloc true --shm-zero-segment false --session dpl_workflow-id --plugin-search-path $FAIRMQ_ROOT/lib --plugin dds</exe>
108+
<exe reachable="true">foo --id C --control static --shm-monitor false --log-color false --color false --jobs 4 --severity info --shm-mlock-segment false --shm-segment-id 0 --shm-throw-bad-alloc true --shm-zero-segment false --stacktrace-on-signal none --session dpl_workflow-id --plugin-search-path $FAIRMQ_ROOT/lib --plugin dds</exe>
109109
</decltask>
110110
<decltask name="D">
111-
<exe reachable="true">foo --id D --control static --shm-monitor false --log-color false --color false --jobs 4 --severity info --shm-mlock-segment false --shm-segment-id 0 --shm-throw-bad-alloc true --shm-zero-segment false --session dpl_workflow-id --plugin-search-path $FAIRMQ_ROOT/lib --plugin dds</exe>
111+
<exe reachable="true">foo --id D --control static --shm-monitor false --log-color false --color false --jobs 4 --severity info --shm-mlock-segment false --shm-segment-id 0 --shm-throw-bad-alloc true --shm-zero-segment false --stacktrace-on-signal none --session dpl_workflow-id --plugin-search-path $FAIRMQ_ROOT/lib --plugin dds</exe>
112112
</decltask>
113113
<declcollection name="DPL">
114114
<tasks>

0 commit comments

Comments
 (0)