Skip to content

Instantly share code, notes, and snippets.

@haikusw
Last active August 29, 2015 14:02
Show Gist options
  • Save haikusw/43840bcf195deb23e208 to your computer and use it in GitHub Desktop.
Save haikusw/43840bcf195deb23e208 to your computer and use it in GitHub Desktop.
drop into the debugger on exception IFF being debugged
//
// amibeingdebugged.c
// HSILibs
//
// based on: https://developer.apple.com/library/mac/qa/qa1361/_index.html
//
#include <assert.h>
#include <stdbool.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/sysctl.h>
#include <signal.h>
#include "amibeingdebugged.h"
// Returns true if the current process is being debugged (either
// running under the debugger or has a debugger attached post facto).
bool AmIBeingDebugged( void )
{
int junk;
int mib[4];
struct kinfo_proc info;
size_t size;
// Initialize the flags so that, if sysctl fails for some bizarre
// reason, we get a predictable result.
info.kp_proc.p_flag = 0;
// Initialize mib, which tells sysctl the info we want, in this case
// we're looking for information about a specific process ID.
mib[0] = CTL_KERN;
mib[1] = KERN_PROC;
mib[2] = KERN_PROC_PID;
mib[3] = getpid();
// Call sysctl.
size = sizeof(info);
junk = sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0);
assert(junk == 0);
// We're being debugged if the P_TRACED flag is set.
return ( (info.kp_proc.p_flag & P_TRACED) != 0 );
}
#if DEBUG
void dRaiseSIGINT( void )
{
if ( AmIBeingDebugged() )
raise( SIGINT );
}
#endif
//
// amibeingdebugged.h
// HSILibs
//
// Copyright (c) 2013 Haiku Software, Inc. All rights reserved.
//
#ifndef HSI_amibeingdebugged_h
#define HSI_amibeingdebugged_h
extern bool AmIBeingDebugged( void );
#if defined(DEBUG) && (DEBUG == 1)
extern void dRaiseSIGINT( void );
#else
#define dRaiseSIGINT( void )
#endif
#if defined(DEBUG) && (DEBUG == 1)
#define dASSERT_RAISE( cond, objCformatStr, var_args1... ) do { if (!(cond)) { NSLog( objCformatStr, ## var_args1 ); dRaiseSIGINT(); } } while (0)
#else
#define dASSERT_RAISE( cond, objCformatStr, var_args1... )
#endif
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment