The FreeRADIUS server  $Id: 15bac2a4c627c01d1aa2047687b3418955ac7f00 $
Macros | Functions | Variables
debug.c File Reference

Functions to help with debugging. More...

#include <freeradius-devel/util/debug.h>
#include <freeradius-devel/util/hash.h>
#include <freeradius-devel/util/strerror.h>
#include <freeradius-devel/util/syserror.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/wait.h>
+ Include dependency graph for debug.c:

Go to the source code of this file.

Macros

#define TALLOC_REPORT_MAX_DEPTH   20
 

Functions

static int _disable_null_tracking (UNUSED bool *p)
 
bool _fr_assert_fail (char const *file, int line, char const *expr, char const *msg,...)
 A soft assertion which triggers the fault handler in debug builds. More...
 
void _fr_assert_fatal (char const *file, int line, char const *expr, char const *msg,...)
 A fatal assertion which triggers the fault handler in debug builds or exits. More...
 
NEVER_RETURNS void _fr_exit (char const *file, int line, int status, bool now)
 Exit possibly printing a message about why we're exiting. More...
 
static void _fr_talloc_fault (char const *reason)
 Callback executed on fatal talloc error. More...
 
static void _fr_talloc_fault_simple (char const *reason)
 Callback executed on fatal talloc error. More...
 
static void _fr_talloc_log (char const *msg)
 Wrapper to pass talloc log output to our fr_fault_log function. More...
 
static int _panic_on_free (UNUSED char *foo)
 
void backtrace_print (UNUSED fr_fring_t *fring, UNUSED void *obj)
 
fr_bt_marker_tfr_backtrace_attach (UNUSED fr_fring_t **fring, UNUSED TALLOC_CTX *obj)
 
void fr_debug_break (bool always)
 Break in debugger (if were running under a debugger) More...
 
void fr_debug_state_store (void)
 Should be run before using setuid or setgid to get useful results. More...
 
char const * fr_debug_state_to_msg (fr_debug_state_t state)
 Return current value of debug_state. More...
 
void fr_disable_null_tracking_on_free (TALLOC_CTX *ctx)
 Disable the null tracking context when a talloc chunk is freed. More...
 
NEVER_RETURNS void fr_fault (int sig)
 Prints a simple backtrace (if execinfo is available) and calls panic_action if set. More...
 
static int fr_fault_check_permissions (void)
 Check to see if panic_action file is world writable. More...
 
void fr_fault_log (char const *msg,...)
 Log output to the fr_fault_log_fd. More...
 
void fr_fault_log_hex (uint8_t const *data, size_t data_len)
 Print data as a hex block. More...
 
void fr_fault_set_cb (fr_fault_cb_t func)
 Set a callback to be called before fr_fault() More...
 
void fr_fault_set_log_fd (int fd)
 Set a file descriptor to log memory reports to. More...
 
int fr_fault_setup (TALLOC_CTX *ctx, char const *cmd, char const *program)
 Registers signal handlers to execute panic_action on fatal signal. More...
 
int fr_get_debug_state (void)
 
int fr_get_lsan_state (void)
 
static int fr_get_pr_dumpable_flag (void)
 Get the processes dumpable flag. More...
 
static uint32_t fr_hash_struct (void const *ptr, size_t size, size_t offset)
 
int fr_log_talloc_report (TALLOC_CTX const *ctx)
 Generate a talloc memory report for a context and print to stderr/stdout. More...
 
void fr_panic_on_free (TALLOC_CTX *ctx)
 Insert memory into the context of another talloc memory chunk which causes a panic when freed. More...
 
int fr_reset_dumpable (void)
 Reset dumpable state to previously configured value. More...
 
int fr_set_dumpable (bool allow_core_dumps)
 Enable or disable core dumps. More...
 
int fr_set_dumpable_init (void)
 Get the current maximum for core files. More...
 
static int fr_set_pr_dumpable_flag (UNUSED bool dumpable)
 Set the dumpable flag, also controls whether processes can PATTACH. More...
 
void fr_sign_struct (void *ptr, size_t size, size_t offset)
 
void fr_talloc_fault_setup (void)
 Register talloc fault handlers. More...
 
void fr_verify_struct (void const *ptr, size_t size, size_t offset)
 
void fr_verify_struct_member (void const *ptr, size_t len, uint32_t *signature)
 

Variables

static bool dump_core
 Whether we should drop a core on fatal signals. More...
 
fr_debug_state_t fr_debug_state = DEBUGGER_STATE_UNKNOWN
 Whether we're attached to by a debugger. More...
 
static int fr_fault_log_fd = STDERR_FILENO
 Where to write debug output. More...
 
static char panic_action [512]
 The command to execute when panicking. More...
 
static fr_fault_cb_t panic_cb = NULL
 Callback to execute whilst panicking, before the panic_action. More...
 
static TALLOC_CTX * talloc_autofree_ctx
 

Detailed Description

Functions to help with debugging.

Definition in file debug.c.

Macro Definition Documentation

◆ TALLOC_REPORT_MAX_DEPTH

#define TALLOC_REPORT_MAX_DEPTH   20

Function Documentation

