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