C语言程序调用栈:backtrace+backtrace_symbols+backtrace_symbols_fd

 

#ifndef __CRTL_BITS_ASSERT_H
#define __CRTL_BITS_ASSERT_H 1

#include <errno.h>
#include <string.h>

#include "crtl/bits/crtl_assert_backtrace.h"

#define CRTL_SYS_ERROR  strerror(errno)

/* backtrace */
#define crtl_assert_backtrace(fp) __crtl_assert_backtrace(fp)

/* macro */
#define crtl_assert(exp) crtl_assert_fp(stderr, exp)
#define crtl_assert_fp(fp, exp) __crtl_assert(fp, !!(exp), 0, __FILE__, __func__, __LINE__)


/* crypto API */
void __crtl_assert(FILE *fp, int exp, int switch_on_assert, const char *__file, const char *__func, const int __line);


#endif /*<__CRTL_BITS_ASSERT_H>*/



#include "crtl/crtl_assert.h"
#include "crtl/crtl_lock.h"



/* crypto API */
#define __assert_prefix     "assert."

void __crtl_assert(FILE *fp, int exp, int switch_on_assert, const char *__file, const char *__func, const int __line)
{
    if(!fp)
    {
        fp = stdout;
    }
    crtl_fd_lock(fileno(fp));
    if(!exp)
    {        
#define __ASSERT_NOTE_FMT       "Assert [File:%s %s:%d]"    
#define __ASSERT_NOTE_CONTEXT   __file, __func, __line
#define __ASSERT_NOTE_PREFIX    "\033[1;31m"
#define __ASSERT_NOTE_SUBFIX    "\033[0m"

        fprintf(fp, __ASSERT_NOTE_FMT"\n", __ASSERT_NOTE_CONTEXT);
        fprintf(fp, "%s"__ASSERT_NOTE_FMT"%s\n",__ASSERT_NOTE_PREFIX, __ASSERT_NOTE_CONTEXT,__ASSERT_NOTE_SUBFIX);
        
        crtl_assert_backtrace(fp);

        fflush(fp);
    }

    crtl_fd_unlock(fileno(fp));

    if(switch_on_assert)
        assert(exp);
    
    return ;
}


backtrace

#ifndef __CRTL_BITS_ASSERT_BACKTRACE_H
#define __CRTL_BITS_ASSERT_BACKTRACE_H 1


#include <assert.h>
#include <execinfo.h>


#include "crtl/easy/attribute.h"
#include "crtl/easy/macro.h"
#include "crtl/crtl_log.h"


#define __CRTL_BACKTRACE_SIZE 1024

/* backtrace */
static inline void _unused __crtl_assert_backtrace(FILE *fp)
{
    if(fp == NULL)
    {
        fp = stderr;
    }
 
    void *__buffer[__CRTL_BACKTRACE_SIZE];
    unsigned long size = 0;
    char **__backtrace;
    int _unused i;
    
    size = backtrace (__buffer, __CRTL_BACKTRACE_SIZE);
    __backtrace = backtrace_symbols (__buffer, size);
    
    //FILE *__fp = fopen("core.121212", "w");
    //backtrace_symbols_fd (__buffer, size, fileno(fp));
    
    backtrace_symbols_fd (__buffer, size, fileno(fp));

    free(__backtrace);
    
    return;    
}


#endif /*<__CRTL_BITS_ASSERT_BACKTRACE_H>*/

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页