|
@@ -0,0 +1,32 @@
|
|
|
|
|
+/* CC0 (Public domain) - see LICENSE file for details
|
|
|
|
|
+ *
|
|
|
|
|
+ * Idea for implementation thanks to stackoverflow.com:
|
|
|
|
|
+ * http://stackoverflow.com/questions/3596781/detect-if-gdb-is-running
|
|
|
|
|
+ */
|
|
|
|
|
+#include <ccan/breakpoint/breakpoint.h>
|
|
|
|
|
+
|
|
|
|
|
+bool breakpoint_initialized;
|
|
|
|
|
+bool breakpoint_under_debug;
|
|
|
|
|
+
|
|
|
|
|
+/* This doesn't get called if we're under GDB. */
|
|
|
|
|
+static void trap(int signum)
|
|
|
|
|
+{
|
|
|
|
|
+ breakpoint_initialized = true;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void breakpoint_init(void)
|
|
|
|
|
+{
|
|
|
|
|
+ struct sigaction old, new;
|
|
|
|
|
+
|
|
|
|
|
+ new.sa_handler = trap;
|
|
|
|
|
+ new.sa_flags = 0;
|
|
|
|
|
+ sigemptyset(&new.sa_mask);
|
|
|
|
|
+ sigaction(SIGTRAP, &new, &old);
|
|
|
|
|
+ kill(getpid(), SIGTRAP);
|
|
|
|
|
+ sigaction(SIGTRAP, &old, NULL);
|
|
|
|
|
+
|
|
|
|
|
+ if (!breakpoint_initialized) {
|
|
|
|
|
+ breakpoint_initialized = true;
|
|
|
|
|
+ breakpoint_under_debug = true;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|