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:
parent
5a0016ccbd
commit
ba7cb82ab3
4 changed files with 88 additions and 8 deletions
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue