0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-09-27 19:28:52 +02:00

librb: Add backtrace support and trace on assertions.

This commit is contained in:
Jason Volk 2016-06-28 15:45:24 -07:00
parent 5a0016ccbd
commit ba7cb82ab3
4 changed files with 88 additions and 8 deletions

View file

@ -104,7 +104,7 @@ AC_TYPE_UID_T
dnl Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS([crypt.h unistd.h sys/socket.h sys/stat.h sys/time.h time.h netinet/in.h netinet/tcp.h arpa/inet.h errno.h sys/uio.h spawn.h sys/poll.h sys/epoll.h sys/select.h sys/devpoll.h sys/event.h port.h signal.h sys/signalfd.h sys/timerfd.h])
AC_CHECK_HEADERS([crypt.h unistd.h sys/socket.h sys/stat.h sys/time.h time.h netinet/in.h netinet/tcp.h arpa/inet.h errno.h sys/uio.h spawn.h sys/poll.h sys/epoll.h sys/select.h sys/devpoll.h sys/event.h port.h signal.h sys/signalfd.h sys/timerfd.h execinfo.h])
AC_HEADER_TIME
dnl Networking Functions

View file

@ -146,13 +146,16 @@ char *rb_strerror(int error);
#endif
#ifdef __GNUC__
#define slrb_assert(expr) do \
if(rb_unlikely(!(expr))) { \
rb_lib_log( \
"file: %s line: %d (%s): Assertion failed: (%s)", \
__FILE__, __LINE__, __PRETTY_FUNCTION__, #expr); \
} \
while(0)
#define slrb_assert(expr) do \
{ \
if(rb_unlikely(!(expr))) \
{ \
rb_lib_log("file: %s line: %d (%s): Assertion failed: (%s)", \
__FILE__, __LINE__, __PRETTY_FUNCTION__, #expr); \
rb_backtrace_log_symbols(); \
} \
} \
while(0)
#else
#define slrb_assert(expr) do \
if(rb_unlikely(!(expr))) { \
@ -264,6 +267,10 @@ pid_t rb_waitpid(pid_t pid, int *status, int options);
pid_t rb_getpid(void);
//unsigned int rb_geteuid(void);
void *const *rb_backtrace(int *len); // writes to and returns static vector (*len indicates element count)
const char *const *rb_backtrace_symbols(int *len); // translates rb_backtrace(), all static
void rb_backtrace_log_symbols(void); // rb_backtrace_symbols piped to rb_lib_log()
#include <rb_tools.h>
#include <rb_dlink.h>

View file

@ -1,6 +1,9 @@
make_and_lookup
make_and_lookup_ip
rb_accept_tcp
rb_backtrace
rb_backtrace_symbols
rb_backtrace_log_symbols
rb_base64_decode
rb_base64_encode
rb_basename

View file

@ -23,6 +23,11 @@
*/
#include <librb_config.h>
#ifdef HAVE_EXECINFO_H
#include <execinfo.h>
#endif
#include <rb_lib.h>
#include <commio-int.h>
#include <commio-ssl.h>
@ -423,3 +428,68 @@ rb_base64_decode(const unsigned char *str, int length, int *ret)
*ret = j;
return result;
}
void *bt_stack[64];
char bt_symbuf[64][256];
const char *bt_symbol[64];
#ifdef HAVE_EXECINFO_H
void *const *rb_backtrace(int *const usrlen)
{
int len = backtrace(bt_stack, 64);
if(usrlen) *usrlen = len;
return bt_stack;
}
#else
void *const *rb_backtrace(int *const usrlen)
{
if(usrlen) *usrlen = 0;
return bt_stack;
}
#endif
#ifdef HAVE_EXECINFO_H
const char *const *rb_backtrace_symbols(int *const usrlen)
{
int len;
void *const *const stack = rb_backtrace(&len);
char *const *const symbol = backtrace_symbols(stack, len);
if(!symbol)
len = 0;
if(usrlen)
*usrlen = len;
for(int i = 0; i < len; i++)
{
rb_strlcpy(bt_symbuf[i], symbol[i], sizeof(bt_symbuf[i]));
bt_symbol[i] = bt_symbuf[i];
}
free((char **)symbol);
return bt_symbol;
}
#else
const char *const *rb_backtrace_symbols(int *const usrlen)
{
if(usrlen) *usrlen = 0;
return bt_symbol;
}
#endif
#ifdef HAVE_EXECINFO_H
void rb_backtrace_log_symbols(void)
{
int len;
const char *const *const symbol = rb_backtrace_symbols(&len);
for(int i = 0; i < len; i++)
rb_lib_log("%2d: %s", i, symbol[i]);
}
#else
void rb_backtrace_log_symbols(void)
{
}
#endif