backtrace on *nix and Windows
最近读OceanBase的源码,摘录一段错误诊断比较有用的代码:
//#define OCEAN_BTREE_CHECK
#ifdef OCEAN_BTREE_CHECK
#include <execinfo.h>
#define OCEAN_BTREE_CHECK_FALSE(cond, format, args...) if ((cond)) \
{ \
char _buffer_stack_[256]; \
{ \
void *array[10]; \
int i, idx=0, n = backtrace(array, 10); \
for (i = 0; i < n; i++) { \
idx += snprintf(idx+_buffer_stack_, 25, "%p,", array[i]); \
} \
} \
TBSYS_LOG(ERROR, "%s" format, _buffer_stack_, ## args); \
}
#define OCEAN_BTREE_CHECK_TRUE(cond, format, args...) \
OCEAN_BTREE_CHECK_FALSE(!(cond), format, ## args)
#else
#define OCEAN_BTREE_CHECK_TRUE(cond, format, ...)
#define OCEAN_BTREE_CHECK_FALSE(cond, format, ...)
#endif