◆ _disable_null_tracking()

static int _disable_null_tracking ( UNUSED bool p)
static

Definition at line 1171 of file debug.c.

+ Here is the caller graph for this function:

◆ _fr_assert_fail()

bool _fr_assert_fail ( char const *  file,
int  line,
char const *  expr,
char const *  msg,
  ... 
)

A soft assertion which triggers the fault handler in debug builds.

Parameters
[in]filethe assertion failed in.
[in]lineof the assertion in the file.
[in]exprthat was evaluated.
[in]msgMessage to print (may be NULL).
[in]...Arguments for msg string.
Returns
the value of cond.

Definition at line 1422 of file debug.c.

+ Here is the call graph for this function:

◆ _fr_assert_fatal()

void _fr_assert_fatal ( char const *  file,
int  line,
char const *  expr,
char const *  msg,
  ... 
)

A fatal assertion which triggers the fault handler in debug builds or exits.

Parameters
[in]filethe assertion failed in.
[in]lineof the assertion in the file.
[in]exprthat was evaluated.
[in]msgMessage to print (may be NULL).
[in]...Arguments for msg string.

Definition at line 1458 of file debug.c.

+ Here is the call graph for this function:

◆ _fr_exit()

NEVER_RETURNS void _fr_exit ( char const *  file,
int  line,
int  status,
bool  now 
)

Exit possibly printing a message about why we're exiting.

Note
Use the fr_exit(status) macro instead of calling this function directly.
Parameters
[in]filewhere fr_exit() was called.
[in]linewhere fr_exit() was called.
[in]statuswe're exiting with.
[in]nowExit immediately.

Definition at line 1490 of file debug.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ _fr_talloc_fault()

static void _fr_talloc_fault ( char const *  reason)
static

Callback executed on fatal talloc error.

Translates a talloc abort into a fr_fault call. Mostly to work around issues with some debuggers not being able to attach after a SIGABRT has been raised.

Parameters
reasonstring provided by talloc.

Definition at line 1099 of file debug.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ _fr_talloc_fault_simple()

static void _fr_talloc_fault_simple ( char const *  reason)
static

Callback executed on fatal talloc error.

This is the simple version which mostly behaves the same way as the default one, and will not call panic_action.

Parameters
reasonstring provided by talloc.

Definition at line 1073 of file debug.c.

+ Here is the caller graph for this function:

◆ _fr_talloc_log()

static void _fr_talloc_log ( char const *  msg)
static

Wrapper to pass talloc log output to our fr_fault_log function.

Definition at line 1111 of file debug.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ _panic_on_free()

static int _panic_on_free ( UNUSED char *  foo)
static

Definition at line 684 of file debug.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ backtrace_print()

void backtrace_print ( UNUSED fr_fring_t fring,
UNUSED void *  obj 
)

Definition at line 673 of file debug.c.

◆ fr_backtrace_attach()

fr_bt_marker_t* fr_backtrace_attach ( UNUSED fr_fring_t **  fring,
UNUSED TALLOC_CTX *  obj 
)

Definition at line 677 of file debug.c.

◆ fr_debug_break()

void fr_debug_break ( bool  always)

Break in debugger (if were running under a debugger)

If the server is running under a debugger this will raise a SIGTRAP which will pause the running process.

If the server is not running under debugger then this will do nothing.

Definition at line 553 of file debug.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fr_debug_state_store()

void fr_debug_state_store ( void  )

Should be run before using setuid or setgid to get useful results.

Note
sets the fr_debug_state global.

Definition at line 504 of file debug.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fr_debug_state_to_msg()

char const* fr_debug_state_to_msg ( fr_debug_state_t  state)

Return current value of debug_state.

Parameters
stateto translate into a humanly readable value.
Returns
humanly readable version of debug state.

Definition at line 524 of file debug.c.

+ Here is the caller graph for this function:

◆ fr_disable_null_tracking_on_free()

void fr_disable_null_tracking_on_free ( TALLOC_CTX *  ctx)

Disable the null tracking context when a talloc chunk is freed.

Definition at line 1180 of file debug.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fr_fault()

NEVER_RETURNS void fr_fault ( int  sig)

Prints a simple backtrace (if execinfo is available) and calls panic_action if set.

Parameters
sigcaught

Definition at line 929 of file debug.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fr_fault_check_permissions()

static int fr_fault_check_permissions ( void  )
static

Check to see if panic_action file is world writable.

Returns
  • 0 if file is OK.
  • -1 if the file is world writable.

Definition at line 884 of file debug.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fr_fault_log()

void fr_fault_log ( char const *  msg,
  ... 
)

Log output to the fr_fault_log_fd.

We used to support a user defined callback, which was set to a radlog function. Unfortunately, when logging to syslog, syslog would alloc memory which would result in a deadlock if fr_fault was triggered from within a allocation call.

Now we just write directly to the FD.

Definition at line 1374 of file debug.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fr_fault_log_hex()

void fr_fault_log_hex ( uint8_t const *  data,
size_t  data_len 
)

Print data as a hex block.

Definition at line 1388 of file debug.c.

+ Here is the call graph for this function:

