]> git.tdb.fi Git - libs/core.git/blob - source/debug/debugapi.cpp
Add utilities to interface with an attached debugger
[libs/core.git] / source / debug / debugapi.cpp
1 #ifndef _WIN32
2 #include <signal.h>
3 #endif
4 #include <msp/fs/utils.h>
5 #include <msp/io/file.h>
6 #include <msp/strings/format.h>
7 #include <msp/strings/utils.h>
8 #include "debugapi.h"
9
10 using namespace std;
11
12 namespace Msp {
13 namespace Debug {
14
15 DebuggerType check_debugger(bool force_recheck)
16 {
17         static DebuggerType debugger = NONE;
18         static bool checked = false;
19
20         if(!checked || force_recheck)
21         {
22                 checked = true;
23
24 #ifndef _WIN32
25                 unsigned tracer_pid = 0;
26                 IO::BufferedFile status("/proc/self/status");
27                 string line;
28                 while(status.getline(line))
29                         if(!line.compare(0, 10, "TracerPid:"))
30                         {
31                                 tracer_pid = lexical_cast<unsigned>(strip(line.substr(10)));
32                                 break;
33                         }
34
35                 if(tracer_pid)
36                 {
37                         FS::Path tracer_cmd = FS::readlink(format("/proc/%d/exe", tracer_pid));
38                         if(FS::basename(tracer_cmd)=="gdb")
39                                 debugger = GDB;
40                         else
41                                 debugger = UNKNOWN;
42                 }
43 #endif
44         }
45
46         return debugger;
47 }
48
49 void debug_break()
50 {
51 #ifdef _WIN32
52         __debugbreak();
53 #else
54         raise(SIGTRAP);
55 #endif
56 }
57
58 } // namespace Debug
59 } // namespace Msp