◆ fr_fault_set_cb()

void fr_fault_set_cb ( fr_fault_cb_t  func)

Set a callback to be called before fr_fault()

Parameters
functo execute. If callback returns < 0 fr_fault will exit before running panic_action code.

Definition at line 1360 of file debug.c.

+ Here is the caller graph for this function:

◆ fr_fault_set_log_fd()

void fr_fault_set_log_fd ( int  fd)

Set a file descriptor to log memory reports to.

Parameters
fdto write output to.

Definition at line 1408 of file debug.c.

+ Here is the caller graph for this function:

◆ fr_fault_setup()

int fr_fault_setup ( TALLOC_CTX *  ctx,
char const *  cmd,
char const *  program 
)

Registers signal handlers to execute panic_action on fatal signal.

May be called multiple time to change the panic_action/program.

Parameters
[in]ctxto allocate autofreeable resources in.
[in]cmdto execute on fault. If present p will be substituted for the parent PID before the command is executed, and e will be substituted for the currently running program.
programName of program currently executing (argv[0]).
Returns
  • 0 on success.
  • -1 on failure.

Definition at line 1215 of file debug.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fr_get_debug_state()

int fr_get_debug_state ( void  )

Definition at line 492 of file debug.c.

+ Here is the caller graph for this function:

◆ fr_get_lsan_state()

int fr_get_lsan_state ( void  )

Definition at line 261 of file debug.c.

+ Here is the caller graph for this function:

◆ fr_get_pr_dumpable_flag()

static int fr_get_pr_dumpable_flag ( void  )
static

Get the processes dumpable flag.

Definition at line 778 of file debug.c.

+ Here is the caller graph for this function:

◆ fr_hash_struct()

static uint32_t fr_hash_struct ( void const *  ptr,
size_t  size,
size_t  offset 
)
static

Definition at line 1521 of file debug.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fr_log_talloc_report()

int fr_log_talloc_report ( TALLOC_CTX const *  ctx)

Generate a talloc memory report for a context and print to stderr/stdout.

Parameters
ctxto generate a report for, may be NULL in which case the root context is used.

Definition at line 1120 of file debug.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fr_panic_on_free()

void fr_panic_on_free ( TALLOC_CTX *  ctx)

Insert memory into the context of another talloc memory chunk which causes a panic when freed.

Parameters
ctxTALLOC_CTX to monitor for frees.

Definition at line 695 of file debug.c.

+ Here is the call graph for this function:

◆ fr_reset_dumpable()

int fr_reset_dumpable ( void  )

Reset dumpable state to previously configured value.

Needed after suid up/down

Returns
  • 0 on success.
  • -1 on failure.

Definition at line 873 of file debug.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fr_set_dumpable()

int fr_set_dumpable ( bool  allow_core_dumps)

Enable or disable core dumps.

Parameters
allow_core_dumpswhether to enable or disable core dumps.

Definition at line 805 of file debug.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fr_set_dumpable_init()

int fr_set_dumpable_init ( void  )

Get the current maximum for core files.

Do this before anything else so as to ensure it's properly initialized.

Definition at line 790 of file debug.c.

+ Here is the call graph for this function:

◆ fr_set_pr_dumpable_flag()

static int fr_set_pr_dumpable_flag ( UNUSED bool  dumpable)
static

Set the dumpable flag, also controls whether processes can PATTACH.

Parameters
dumpablewhether we should allow core dumping

Definition at line 732 of file debug.c.

+ Here is the caller graph for this function:

◆ fr_sign_struct()

void fr_sign_struct ( void *  ptr,
size_t  size,
size_t  offset 
)

Definition at line 1537 of file debug.c.

+ Here is the call graph for this function:

◆ fr_talloc_fault_setup()

void fr_talloc_fault_setup ( void  )

Register talloc fault handlers.

Just register the fault handlers we need to make talloc produce useful debugging output.

Definition at line 1196 of file debug.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fr_verify_struct()

void fr_verify_struct ( void const *  ptr,
size_t  size,
size_t  offset 
)

Definition at line 1542 of file debug.c.

+ Here is the call graph for this function:

◆ fr_verify_struct_member()

void fr_verify_struct_member ( void const *  ptr,
size_t  len,
uint32_t signature 
)

Definition at line 1551 of file debug.c.

+ Here is the call graph for this function:

Variable Documentation

◆ dump_core

bool dump_core
static

Whether we should drop a core on fatal signals.

Definition at line 100 of file debug.c.

◆ fr_debug_state

Whether we're attached to by a debugger.

Definition at line 104 of file debug.c.

◆ fr_fault_log_fd

int fr_fault_log_fd = STDERR_FILENO
static

Where to write debug output.

Definition at line 102 of file debug.c.

◆ panic_action

char panic_action[512]
static

The command to execute when panicking.

Definition at line 96 of file debug.c.

◆ panic_cb

fr_fault_cb_t panic_cb = NULL
static

Callback to execute whilst panicking, before the panic_action.

Definition at line 97 of file debug.c.

◆ talloc_autofree_ctx

TALLOC_CTX* talloc_autofree_ctx
static

Definition at line 110 of file debug.c.